From b6265d828526a97962e8feefa0ff57c534d2da27 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Sat, 21 Dec 2024 12:51:04 -0500 Subject: [PATCH 1/2] Iterate through a freshly queried set of CableTerminations to find endpoints in update_connected_endpoints --- netbox/dcim/signals.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/signals.py b/netbox/dcim/signals.py index a51872719a7..6c213d64c2b 100644 --- a/netbox/dcim/signals.py +++ b/netbox/dcim/signals.py @@ -85,7 +85,8 @@ def update_connected_endpoints(instance, created, raw=False, **kwargs): if instance._terminations_modified: a_terminations = [] b_terminations = [] - for t in instance.terminations.all(): + # Note: instance.terminations.all() is not safe to use here as it might be stale + for t in CableTermination.objects.filter(cable=instance): if t.cable_end == CableEndChoices.SIDE_A: a_terminations.append(t.termination) else: From d5468cc573dd5449b344bb327ed5896bd5302a37 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Mon, 30 Dec 2024 13:06:19 -0500 Subject: [PATCH 2/2] Add defensive break if q_filter has not been populated --- netbox/dcim/models/cables.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 2a474861006..2bdaa50ebab 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -607,6 +607,10 @@ def from_origin(cls, terminations): cable_end = 'A' if lct.cable_end == 'B' else 'B' q_filter |= Q(cable=lct.cable, cable_end=cable_end) + # Make sure this filter has been populated; if not, we have probably been given invalid data + if not q_filter: + break + remote_cable_terminations = CableTermination.objects.filter(q_filter) remote_terminations = [ct.termination for ct in remote_cable_terminations] else: