mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-24 17:38:37 -06:00
Fixes #6355: Fix caching error when swapping A/Z circuit terminations
This commit is contained in:
parent
fe78f60b1f
commit
a4955b420a
@ -18,6 +18,7 @@
|
|||||||
* [#6321](https://github.com/netbox-community/netbox/issues/6321) - Restore "add an IP" button under prefix IPs view
|
* [#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
|
* [#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
|
* [#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
|
* [#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
|
* [#6363](https://github.com/netbox-community/netbox/issues/6363) - Correct pre-population of cluster group when creating a cluster
|
||||||
|
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
from django.db.models.signals import post_delete, post_save
|
from django.db.models.signals import post_delete, post_save
|
||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from django.utils import timezone
|
|
||||||
|
|
||||||
from dcim.signals import rebuild_paths
|
from dcim.signals import rebuild_paths
|
||||||
from .models import Circuit, CircuitTermination
|
from .models import CircuitTermination
|
||||||
|
|
||||||
|
|
||||||
@receiver(post_save, sender=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.
|
When a CircuitTermination has been modified, update its parent Circuit.
|
||||||
"""
|
"""
|
||||||
fields = {
|
termination_name = f'termination_{instance.term_side.lower()}'
|
||||||
'last_updated': timezone.now(),
|
setattr(instance.circuit, termination_name, instance)
|
||||||
f'termination_{instance.term_side.lower()}': instance.pk,
|
instance.circuit.save()
|
||||||
}
|
|
||||||
Circuit.objects.filter(pk=instance.circuit_id).update(**fields)
|
|
||||||
|
|
||||||
|
|
||||||
@receiver((post_save, post_delete), sender=CircuitTermination)
|
@receiver((post_save, post_delete), sender=CircuitTermination)
|
||||||
|
@ -211,27 +211,6 @@ class CircuitListView(generic.ObjectListView):
|
|||||||
class CircuitView(generic.ObjectView):
|
class CircuitView(generic.ObjectView):
|
||||||
queryset = Circuit.objects.all()
|
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):
|
class CircuitEditView(generic.ObjectEditView):
|
||||||
queryset = Circuit.objects.all()
|
queryset = Circuit.objects.all()
|
||||||
@ -296,16 +275,11 @@ class CircuitSwapTerminations(generic.ObjectEditView):
|
|||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
|
|
||||||
termination_a = CircuitTermination.objects.filter(
|
termination_a = CircuitTermination.objects.filter(pk=circuit.termination_a_id).first()
|
||||||
circuit=circuit, term_side=CircuitTerminationSideChoices.SIDE_A
|
termination_z = CircuitTermination.objects.filter(pk=circuit.termination_z_id).first()
|
||||||
).first()
|
|
||||||
termination_z = CircuitTermination.objects.filter(
|
|
||||||
circuit=circuit, term_side=CircuitTerminationSideChoices.SIDE_Z
|
|
||||||
).first()
|
|
||||||
|
|
||||||
if termination_a and termination_z:
|
if termination_a and termination_z:
|
||||||
# Use a placeholder to avoid an IntegrityError on the (circuit, term_side) unique constraint
|
# Use a placeholder to avoid an IntegrityError on the (circuit, term_side) unique constraint
|
||||||
print('swapping')
|
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
termination_a.term_side = '_'
|
termination_a.term_side = '_'
|
||||||
termination_a.save()
|
termination_a.save()
|
||||||
@ -316,11 +290,20 @@ class CircuitSwapTerminations(generic.ObjectEditView):
|
|||||||
elif termination_a:
|
elif termination_a:
|
||||||
termination_a.term_side = 'Z'
|
termination_a.term_side = 'Z'
|
||||||
termination_a.save()
|
termination_a.save()
|
||||||
|
circuit.refresh_from_db()
|
||||||
|
circuit.termination_a = None
|
||||||
|
circuit.save()
|
||||||
else:
|
else:
|
||||||
termination_z.term_side = 'A'
|
termination_z.term_side = 'A'
|
||||||
termination_z.save()
|
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 redirect('circuits:circuit', pk=circuit.pk)
|
||||||
|
|
||||||
return render(request, 'circuits/circuit_terminations_swap.html', {
|
return render(request, 'circuits/circuit_terminations_swap.html', {
|
||||||
|
@ -80,8 +80,8 @@
|
|||||||
{% plugin_left_page object %}
|
{% plugin_left_page object %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<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=object.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_z side='Z' %}
|
||||||
{% plugin_right_page object %}
|
{% plugin_right_page object %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user