diff --git a/docs/release-notes/version-3.4.md b/docs/release-notes/version-3.4.md index 32f46f1ef..6648c9d54 100644 --- a/docs/release-notes/version-3.4.md +++ b/docs/release-notes/version-3.4.md @@ -11,6 +11,7 @@ * [#11175](https://github.com/netbox-community/netbox/issues/11175) - Fix cloning of fields containing special characters * [#11178](https://github.com/netbox-community/netbox/issues/11178) - Pressing enter in quick search box should not trigger bulk operations +* [#11184](https://github.com/netbox-community/netbox/issues/11184) - Correct visualization of cable path which splits across multiple circuit terminations * [#11185](https://github.com/netbox-community/netbox/issues/11185) - Fix TemplateSyntaxError when viewing custom script results * [#11189](https://github.com/netbox-community/netbox/issues/11189) - Fix localization of dates & numbers * [#11205](https://github.com/netbox-community/netbox/issues/11205) - Correct cloning behavior for recursively-nested models diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index fc9d2d7a1..48c1f92db 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -567,11 +567,12 @@ class CablePath(models.Model): elif isinstance(remote_terminations[0], CircuitTermination): # Follow a CircuitTermination to its corresponding CircuitTermination (A to Z or vice versa) - term_side = remote_terminations[0].term_side - assert all(ct.term_side == term_side for ct in remote_terminations[1:]) + if len(remote_terminations) > 1: + is_split = True + break circuit_termination = CircuitTermination.objects.filter( circuit=remote_terminations[0].circuit, - term_side='Z' if term_side == 'A' else 'A' + term_side='Z' if remote_terminations[0].term_side == 'A' else 'A' ).first() if circuit_termination is None: break @@ -685,6 +686,7 @@ class CablePath(models.Model): """ Return all available next segments in a split cable path. """ + from circuits.models import CircuitTermination nodes = self.path_objects[-1] # RearPort splitting to multiple FrontPorts with no stack position @@ -694,3 +696,8 @@ class CablePath(models.Model): # RearPorts connected to different cables elif type(nodes[0]) is FrontPort: return RearPort.objects.filter(pk__in=[fp.rear_port_id for fp in nodes]) + # Cable terminating to multiple CircuitTerminations + elif type(nodes[0]) is CircuitTermination: + return [ + ct.get_peer_termination() for ct in nodes + ]