diff --git a/netbox/dcim/apps.py b/netbox/dcim/apps.py index 0868f031c..2323f55af 100644 --- a/netbox/dcim/apps.py +++ b/netbox/dcim/apps.py @@ -9,10 +9,7 @@ class DCIMConfig(AppConfig): def ready(self): from . import signals, search - from .models import ( - CableTermination, ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, - Interface, InventoryItem, PowerOutlet, PowerPort, RearPort, - ) + from .models import CableTermination, Device from utilities.counter import connect_counters @@ -30,4 +27,4 @@ class DCIMConfig(AppConfig): '_site': 'site', }) - connect_counters(self) + connect_counters([Device,]) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 68c7eb436..d7509a7ac 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -470,7 +470,7 @@ class PowerOutlet(ModularComponentModel, CabledObjectModel, PathEndpoint, Tracki # Interfaces # -class BaseInterface(models.Model, TrackingModelMixin): +class BaseInterface(models.Model): """ Abstract base class for fields shared by dcim.Interface and virtualization.VMInterface. """ @@ -538,7 +538,7 @@ class BaseInterface(models.Model, TrackingModelMixin): return self.fhrp_group_assignments.count() -class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEndpoint): +class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEndpoint, TrackingModelMixin): """ A network interface within a Device. A physical Interface can connect to exactly one other Interface. """ diff --git a/netbox/utilities/counter.py b/netbox/utilities/counter.py index 9396f49c8..ed761732e 100644 --- a/netbox/utilities/counter.py +++ b/netbox/utilities/counter.py @@ -78,13 +78,11 @@ class Counter: return self.set_counter_field(parent_id, F(self.counter_name) + amount) -def connect_counters(app_config): - models = app_config.get_models() +def connect_counters(models): for model in models: - if issubclass(model, TrackingModelMixin): - fields = model._meta.get_fields() - for field in fields: - if type(field) is CounterCacheField: - to_model = apps.get_model(field.to_model_name) - to_field = getattr(to_model, field.to_field_name) - Counter(field.name, to_field) + fields = model._meta.get_fields() + for field in fields: + if type(field) is CounterCacheField: + to_model = apps.get_model(field.to_model_name) + to_field = getattr(to_model, field.to_field_name) + Counter(field.name, to_field) diff --git a/netbox/utilities/tests/test_counters.py b/netbox/utilities/tests/test_counters.py index d492f7935..f554fc07f 100644 --- a/netbox/utilities/tests/test_counters.py +++ b/netbox/utilities/tests/test_counters.py @@ -26,7 +26,7 @@ class CountersTest(TestCase): def test_interface_count_addition(self): """ - When a new Cable is created, it must be cached on either termination point. + When a tracked object (Interface) is added the tracking counter should be updated. """ device1 = Device.objects.get(name='TestDevice1') device2 = Device.objects.get(name='TestDevice2') @@ -43,8 +43,7 @@ class CountersTest(TestCase): def test_interface_count_deletion(self): """ - When a Cable is deleted, the `cable` field on its termination points must be nullified. The str() method - should still return the PK of the string even after being nullified. + When a tracked object (Interface) is deleted the tracking counter should be updated. """ device1 = Device.objects.get(name='TestDevice1') device2 = Device.objects.get(name='TestDevice2') diff --git a/netbox/virtualization/apps.py b/netbox/virtualization/apps.py index 32e895b0b..6dae005c7 100644 --- a/netbox/virtualization/apps.py +++ b/netbox/virtualization/apps.py @@ -6,6 +6,7 @@ class VirtualizationConfig(AppConfig): def ready(self): from . import search + from .models import VirtualMachine from utilities.counter import connect_counters - connect_counters(self) + connect_counters([VirtualMachine,])