From 7a410dfd00e0074cb6d5445c5c9f0a90a9222283 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Wed, 20 Sep 2023 10:57:35 -0700 Subject: [PATCH] 13813 fix virtual chassis member count (#13823) * 13813 fix virtual chassis member count * 13813 add test --- netbox/utilities/counters.py | 5 +++-- netbox/utilities/tests/test_counters.py | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/netbox/utilities/counters.py b/netbox/utilities/counters.py index b0bd2560b..6c597b943 100644 --- a/netbox/utilities/counters.py +++ b/netbox/utilities/counters.py @@ -52,12 +52,13 @@ def post_save_receiver(sender, instance, created, **kwargs): for field_name, counter_name in get_counters_for_model(sender): parent_model = sender._meta.get_field(field_name).related_model new_pk = getattr(instance, field_name, None) - old_pk = instance.tracker.get(field_name) if field_name in instance.tracker else None + has_old_field = field_name in instance.tracker + old_pk = instance.tracker.get(field_name) if has_old_field else None # 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 and (old_pk or created): + if new_pk is not None and (has_old_field 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 0c61c0890..cf8850c52 100644 --- a/netbox/utilities/tests/test_counters.py +++ b/netbox/utilities/tests/test_counters.py @@ -36,10 +36,18 @@ class CountersTest(TestCase): self.assertEqual(device1.interface_count, 3) self.assertEqual(device2.interface_count, 3) + # test saving an existing object - counter should not change interface1.save() device1.refresh_from_db() self.assertEqual(device1.interface_count, 3) + # test save where tracked object FK back pointer is None + vc = VirtualChassis.objects.create(name='Virtual Chassis 1') + device1.virtual_chassis = vc + device1.save() + vc.refresh_from_db() + self.assertEqual(vc.member_count, 1) + def test_interface_count_deletion(self): """ When a tracked object (Interface) is deleted the tracking counter should be updated.