From 13ef5dc0b32047ac93aa671b64174e636370b065 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 7 Jul 2022 13:57:39 -0400 Subject: [PATCH] Extend Interface.link_peers() to support WirelessLinks --- netbox/dcim/models/device_components.py | 36 ++++++++++++++++--------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index d1bdd757e..85665bb43 100644 --- a/netbox/dcim/models/device_components.py +++ b/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()