Jelajahi Sumber

Fixes #6355: Fix caching error when swapping A/Z circuit terminations

jeremystretch 4 tahun lalu
induk
melakukan
a4955b420a

+ 1 - 0
docs/release-notes/version-2.11.md

@@ -18,6 +18,7 @@
 * [#6321](https://github.com/netbox-community/netbox/issues/6321) - Restore "add an IP" button under prefix IPs view
 * [#6333](https://github.com/netbox-community/netbox/issues/6333) - Fix filtering of circuit terminations by primary key
 * [#6339](https://github.com/netbox-community/netbox/issues/6339) - Improve ordering of interfaces when viewing virtual chassis master
+* [#6355](https://github.com/netbox-community/netbox/issues/6355) - Fix caching error when swapping A/Z circuit terminations
 * [#6357](https://github.com/netbox-community/netbox/issues/6357) - Fix ProviderNetwork nested API serializer
 * [#6363](https://github.com/netbox-community/netbox/issues/6363) - Correct pre-population of cluster group when creating a cluster
 

+ 4 - 7
netbox/circuits/signals.py

@@ -1,9 +1,8 @@
 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
+from .models import CircuitTermination
 
 
 @receiver(post_save, sender=CircuitTermination)
@@ -11,11 +10,9 @@ def update_circuit(instance, **kwargs):
     """
     When a CircuitTermination has been modified, update its parent Circuit.
     """
-    fields = {
-        'last_updated': timezone.now(),
-        f'termination_{instance.term_side.lower()}': instance.pk,
-    }
-    Circuit.objects.filter(pk=instance.circuit_id).update(**fields)
+    termination_name = f'termination_{instance.term_side.lower()}'
+    setattr(instance.circuit, termination_name, instance)
+    instance.circuit.save()
 
 
 @receiver((post_save, post_delete), sender=CircuitTermination)

+ 12 - 29
netbox/circuits/views.py

@@ -211,27 +211,6 @@ class CircuitListView(generic.ObjectListView):
 class CircuitView(generic.ObjectView):
     queryset = Circuit.objects.all()
 
-    def get_extra_context(self, request, instance):
-
-        # A-side termination
-        termination_a = CircuitTermination.objects.restrict(request.user, 'view').prefetch_related(
-            'site__region'
-        ).filter(
-            circuit=instance, term_side=CircuitTerminationSideChoices.SIDE_A
-        ).first()
-
-        # Z-side termination
-        termination_z = CircuitTermination.objects.restrict(request.user, 'view').prefetch_related(
-            'site__region'
-        ).filter(
-            circuit=instance, term_side=CircuitTerminationSideChoices.SIDE_Z
-        ).first()
-
-        return {
-            'termination_a': termination_a,
-            'termination_z': termination_z,
-        }
-
 
 class CircuitEditView(generic.ObjectEditView):
     queryset = Circuit.objects.all()
@@ -296,16 +275,11 @@ class CircuitSwapTerminations(generic.ObjectEditView):
 
         if form.is_valid():
 
-            termination_a = CircuitTermination.objects.filter(
-                circuit=circuit, term_side=CircuitTerminationSideChoices.SIDE_A
-            ).first()
-            termination_z = CircuitTermination.objects.filter(
-                circuit=circuit, term_side=CircuitTerminationSideChoices.SIDE_Z
-            ).first()
+            termination_a = CircuitTermination.objects.filter(pk=circuit.termination_a_id).first()
+            termination_z = CircuitTermination.objects.filter(pk=circuit.termination_z_id).first()
 
             if termination_a and termination_z:
                 # Use a placeholder to avoid an IntegrityError on the (circuit, term_side) unique constraint
-                print('swapping')
                 with transaction.atomic():
                     termination_a.term_side = '_'
                     termination_a.save()
@@ -316,11 +290,20 @@ class CircuitSwapTerminations(generic.ObjectEditView):
             elif termination_a:
                 termination_a.term_side = 'Z'
                 termination_a.save()
+                circuit.refresh_from_db()
+                circuit.termination_a = None
+                circuit.save()
             else:
                 termination_z.term_side = 'A'
                 termination_z.save()
+                circuit.refresh_from_db()
+                circuit.termination_z = None
+                circuit.save()
+
+            print(f'term A: {circuit.termination_a}')
+            print(f'term Z: {circuit.termination_z}')
 
-            messages.success(request, "Swapped terminations for circuit {}.".format(circuit))
+            messages.success(request, f"Swapped terminations for circuit {circuit}.")
             return redirect('circuits:circuit', pk=circuit.pk)
 
         return render(request, 'circuits/circuit_terminations_swap.html', {

+ 2 - 2
netbox/templates/circuits/circuit.html

@@ -80,8 +80,8 @@
         {% plugin_left_page object %}
 	</div>
 	<div class="col-md-6">
-        {% include 'circuits/inc/circuit_termination.html' with termination=termination_a side='A' %}
-        {% include 'circuits/inc/circuit_termination.html' with termination=termination_z side='Z' %}
+        {% include 'circuits/inc/circuit_termination.html' with termination=object.termination_a side='A' %}
+        {% include 'circuits/inc/circuit_termination.html' with termination=object.termination_z side='Z' %}
         {% plugin_right_page object %}
     </div>
 </div>