Hide unconnected (#61)

* #57 hide unconnected devices
This commit is contained in:
mattieserver
2021-05-01 18:34:50 +02:00
committed by GitHub
parent 195ac47542
commit 5f498f9ce2
9 changed files with 138 additions and 115 deletions
+4 -2
View File
@@ -1,6 +1,7 @@
# Setup Dev # Setup Dev
+ install docker + install docker
+ install docker compose + install docker compose
+ install npm
+ clone netbox repo + clone netbox repo
+ clone netbox_topology_views repo + clone netbox_topology_views repo
+ create venv: `/usr/bin/python3 -m venv venv` + create venv: `/usr/bin/python3 -m venv venv`
@@ -8,9 +9,10 @@
+ install deps: `pip3 install -r requirements.txt` + install deps: `pip3 install -r requirements.txt`
+ install build tools: `python3 -m pip install --upgrade build setuptools wheel` + install build tools: `python3 -m pip install --upgrade build setuptools wheel`
# Build # Build
+ in the root of the netbox_topology_views folder run `python3 -m build` + build the package: `python3 setup.py develop`
+ install the package: `python3 -m pip install ../netbox-topology-views/dist/netbox_topology_views-X.Y.Z-py3-none-any.whl` where X,Y & Z are the version + build the resources `npm run resources`
# Test # Test
+ copy configuration.py from dev_setup to the netbox/netbox/ folder + copy configuration.py from dev_setup to the netbox/netbox/ folder
+1 -1
View File
@@ -4,7 +4,7 @@ class TopologyViewsConfig(PluginConfig):
name = 'netbox_topology_views' name = 'netbox_topology_views'
verbose_name = 'Topology views' verbose_name = 'Topology views'
description = 'An plugin to render topology maps' description = 'An plugin to render topology maps'
version = '0.5.0' version = '0.5.1'
author = 'Mattijs Vanhaverbeke' author = 'Mattijs Vanhaverbeke'
author_email = 'author@example.com' author_email = 'author@example.com'
base_url = 'topology-views' base_url = 'topology-views'
+117 -104
View File
@@ -115,6 +115,13 @@ class SearchViewSet(ReadOnlyModelViewSet):
if regions == []: if regions == []:
regions = None regions = None
hide_unconnected = request.query_params.get('hide_unconnected', None)
if hide_unconnected == "":
hide_unconnected = None
print(hide_unconnected)
if hide_unconnected == 'false':
print("ok")
devices = self._filter(sites, devicerole, name, tags, regions) devices = self._filter(sites, devicerole, name, tags, regions)
nodes = [] nodes = []
@@ -124,41 +131,21 @@ class SearchViewSet(ReadOnlyModelViewSet):
circuit_ids = [] circuit_ids = []
for device in devices: for device in devices:
cables = device.get_cables() cables = device.get_cables()
for cable in cables: if cables.exists():
if cable.termination_a_type.name != "circuit termination" and cable.termination_b_type.name != "circuit termination": device_has_connections = True
if cable.id not in cable_ids: for cable in cables:
if cable.termination_a_type.name not in ignore_cable_type and cable.termination_b_type.name not in ignore_cable_type: if cable.termination_a_type.name != "circuit termination" and cable.termination_b_type.name != "circuit termination":
cable_ids.append(cable.id) if cable.id not in cable_ids:
edge_ids += 1 if cable.termination_a_type.name not in ignore_cable_type and cable.termination_b_type.name not in ignore_cable_type:
cable_ids.append(cable.id)
cable_a_dev_name = cable.termination_a.device.name
if cable_a_dev_name is None:
cable_a_dev_name = "device A name unknown"
cable_a_name = cable.termination_a.name
if cable_a_name is None:
cable_a_name = "cable A name unknown"
cable_b_dev_name = cable.termination_b.device.name
if cable_b_dev_name is None:
cable_b_dev_name = "device B name unknown"
cable_b_name = cable.termination_b.name
if cable_b_name is None:
cable_b_name = "cable B name unknown"
edge = {}
edge["id"] = edge_ids
edge["from"] = cable.termination_a.device.id
edge["to"] = cable.termination_b.device.id
edge["title"] = "Cable between <br> " + cable_a_dev_name + " [" + cable_a_name + "]<br>" + cable_b_dev_name + " [" + cable_b_name + "]"
if cable.color != "":
edge["color"] = "#" + cable.color
edges.append(edge)
else:
if cable.termination_a_type.name == "circuit termination":
if settings.PLUGINS_CONFIG["netbox_topology_views"]["enable_circuit_terminations"]:
if cable.termination_a.circuit.id not in circuit_ids:
circuit_ids.append(cable.termination_a.circuit.id)
edge_ids += 1 edge_ids += 1
cable_a_dev_name = cable.termination_a.device.name
if cable_a_dev_name is None:
cable_a_dev_name = "device A name unknown"
cable_a_name = cable.termination_a.name
if cable_a_name is None:
cable_a_name = "cable A name unknown"
cable_b_dev_name = cable.termination_b.device.name cable_b_dev_name = cable.termination_b.device.name
if cable_b_dev_name is None: if cable_b_dev_name is None:
cable_b_dev_name = "device B name unknown" cable_b_dev_name = "device B name unknown"
@@ -168,86 +155,112 @@ class SearchViewSet(ReadOnlyModelViewSet):
edge = {} edge = {}
edge["id"] = edge_ids edge["id"] = edge_ids
edge["from"] = cable.termination_a.device.id
edge["to"] = cable.termination_b.device.id edge["to"] = cable.termination_b.device.id
edge["dashes"] = True edge["title"] = "Cable between <br> " + cable_a_dev_name + " [" + cable_a_name + "]<br>" + cable_b_dev_name + " [" + cable_b_name + "]"
title = "" if cable.color != "":
edge["color"] = "#" + cable.color
edges.append(edge)
else:
if cable.termination_a_type.name == "circuit termination":
if settings.PLUGINS_CONFIG["netbox_topology_views"]["enable_circuit_terminations"]:
if cable.termination_a.circuit.id not in circuit_ids:
circuit_ids.append(cable.termination_a.circuit.id)
edge_ids += 1
title += "Circuit provider: " + cable.termination_a.circuit.provider.name + "<br>" cable_b_dev_name = cable.termination_b.device.name
title += "Termination between <br>" if cable_b_dev_name is None:
title += cable_b_dev_name + " [" + cable_b_name + "]<br>" cable_b_dev_name = "device B name unknown"
# To Many if's cable_b_name = cable.termination_b.name
if cable.termination_a.circuit.termination_a is not None: if cable_b_name is None:
if cable.termination_a.circuit.termination_a.cable is not None: cable_b_name = "cable B name unknown"
if cable.termination_a.circuit.termination_a.cable.id != cable.id:
if cable.termination_a.circuit.termination_a.cable.termination_b is not None:
if cable.termination_a.circuit.termination_a.cable.termination_b.device is not None:
edge["from"] = cable.termination_a.circuit.termination_a.cable.termination_b.device.id
cable_a_dev_name = cable.termination_a.circuit.termination_a.cable.termination_b.device.name edge = {}
if cable_a_dev_name is None: edge["id"] = edge_ids
cable_a_dev_name = "device B name unknown" edge["to"] = cable.termination_b.device.id
cable_b_name = cable.termination_a.circuit.termination_a.cable.termination_b.name edge["dashes"] = True
if cable_a_name is None: title = ""
cable_a_name = "cable B name unknown"
title += cable_a_dev_name + " [" + cable_a_name + "]<br>"
edge["title"] = title
edges.append(edge)
# To Many if's
if cable.termination_a.circuit.termination_z is not None:
if cable.termination_a.circuit.termination_z.cable is not None:
if cable.termination_a.circuit.termination_z.cable.id != cable.id:
if cable.termination_a.circuit.termination_z.cable.termination_b is not None:
if cable.termination_a.circuit.termination_z.cable.termination_b.device is not None:
edge["from"] = cable.termination_a.circuit.termination_z.cable.termination_b.device.id
cable_a_dev_name = cable.termination_a.circuit.termination_z.cable.termination_b.device.name title += "Circuit provider: " + cable.termination_a.circuit.provider.name + "<br>"
if cable_a_dev_name is None: title += "Termination between <br>"
cable_a_dev_name = "device B name unknown" title += cable_b_dev_name + " [" + cable_b_name + "]<br>"
cable_a_name = cable.termination_a.circuit.termination_z.cable.termination_b.name # To Many if's
if cable_a_name is None: if cable.termination_a.circuit.termination_a is not None:
cable_a_name = "cable B name unknown" if cable.termination_a.circuit.termination_a.cable is not None:
title += cable_a_dev_name + " [" + cable_a_name + "]<br>" if cable.termination_a.circuit.termination_a.cable.id != cable.id:
edge["title"] = title if cable.termination_a.circuit.termination_a.cable.termination_b is not None:
edges.append(edge) if cable.termination_a.circuit.termination_a.cable.termination_b.device is not None:
dev_name = device.name edge["from"] = cable.termination_a.circuit.termination_a.cable.termination_b.device.id
if dev_name is None:
dev_name = "device name unknown"
node_content = "" cable_a_dev_name = cable.termination_a.circuit.termination_a.cable.termination_b.device.name
if cable_a_dev_name is None:
cable_a_dev_name = "device B name unknown"
cable_b_name = cable.termination_a.circuit.termination_a.cable.termination_b.name
if cable_a_name is None:
cable_a_name = "cable B name unknown"
title += cable_a_dev_name + " [" + cable_a_name + "]<br>"
edge["title"] = title
edges.append(edge)
# To Many if's
if cable.termination_a.circuit.termination_z is not None:
if cable.termination_a.circuit.termination_z.cable is not None:
if cable.termination_a.circuit.termination_z.cable.id != cable.id:
if cable.termination_a.circuit.termination_z.cable.termination_b is not None:
if cable.termination_a.circuit.termination_z.cable.termination_b.device is not None:
edge["from"] = cable.termination_a.circuit.termination_z.cable.termination_b.device.id
if device.device_type.display_name is not None: cable_a_dev_name = cable.termination_a.circuit.termination_z.cable.termination_b.device.name
node_content += "<tr><th>Type: </th><td>" + device.device_type.display_name + "</td></tr>" if cable_a_dev_name is None:
if device.device_role.name is not None: cable_a_dev_name = "device B name unknown"
node_content += "<tr><th>Role: </th><td>" + device.device_role.name + "</td></tr>" cable_a_name = cable.termination_a.circuit.termination_z.cable.termination_b.name
if device.serial != "": if cable_a_name is None:
node_content += "<tr><th>Serial: </th><td>" + device.serial + "</td></tr>" cable_a_name = "cable B name unknown"
if device.primary_ip is not None: title += cable_a_dev_name + " [" + cable_a_name + "]<br>"
node_content += "<tr><th>IP Address: </th><td>" + str(device.primary_ip.address) + "</td></tr>" edge["title"] = title
edges.append(edge)
dev_title = "<table> %s </table>" % (node_content)
node = {}
node["id"] = device.id
node["name"] = dev_name
node["label"] = dev_name
node["title"] = dev_title
node["shape"] = 'image'
if device.device_role.slug in settings.PLUGINS_CONFIG["netbox_topology_views"]["device_img"]:
node["image"] = '../../static/netbox_topology_views/img/' + device.device_role.slug + ".png"
else: else:
node["image"] = "../../static/netbox_topology_views/img/role-unknown.png" device_has_connections = False
if device.device_role.color != "": if hide_unconnected == 'false' or (hide_unconnected == 'true' and device_has_connections is True):
node["color.border"] = "#" + device.device_role.color dev_name = device.name
if dev_name is None:
dev_name = "device name unknown"
if "coordinates" in device.custom_field_data: node_content = ""
if device.custom_field_data["coordinates"] != "":
cords = device.custom_field_data["coordinates"].split(";") if device.device_type.display_name is not None:
node["x"] = int(cords[0]) node_content += "<tr><th>Type: </th><td>" + device.device_type.display_name + "</td></tr>"
node["y"] = int(cords[1]) if device.device_role.name is not None:
node["physics"] = False node_content += "<tr><th>Role: </th><td>" + device.device_role.name + "</td></tr>"
if device.serial != "":
nodes.append(node) node_content += "<tr><th>Serial: </th><td>" + device.serial + "</td></tr>"
if device.primary_ip is not None:
node_content += "<tr><th>IP Address: </th><td>" + str(device.primary_ip.address) + "</td></tr>"
dev_title = "<table> %s </table>" % (node_content)
node = {}
node["id"] = device.id
node["name"] = dev_name
node["label"] = dev_name
node["title"] = dev_title
node["shape"] = 'image'
if device.device_role.slug in settings.PLUGINS_CONFIG["netbox_topology_views"]["device_img"]:
node["image"] = '../../static/netbox_topology_views/img/' + device.device_role.slug + ".png"
else:
node["image"] = "../../static/netbox_topology_views/img/role-unknown.png"
if device.device_role.color != "":
node["color.border"] = "#" + device.device_role.color
if "coordinates" in device.custom_field_data:
if device.custom_field_data["coordinates"] != "":
cords = device.custom_field_data["coordinates"].split(";")
node["x"] = int(cords[0])
node["y"] = int(cords[1])
node["physics"] = False
nodes.append(node)
results = {} results = {}
results["nodes"] = nodes results["nodes"] = nodes
File diff suppressed because one or more lines are too long
+3 -1
View File
@@ -232,6 +232,7 @@ function handleButtonPress() {
var value3 = $("#sites").val(); var value3 = $("#sites").val();
var value4 = $("#tags").val(); var value4 = $("#tags").val();
var value5 = $("#regions").val(); var value5 = $("#regions").val();
var value6 = $('#checkHideUnconnected').is(":checked");
$.ajax({ $.ajax({
type: "GET", type: "GET",
url: "../../api/plugins/topology-views/search/search/", url: "../../api/plugins/topology-views/search/search/",
@@ -240,7 +241,8 @@ function handleButtonPress() {
'devicerole[]': value2, 'devicerole[]': value2,
'sites[]': value3, 'sites[]': value3,
'tags[]': value4, 'tags[]': value4,
'regions[]': value5 'regions[]': value5,
'hide_unconnected': value6
}, },
headers: { "X-CSRFToken": csrftoken }, headers: { "X-CSRFToken": csrftoken },
contentType: "application/json; charset=utf-8", contentType: "application/json; charset=utf-8",
@@ -53,6 +53,12 @@
<div class="form-group"> <div class="form-group">
<label for="regions">Regions</label> <label for="regions">Regions</label>
<select class="form-control" multiple="multiple" id="regions"></select> <select class="form-control" multiple="multiple" id="regions"></select>
</div>
<div class="form-group">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="checkHideUnconnected">
<label class="custom-control-label" for="checkHideUnconnected">Hide Unconnected</label>
</div>
</div> </div>
<hr class="mb-4"> <hr class="mb-4">
<button class="btn btn-primary btn-lg btn-block" type="submit" id="start-search">Search</button> <button class="btn btn-primary btn-lg btn-block" type="submit" id="start-search">Search</button>
+4 -4
View File
@@ -1,6 +1,6 @@
{ {
"name": "netbox_topology_views", "name": "netbox_topology_views",
"version": "0.5.0", "version": "0.5.1",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@@ -4772,9 +4772,9 @@
"dev": true "dev": true
}, },
"y18n": { "y18n": {
"version": "3.2.1", "version": "3.2.2",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
"integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
"dev": true "dev": true
}, },
"yallist": { "yallist": {
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"private": true, "private": true,
"name": "netbox_topology_views", "name": "netbox_topology_views",
"version": "0.5.0", "version": "0.5.1",
"scripts": { "scripts": {
"resources": "gulp build", "resources": "gulp build",
"resources_dev": "gulp build_dev" "resources_dev": "gulp build_dev"
+1 -1
View File
@@ -3,7 +3,7 @@ from setuptools import setup, find_packages
setup( setup(
name='netbox-topology-views', name='netbox-topology-views',
version='0.5.0', version='0.5.1',
description='An NetBox plugin to create Topology maps', description='An NetBox plugin to create Topology maps',
url='https://github.com/mattieserver/netbox-topology-views', url='https://github.com/mattieserver/netbox-topology-views',
author='Mattijs Vanhaverbeke', author='Mattijs Vanhaverbeke',