From a4955b420a4b3b06f9caf14ff71d9f8329c13c3b Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 6 May 2021 13:29:52 -0400 Subject: [PATCH] Fixes #6355: Fix caching error when swapping A/Z circuit terminations --- docs/release-notes/version-2.11.md | 1 + netbox/circuits/signals.py | 11 +++---- netbox/circuits/views.py | 41 ++++++++------------------ netbox/templates/circuits/circuit.html | 4 +-- 4 files changed, 19 insertions(+), 38 deletions(-) diff --git a/docs/release-notes/version-2.11.md b/docs/release-notes/version-2.11.md index 3467e7dce..69f10b6e5 100644 --- a/docs/release-notes/version-2.11.md +++ b/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 diff --git a/netbox/circuits/signals.py b/netbox/circuits/signals.py index 0a000fb2e..a12cef671 100644 --- a/netbox/circuits/signals.py +++ b/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) diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 6fd0c2208..15e6bed2f 100644 --- a/netbox/circuits/views.py +++ b/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() - messages.success(request, "Swapped terminations for circuit {}.".format(circuit)) + print(f'term A: {circuit.termination_a}') + print(f'term Z: {circuit.termination_z}') + + messages.success(request, f"Swapped terminations for circuit {circuit}.") return redirect('circuits:circuit', pk=circuit.pk) return render(request, 'circuits/circuit_terminations_swap.html', { diff --git a/netbox/templates/circuits/circuit.html b/netbox/templates/circuits/circuit.html index 1890570d1..ab8bd7394 100644 --- a/netbox/templates/circuits/circuit.html +++ b/netbox/templates/circuits/circuit.html @@ -80,8 +80,8 @@ {% plugin_left_page object %}
- {% 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 %}