From e647065e63a2a57c7f29f47582fc18d9d722051d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 27 Dec 2016 13:21:19 -0500 Subject: [PATCH] Improved device interface list performance --- netbox/dcim/api/serializers.py | 2 +- netbox/dcim/api/views.py | 2 +- netbox/dcim/models.py | 19 ++++++++++++------- netbox/dcim/views.py | 14 ++++++++++---- .../templates/dcim/device_lldp_neighbors.html | 2 +- netbox/templates/dcim/inc/_interface.html | 4 ++-- 6 files changed, 27 insertions(+), 16 deletions(-) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 5bdb39ae9..8fe51a075 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -382,7 +382,7 @@ class InterfaceNestedSerializer(InterfaceSerializer): class InterfaceDetailSerializer(InterfaceSerializer): - connected_interface = InterfaceSerializer(source='get_connected_interface') + connected_interface = InterfaceSerializer() class Meta(InterfaceSerializer.Meta): fields = ['id', 'device', 'name', 'form_factor', 'mac_address', 'mgmt_only', 'description', 'is_connected', diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 8b598339f..53bda6208 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -455,7 +455,7 @@ class RelatedConnectionsView(APIView): peer_iface = Interface.objects.get(device__name=peer_device, name=peer_interface) except Interface.DoesNotExist: raise Http404() - local_iface = peer_iface.get_connected_interface() + local_iface = peer_iface.connected_interface if local_iface: device = local_iface.device else: diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 15a01a2fd..1ec8162b7 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1156,13 +1156,18 @@ class Interface(models.Model): pass return None - def get_connected_interface(self): - connection = InterfaceConnection.objects.select_related().filter(Q(interface_a=self) | Q(interface_b=self))\ - .first() - if connection and connection.interface_a == self: - return connection.interface_b - elif connection: - return connection.interface_a + @property + def connected_interface(self): + try: + if self.connected_as_a: + return self.connected_as_a.interface_b + except ObjectDoesNotExist: + pass + try: + if self.connected_as_b: + return self.connected_as_b.interface_a + except ObjectDoesNotExist: + pass return None diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 0fbc73855..58c38bfb0 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -597,10 +597,16 @@ def device(request, pk): power_outlets = natsorted( PowerOutlet.objects.filter(device=device).select_related('connected_port'), key=attrgetter('name') ) - interfaces = Interface.objects.filter(device=device, mgmt_only=False)\ - .select_related('connected_as_a', 'connected_as_b', 'circuit_termination__circuit') - mgmt_interfaces = Interface.objects.filter(device=device, mgmt_only=True)\ - .select_related('connected_as_a', 'connected_as_b', 'circuit_termination__circuit') + interfaces = Interface.objects.filter(device=device, mgmt_only=False).select_related( + 'connected_as_a__interface_b__device', + 'connected_as_b__interface_a__device', + 'circuit_termination__circuit', + ) + mgmt_interfaces = Interface.objects.filter(device=device, mgmt_only=True).select_related( + 'connected_as_a__interface_b__device', + 'connected_as_b__interface_a__device', + 'circuit_termination__circuit', + ) device_bays = natsorted( DeviceBay.objects.filter(device=device).select_related('installed_device__device_type__manufacturer'), key=attrgetter('name') diff --git a/netbox/templates/dcim/device_lldp_neighbors.html b/netbox/templates/dcim/device_lldp_neighbors.html index b37f1860e..415456a29 100644 --- a/netbox/templates/dcim/device_lldp_neighbors.html +++ b/netbox/templates/dcim/device_lldp_neighbors.html @@ -23,7 +23,7 @@ {{ iface }} {% if iface.connection %} - {% with iface.get_connected_interface as connected_iface %} + {% with iface.connected_interface as connected_iface %} {{ connected_iface.device }} diff --git a/netbox/templates/dcim/inc/_interface.html b/netbox/templates/dcim/inc/_interface.html index e4403cd5c..dc7ac4ecf 100644 --- a/netbox/templates/dcim/inc/_interface.html +++ b/netbox/templates/dcim/inc/_interface.html @@ -16,7 +16,7 @@ {% if not iface.is_physical %} Virtual interface {% elif iface.connection %} - {% with iface.get_connected_interface as connected_iface %} + {% with iface.connected_interface as connected_iface %} {{ connected_iface.device }} @@ -27,7 +27,7 @@ {% elif iface.circuit_termination %} {% with iface.circuit_termination.get_peer_termination as peer_termination %} - + {% if peer_termination %} {{ peer_termination.site }} via {% endif %}