added filter for unconnected devices
This commit is contained in:
@@ -4,14 +4,14 @@ from django.utils.translation import gettext as _
|
|||||||
|
|
||||||
from extras.models import Tag
|
from extras.models import Tag
|
||||||
from dcim.models import Device, Site, Region, DeviceRole, Location
|
from dcim.models import Device, Site, Region, DeviceRole, Location
|
||||||
from extras.forms import CustomFieldModelFilterForm
|
|
||||||
|
|
||||||
from utilities.forms import (TagFilterField, DynamicModelMultipleChoiceField, BootstrapMixin)
|
|
||||||
|
|
||||||
class DeviceFilterForm(CustomFieldModelFilterForm):
|
from utilities.forms import (TagFilterField, DynamicModelMultipleChoiceField, FilterForm)
|
||||||
|
|
||||||
|
class DeviceFilterForm(FilterForm):
|
||||||
model = Device
|
model = Device
|
||||||
field_groups = [
|
field_groups = [
|
||||||
['q'],
|
['q', 'hide_unconnected'],
|
||||||
['region_id', 'site_id', 'location_id'],
|
['region_id', 'site_id', 'location_id'],
|
||||||
['device_role_id'],
|
['device_role_id'],
|
||||||
['tag'],
|
['tag'],
|
||||||
@@ -45,4 +45,9 @@ class DeviceFilterForm(CustomFieldModelFilterForm):
|
|||||||
label=_('Location')
|
label=_('Location')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
hide_unconnected = forms.BooleanField(
|
||||||
|
label=_("Hide Unconnected"),
|
||||||
|
required=False,
|
||||||
|
initial=False)
|
||||||
|
|
||||||
tag = TagFilterField(model)
|
tag = TagFilterField(model)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import distutils
|
|||||||
from dcim.models import Device, Cable, DeviceRole, DeviceType
|
from dcim.models import Device, Cable, DeviceRole, DeviceType
|
||||||
from extras.models import Tag
|
from extras.models import Tag
|
||||||
|
|
||||||
def get_topology_data(queryset):
|
def get_topology_data(queryset, hide_unconnected):
|
||||||
nodes = []
|
nodes = []
|
||||||
nodes_ids = []
|
nodes_ids = []
|
||||||
edges = []
|
edges = []
|
||||||
@@ -25,13 +25,17 @@ def get_topology_data(queryset):
|
|||||||
if not queryset:
|
if not queryset:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
device_ids = [d.id for d in queryset]
|
||||||
|
|
||||||
for qs_device in queryset:
|
for qs_device in queryset:
|
||||||
device_has_connections = False
|
device_has_connections = False
|
||||||
links_from_device = Cable.objects.filter(Q(_termination_a_device_id=qs_device.id) | Q(_termination_b_device_id=qs_device.id) )
|
|
||||||
for link_from in links_from_device:
|
links_device = Cable.objects.filter(Q(_termination_a_device_id=qs_device.id) | Q(_termination_b_device_id=qs_device.id) )
|
||||||
device_has_connections = True
|
for link_from in links_device:
|
||||||
if link_from.termination_a_type.name != "circuit termination" and link_from.termination_b_type.name != "circuit termination":
|
if link_from.termination_a_type.name != "circuit termination" and link_from.termination_b_type.name != "circuit termination":
|
||||||
if link_from.id not in cable_ids:
|
if link_from.id not in cable_ids:
|
||||||
|
if link_from.termination_a.device.id in device_ids and link_from.termination_b.device.id in device_ids:
|
||||||
|
device_has_connections = True
|
||||||
cable_ids.append(link_from.id)
|
cable_ids.append(link_from.id)
|
||||||
edge_ids += 1
|
edge_ids += 1
|
||||||
cable_a_dev_name = link_from.termination_a.device.name
|
cable_a_dev_name = link_from.termination_a.device.name
|
||||||
@@ -55,6 +59,9 @@ def get_topology_data(queryset):
|
|||||||
if link_from.color != "":
|
if link_from.color != "":
|
||||||
edge["color"] = "#" + link_from.color
|
edge["color"] = "#" + link_from.color
|
||||||
edges.append(edge)
|
edges.append(edge)
|
||||||
|
else:
|
||||||
|
if link_from.termination_a.device.id in device_ids and link_from.termination_b.device.id in device_ids:
|
||||||
|
device_has_connections = True
|
||||||
else:
|
else:
|
||||||
if settings.PLUGINS_CONFIG["netbox_topology_views"]["enable_circuit_terminations"]:
|
if settings.PLUGINS_CONFIG["netbox_topology_views"]["enable_circuit_terminations"]:
|
||||||
if link_from.termination_a.circuit.id not in circuit_ids:
|
if link_from.termination_a.circuit.id not in circuit_ids:
|
||||||
@@ -105,6 +112,7 @@ def get_topology_data(queryset):
|
|||||||
edges.append(edge)
|
edges.append(edge)
|
||||||
|
|
||||||
if qs_device.id not in nodes_ids:
|
if qs_device.id not in nodes_ids:
|
||||||
|
if hide_unconnected == None or (hide_unconnected is True and device_has_connections is True):
|
||||||
nodes_ids.append(qs_device.id)
|
nodes_ids.append(qs_device.id)
|
||||||
|
|
||||||
dev_name = qs_device.name
|
dev_name = qs_device.name
|
||||||
@@ -165,11 +173,16 @@ class TopologyHomeView(PermissionRequiredMixin, View):
|
|||||||
topo_data = None
|
topo_data = None
|
||||||
|
|
||||||
if request.GET:
|
if request.GET:
|
||||||
|
hide_unconnected = None
|
||||||
|
if 'hide_unconnected' in request.GET:
|
||||||
|
if request.GET["hide_unconnected"] == "on" :
|
||||||
|
hide_unconnected = True
|
||||||
|
|
||||||
if 'draw_init' in request.GET:
|
if 'draw_init' in request.GET:
|
||||||
if bool(distutils.util.strtobool(request.GET["draw_init"])):
|
if bool(distutils.util.strtobool(request.GET["draw_init"])):
|
||||||
topo_data = get_topology_data(self.queryset)
|
topo_data = get_topology_data(self.queryset, hide_unconnected)
|
||||||
else:
|
else:
|
||||||
topo_data = get_topology_data(self.queryset)
|
topo_data = get_topology_data(self.queryset, hide_unconnected)
|
||||||
else:
|
else:
|
||||||
preselected_device_roles = settings.PLUGINS_CONFIG["netbox_topology_views"]["preselected_device_roles"]
|
preselected_device_roles = settings.PLUGINS_CONFIG["netbox_topology_views"]["preselected_device_roles"]
|
||||||
preselected_tags = settings.PLUGINS_CONFIG["netbox_topology_views"]["preselected_tags"]
|
preselected_tags = settings.PLUGINS_CONFIG["netbox_topology_views"]["preselected_tags"]
|
||||||
@@ -182,7 +195,6 @@ class TopologyHomeView(PermissionRequiredMixin, View):
|
|||||||
q.setlist('tag', list(q_tags))
|
q.setlist('tag', list(q_tags))
|
||||||
q['draw_init'] = settings.PLUGINS_CONFIG["netbox_topology_views"]["draw_default_layout"]
|
q['draw_init'] = settings.PLUGINS_CONFIG["netbox_topology_views"]["draw_default_layout"]
|
||||||
query_string = q.urlencode()
|
query_string = q.urlencode()
|
||||||
print(query_string)
|
|
||||||
return HttpResponseRedirect(request.path + "?" + query_string)
|
return HttpResponseRedirect(request.path + "?" + query_string)
|
||||||
|
|
||||||
return render(request, 'netbox_topology_views/index.html' , {
|
return render(request, 'netbox_topology_views/index.html' , {
|
||||||
|
|||||||
Reference in New Issue
Block a user