diff --git a/netbox/dcim/apps.py b/netbox/dcim/apps.py index bfb09e601..8439cc1af 100644 --- a/netbox/dcim/apps.py +++ b/netbox/dcim/apps.py @@ -9,18 +9,45 @@ class DCIMConfig(AppConfig): def ready(self): from . import signals, search - from .models import CableTermination + from .models import ( + CableTermination, ConsolePort, ConsoleServerPort, DeviceBay, FrontPort, + Interface, InventoryItem, PowerOutlet, PowerPort, RearPort, + ) + + from utilities.counter import connect_counter # Register denormalized fields - denormalized.register(CableTermination, '_device', { - '_rack': 'rack', - '_location': 'location', - '_site': 'site', - }) - denormalized.register(CableTermination, '_rack', { - '_location': 'location', - '_site': 'site', - }) - denormalized.register(CableTermination, '_location', { - '_site': 'site', - }) + denormalized.register( + CableTermination, + '_device', + { + '_rack': 'rack', + '_location': 'location', + '_site': 'site', + }, + ) + denormalized.register( + CableTermination, + '_rack', + { + '_location': 'location', + '_site': 'site', + }, + ) + denormalized.register( + CableTermination, + '_location', + { + '_site': 'site', + }, + ) + + connect_counter('_console_port_count', ConsolePort.device) + connect_counter('_console_server_port_count', ConsoleServerPort.device) + connect_counter('_interface_count', Interface.device) + connect_counter('_front_port_count', FrontPort.device) + connect_counter('_rear_port_count', RearPort.device) + connect_counter('_device_bay_count', DeviceBay.device) + connect_counter('_inventory_item_count', InventoryItem.device) + connect_counter('_power_port_count', PowerPort.device) + connect_counter('_power_outlet_count', PowerOutlet.device) diff --git a/netbox/dcim/migrations/0174_device__console_port_count_and_more.py b/netbox/dcim/migrations/0174_device__console_port_count_and_more.py new file mode 100644 index 000000000..f03e2233c --- /dev/null +++ b/netbox/dcim/migrations/0174_device__console_port_count_and_more.py @@ -0,0 +1,58 @@ +# Generated by Django 4.1.8 on 2023-05-16 20:18 + +from django.db import migrations +import utilities.fields + + +class Migration(migrations.Migration): + dependencies = [ + ('dcim', '0173_remove_napalm_fields'), + ] + + operations = [ + migrations.AddField( + model_name='device', + name='_console_port_count', + field=utilities.fields.CounterCacheField(default=0), + ), + migrations.AddField( + model_name='device', + name='_console_server_port_count', + field=utilities.fields.CounterCacheField(default=0), + ), + migrations.AddField( + model_name='device', + name='_device_bay_count', + field=utilities.fields.CounterCacheField(default=0), + ), + migrations.AddField( + model_name='device', + name='_front_port_count', + field=utilities.fields.CounterCacheField(default=0), + ), + migrations.AddField( + model_name='device', + name='_interface_count', + field=utilities.fields.CounterCacheField(default=0), + ), + migrations.AddField( + model_name='device', + name='_inventory_item_count', + field=utilities.fields.CounterCacheField(default=0), + ), + migrations.AddField( + model_name='device', + name='_power_outlet_count', + field=utilities.fields.CounterCacheField(default=0), + ), + migrations.AddField( + model_name='device', + name='_power_port_count', + field=utilities.fields.CounterCacheField(default=0), + ), + migrations.AddField( + model_name='device', + name='_rear_port_count', + field=utilities.fields.CounterCacheField(default=0), + ), + ] diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index a908a6ab6..b47989344 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -21,7 +21,7 @@ from extras.querysets import ConfigContextModelQuerySet from netbox.config import ConfigItem from netbox.models import OrganizationalModel, PrimaryModel from utilities.choices import ColorChoices -from utilities.fields import ColorField, NaturalOrderingField +from utilities.fields import ColorField, CounterCacheField, NaturalOrderingField from .device_components import * from .mixins import WeightMixin @@ -625,6 +625,16 @@ class Device(PrimaryModel, ConfigContextModel): null=True ) + _console_port_count = CounterCacheField() + _console_server_port_count = CounterCacheField() + _power_port_count = CounterCacheField() + _power_outlet_count = CounterCacheField() + _interface_count = CounterCacheField() + _front_port_count = CounterCacheField() + _rear_port_count = CounterCacheField() + _device_bay_count = CounterCacheField() + _inventory_item_count = CounterCacheField() + # Generic relations contacts = GenericRelation( to='tenancy.ContactAssignment'