Arthur před 19 hodinami
rodič
revize
f49d7be00f
1 změnil soubory, kde provedl 14 přidání a 17 odebrání
  1. 14 17
      netbox/circuits/models/circuits.py

+ 14 - 17
netbox/circuits/models/circuits.py

@@ -241,6 +241,15 @@ class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin,
         return reverse('circuits:circuitgroupassignment', args=[self.pk])
 
 
+def _set_circuit_termination(circuit, field_name, value):
+    """
+    Set or clear a Circuit's cached `termination_a`/`termination_z` field, recording the change.
+    """
+    circuit.snapshot()
+    setattr(circuit, field_name, value)
+    circuit.save(update_fields=[field_name, 'last_updated'])
+
+
 class CircuitTermination(
     CustomFieldsMixin,
     CustomLinksMixin,
@@ -400,43 +409,31 @@ class CircuitTermination(
 
         super().save(*args, **kwargs)
 
-        # Clear the old termination reference if circuit or term_side changed. Written via
-        # snapshot() + save() rather than a queryset update(), which emits no post_save and so
-        # records nothing in the changelog (#23134). Matching on the pointer's current value
-        # skips the write unless it actually references this termination.
+        # Clear the old termination reference if circuit or term_side changed
         if circuit_changed or term_side_changed:
             old_termination_name = f'termination_{self._orig_term_side.lower()}'
             circuit = Circuit.objects.filter(
                 pk=self._orig_circuit_id, **{old_termination_name: self.pk}
             ).first()
             if circuit is not None:
-                circuit.snapshot()
-                setattr(circuit, old_termination_name, None)
-                circuit.save(update_fields=[old_termination_name, 'last_updated'])
+                _set_circuit_termination(circuit, old_termination_name, None)
 
         # Update the cache if this is a new termination or circuit/term_side changed
         if is_new or circuit_changed or term_side_changed:
             # Update the new circuit's termination reference
             termination_name = f'termination_{self.term_side.lower()}'
-            # Re-fetched rather than reusing self.circuit, whose pointers may predate a sibling write
-            circuit = Circuit.objects.get(pk=self.circuit_id)
-            circuit.snapshot()
-            setattr(circuit, termination_name, self)
-            circuit.save(update_fields=[termination_name, 'last_updated'])
+            _set_circuit_termination(Circuit.objects.get(pk=self.circuit_id), termination_name, self)
 
             # Update cached values for subsequent saves
             self._orig_circuit_id = self.circuit_id
             self._orig_term_side = self.term_side
 
     def delete(self, *args, **kwargs):
-        # on_delete=SET_NULL would clear the circuit's reference with an unlogged bulk update.
-        # Clearing it here instead also puts the record ahead of the DELETE.
+        # Clear the circuit's reference here; on_delete=SET_NULL is not change-logged
         termination_name = f'termination_{self.term_side.lower()}'
         circuit = Circuit.objects.filter(pk=self.circuit_id, **{termination_name: self.pk}).first()
         if circuit is not None:
-            circuit.snapshot()
-            setattr(circuit, termination_name, None)
-            circuit.save(update_fields=[termination_name, 'last_updated'])
+            _set_circuit_termination(circuit, termination_name, None)
 
         return super().delete(*args, **kwargs)