diff --git a/netbox/utilities/counters.py b/netbox/utilities/counters.py index ee6865ca2..6c1418dff 100644 --- a/netbox/utilities/counters.py +++ b/netbox/utilities/counters.py @@ -27,7 +27,7 @@ def update_counter(model, pk, counter_name, value): # Signal handlers # -def post_save_receiver(sender, instance, **kwargs): +def post_save_receiver(sender, instance, created, **kwargs): """ Update counter fields on related objects when a TrackingModelMixin subclass is created or modified. """ @@ -39,7 +39,7 @@ def post_save_receiver(sender, instance, **kwargs): # Update the counters on the old and/or new parents as needed if old_pk is not None: update_counter(parent_model, old_pk, counter_name, -1) - if new_pk is not None: + if new_pk is not None and (old_pk or created): update_counter(parent_model, new_pk, counter_name, 1) diff --git a/netbox/utilities/tests/test_counters.py b/netbox/utilities/tests/test_counters.py index e9561c91b..0c61c0890 100644 --- a/netbox/utilities/tests/test_counters.py +++ b/netbox/utilities/tests/test_counters.py @@ -29,13 +29,17 @@ class CountersTest(TestCase): self.assertEqual(device1.interface_count, 2) self.assertEqual(device2.interface_count, 2) - Interface.objects.create(device=device1, name='Interface 5') + interface1 = Interface.objects.create(device=device1, name='Interface 5') Interface.objects.create(device=device2, name='Interface 6') device1.refresh_from_db() device2.refresh_from_db() self.assertEqual(device1.interface_count, 3) self.assertEqual(device2.interface_count, 3) + interface1.save() + device1.refresh_from_db() + self.assertEqual(device1.interface_count, 3) + def test_interface_count_deletion(self): """ When a tracked object (Interface) is deleted the tracking counter should be updated.