diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 178ab2a36..835592161 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -678,6 +678,7 @@ class DeviceSerializer(NetBoxModelSerializer): front_port_count = serializers.IntegerField(read_only=True) rear_port_count = serializers.IntegerField(read_only=True) device_bay_count = serializers.IntegerField(read_only=True) + module_bay_count = serializers.IntegerField(read_only=True) inventory_item_count = serializers.IntegerField(read_only=True) class Meta: @@ -689,7 +690,7 @@ class DeviceSerializer(NetBoxModelSerializer): 'vc_priority', 'description', 'comments', 'config_template', 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated', 'console_port_count', 'console_server_port_count', 'power_port_count', 'power_outlet_count', 'interface_count', 'front_port_count', 'rear_port_count', 'device_bay_count', - 'inventory_item_count', + 'module_bay_count', 'inventory_item_count', ] @extend_schema_field(NestedDeviceSerializer) @@ -715,7 +716,7 @@ class DeviceWithConfigContextSerializer(DeviceSerializer): 'comments', 'local_context_data', 'tags', 'custom_fields', 'config_context', 'config_template', 'created', 'last_updated', 'console_port_count', 'console_server_port_count', 'power_port_count', 'power_outlet_count', 'interface_count', 'front_port_count', 'rear_port_count', 'device_bay_count', - 'inventory_item_count', + 'module_bay_count', 'inventory_item_count', ] @extend_schema_field(serializers.JSONField(allow_null=True)) diff --git a/netbox/dcim/migrations/0175_device_component_counters.py b/netbox/dcim/migrations/0175_device_component_counters.py index 8327a2192..9d033c103 100644 --- a/netbox/dcim/migrations/0175_device_component_counters.py +++ b/netbox/dcim/migrations/0175_device_component_counters.py @@ -9,38 +9,32 @@ def recalculate_device_counts(apps, schema_editor): devices = list(Device.objects.all().annotate( _console_port_count=Count('consoleports', distinct=True), _console_server_port_count=Count('consoleserverports', distinct=True), + _power_port_count=Count('powerports', distinct=True), + _power_outlet_count=Count('poweroutlets', distinct=True), _interface_count=Count('interfaces', distinct=True), _front_port_count=Count('frontports', distinct=True), _rear_port_count=Count('rearports', distinct=True), _device_bay_count=Count('devicebays', distinct=True), + _module_bay_count=Count('modulebays', distinct=True), _inventory_item_count=Count('inventoryitems', distinct=True), - _power_port_count=Count('powerports', distinct=True), - _power_outlet_count=Count('poweroutlets', distinct=True), )) for device in devices: device.console_port_count = device._console_port_count device.console_server_port_count = device._console_server_port_count + device.power_port_count = device._power_port_count + device.power_outlet_count = device._power_outlet_count device.interface_count = device._interface_count device.front_port_count = device._front_port_count device.rear_port_count = device._rear_port_count device.device_bay_count = device._device_bay_count + device.module_bay_count = device._module_bay_count device.inventory_item_count = device._inventory_item_count - device.power_port_count = device._power_port_count - device.power_outlet_count = device._power_outlet_count - Device.objects.bulk_update( - devices, - ['console_port_count', - 'console_server_port_count', - 'interface_count', - 'front_port_count', - 'rear_port_count', - 'device_bay_count', - 'inventory_item_count', - 'power_port_count', - 'power_outlet_count'], - ) + Device.objects.bulk_update(devices, [ + 'console_port_count', 'console_server_port_count', 'power_port_count', 'power_outlet_count', 'interface_count', + 'front_port_count', 'rear_port_count', 'device_bay_count', 'module_bay_count', 'inventory_item_count', + ]) class Migration(migrations.Migration): @@ -61,23 +55,8 @@ class Migration(migrations.Migration): ), migrations.AddField( model_name='device', - name='device_bay_count', - field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.DeviceBay'), - ), - migrations.AddField( - model_name='device', - name='front_port_count', - field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.FrontPort'), - ), - migrations.AddField( - model_name='device', - name='interface_count', - field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.Interface'), - ), - migrations.AddField( - model_name='device', - name='inventory_item_count', - field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.InventoryItem'), + name='power_port_count', + field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.PowerPort'), ), migrations.AddField( model_name='device', @@ -86,14 +65,34 @@ class Migration(migrations.Migration): ), migrations.AddField( model_name='device', - name='power_port_count', - field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.PowerPort'), + name='interface_count', + field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.Interface'), + ), + migrations.AddField( + model_name='device', + name='front_port_count', + field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.FrontPort'), ), migrations.AddField( model_name='device', name='rear_port_count', field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.RearPort'), ), + migrations.AddField( + model_name='device', + name='device_bay_count', + field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.DeviceBay'), + ), + migrations.AddField( + model_name='device', + name='module_bay_count', + field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.ModuleBay'), + ), + migrations.AddField( + model_name='device', + name='inventory_item_count', + field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.InventoryItem'), + ), migrations.RunPython( recalculate_device_counts, reverse_code=migrations.RunPython.noop diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index cf5853e9c..48b916a31 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -672,6 +672,10 @@ class Device(PrimaryModel, ConfigContextModel): to_model='dcim.DeviceBay', to_field='device' ) + module_bay_count = CounterCacheField( + to_model='dcim.ModuleBay', + to_field='device' + ) inventory_item_count = CounterCacheField( to_model='dcim.InventoryItem', to_field='device' diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 450b4ad2e..77d53f0ec 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -254,6 +254,9 @@ class DeviceTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): device_bay_count = tables.Column( verbose_name=_('Device bays') ) + module_bay_count = tables.Column( + verbose_name=_('Module bays') + ) inventory_item_count = tables.Column( verbose_name=_('Inventory items') )