diff --git a/README.md b/README.md index 7f76e5a..4d099cb 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ PLUGINS_CONFIG = { | allow_coordinates_saving | False | (bool) Set to true if you use the custom coordinates fields and want to save the coordinates | | ignore_cable_type | 'power outlet,power port' | The cable types that you want to ignore in the views | | preselected_tags | '' | The name of tags you want to preload | - +| enable_circuit_terminations | False | (bool) Set to true if you want to see circuit terminations in the topology | ### Custom Images diff --git a/netbox_topology_views/__init__.py b/netbox_topology_views/__init__.py index 2417bae..a19fc6d 100644 --- a/netbox_topology_views/__init__.py +++ b/netbox_topology_views/__init__.py @@ -4,7 +4,7 @@ class TopologyViewsConfig(PluginConfig): name = 'netbox_topology_views' verbose_name = 'Topology views' description = 'An plugin to render toplogoy maps' - version = '0.4.6' + version = '0.4.7' author = 'Mattijs Vanhaverbeke' author_email = 'author@example.com' base_url = 'topology-views' @@ -14,7 +14,8 @@ class TopologyViewsConfig(PluginConfig): 'ignore_cable_type': 'power outlet,power port', 'device_img': 'access-switch,core-switch,firewall,router,distribution-switch,backup,storage,wan-network,wireless-ap,server,internal-switch,isp-cpe-material,non-racked-devices,power-units', 'allow_coordinates_saving': False, - 'preselected_tags' : '' + 'preselected_tags' : '', + 'enable_circuit_terminations': False } config = TopologyViewsConfig diff --git a/netbox_topology_views/api/views.py b/netbox_topology_views/api/views.py index ca099d9..5a47975 100644 --- a/netbox_topology_views/api/views.py +++ b/netbox_topology_views/api/views.py @@ -9,6 +9,7 @@ from django.conf import settings from utilities.api import IsAuthenticatedOrLoginNotRequired from dcim.models import DeviceRole, Device, Cable +from circuits.models import Circuit from extras.models import Tag, CustomField, CustomFieldValue ignore_cable_type_raw = settings.PLUGINS_CONFIG["netbox_topology_views"]["ignore_cable_type"] @@ -120,6 +121,7 @@ class SearchViewSet(GenericViewSet): edges = [] edge_ids = 0 cable_ids = [] + circuit_ids = [] for device in devices: cables = device.get_cables() for cable in cables: @@ -146,14 +148,61 @@ class SearchViewSet(GenericViewSet): edge["id"] = edge_ids edge["from"] = cable.termination_a.device.id edge["to"] = cable.termination_b.device.id - edge["title"] = "Connection between
" + cable_a_dev_name + " [" + cable_a_name + "]
" + cable_b_dev_name + " [" + cable_b_name + "]" + edge["title"] = "Cable between
" + cable_a_dev_name + " [" + cable_a_name + "]
" + cable_b_dev_name + " [" + cable_b_name + "]" if cable.color != "": edge["color"] = "#" + cable.color edges.append(edge) else: - pass - #circuittermination not supported for now - + 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 + + 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["to"] = cable.termination_b.device.id + edge["dashes"] = True + title = "" + + title += "Circuit provider: " + cable.termination_a.circuit.provider.name + "
" + title += "Termination between
" + title += cable_b_dev_name + " [" + cable_b_name + "]
" + if cable.termination_a.circuit.termination_a is not None: + if cable.termination_a.circuit.termination_a.cable is not None: + if cable.termination_a.circuit.termination_a.cable.id != cable.id: + 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 + 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 + "]
" + 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: + 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 + if cable_a_dev_name is None: + cable_a_dev_name = "device B name unknown" + cable_a_name = cable.termination_a.circuit.termination_z.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 + "]
" + + edge["title"] = title + edges.append(edge) + dev_name = device.name if dev_name is None: dev_name = "device name unknown" @@ -182,6 +231,9 @@ class SearchViewSet(GenericViewSet): else: node["image"] = "../../static/netbox_topology_views/img/role-unknown.png" + if device.device_role.color != "": + node["color.border"] = "#" + device.device_role.color + for device_custom_field in device.custom_field_values.all(): if device_custom_field.field.name == "coordinates": cords = device_custom_field.serialized_value.split(";") diff --git a/package.json b/package.json index cfff889..18c0514 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "netbox_topology_views", - "version": "0.4.6", + "version": "0.4.7", "scripts": { "resources": "gulp build", "resources_dev": "gulp build_dev" diff --git a/setup.py b/setup.py index a9ced80..175b6db 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import setup, find_packages setup( name='netbox-topology-views', - version='0.4.6', + version='0.4.7', description='An NetBox plugin to create Topology maps', url='https://github.com/mattieserver/netbox-topology-views', author='Mattijs Vanhaverbeke',