Просмотр исходного кода

Extend Interface.link_peers() to support WirelessLinks

jeremystretch 3 лет назад
Родитель
Сommit
13ef5dc0b3
1 измененных файлов с 23 добавлено и 13 удалено
  1. 23 13
      netbox/dcim/models/device_components.py

+ 23 - 13
netbox/dcim/models/device_components.py

@@ -143,13 +143,19 @@ class CabledObjectModel(models.Model):
                 "mark_connected": "Cannot mark as connected with a cable attached."
             })
 
+    @property
+    def link(self):
+        """
+        Generic wrapper for a Cable, WirelessLink, or some other relation to a connected termination.
+        """
+        return self.cable
+
     @property
     def link_peers(self):
-        # TODO: Support WirelessLinks
-        if not self.cable:
-            return []
-        peer_terminations = self.cable.terminations.exclude(cable_end=self.cable_end).prefetch_related('termination')
-        return [ct.termination for ct in peer_terminations]
+        if self.cable:
+            peers = self.cable.terminations.exclude(cable_end=self.cable_end).prefetch_related('termination')
+            return [peer.termination for peer in peers]
+        return []
 
     @property
     def _occupied(self):
@@ -165,14 +171,6 @@ class CabledObjectModel(models.Model):
             return None
         return CableEndChoices.SIDE_A if self.cable_end == CableEndChoices.SIDE_B else CableEndChoices.SIDE_B
 
-    @property
-    def link(self):
-        """
-        Generic wrapper for a Cable, WirelessLink, or some other relation to a connected termination.
-        """
-        # TODO: Support WirelessLinks
-        return self.cable
-
 
 class PathEndpoint(models.Model):
     """
@@ -832,6 +830,18 @@ class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEnd
     def link(self):
         return self.cable or self.wireless_link
 
+    @property
+    def link_peers(self):
+        if self.cable:
+            return super().link_peers
+        if self.wireless_link:
+            # Return the opposite side of the attached wireless link
+            if self.wireless_link.interface_a == self:
+                return [self.wireless_link.interface_b]
+            else:
+                return [self.wireless_link.interface_a]
+        return []
+
     @property
     def l2vpn_termination(self):
         return self.l2vpn_terminations.first()