diff --git a/netbox/circuits/signals.py b/netbox/circuits/signals.py index 7c9832d5b..0a000fb2e 100644 --- a/netbox/circuits/signals.py +++ b/netbox/circuits/signals.py @@ -1,7 +1,8 @@ -from django.db.models.signals import post_save +from django.db.models.signals import post_delete, post_save from django.dispatch import receiver from django.utils import timezone +from dcim.signals import rebuild_paths from .models import Circuit, CircuitTermination @@ -15,3 +16,14 @@ def update_circuit(instance, **kwargs): f'termination_{instance.term_side.lower()}': instance.pk, } Circuit.objects.filter(pk=instance.circuit_id).update(**fields) + + +@receiver((post_save, post_delete), sender=CircuitTermination) +def rebuild_cablepaths(instance, raw=False, **kwargs): + """ + Rebuild any CablePaths which traverse the peer CircuitTermination. + """ + if not raw: + peer_termination = instance.get_peer_termination() + if peer_termination: + rebuild_paths(peer_termination) diff --git a/netbox/dcim/tests/test_cablepaths.py b/netbox/dcim/tests/test_cablepaths.py index 56134f4d3..c0fc89f83 100644 --- a/netbox/dcim/tests/test_cablepaths.py +++ b/netbox/dcim/tests/test_cablepaths.py @@ -819,15 +819,35 @@ class CablePathTestCase(TestCase): interface1 = Interface.objects.create(device=self.device, name='Interface 1') interface2 = Interface.objects.create(device=self.device, name='Interface 2') circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='A') - circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='Z') - # Create cables + # Create cable 1 cable1 = Cable(termination_a=interface1, termination_b=circuittermination1) cable1.save() + + # Check for partial path from interface1 + self.assertPathExists( + origin=interface1, + destination=None, + path=(cable1, circuittermination1), + is_active=False + ) + + # Create CT2 + circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='Z') + + # Check for partial path to site + self.assertPathExists( + origin=interface1, + destination=self.site, + path=(cable1, circuittermination1, circuittermination2), + is_active=True + ) + + # Create cable 2 cable2 = Cable(termination_a=circuittermination2, termination_b=interface2) cable2.save() - # Check for paths + # Check for complete path in each direction self.assertPathExists( origin=interface1, destination=interface2,