diff --git a/netbox/dcim/migrations/0175_device__console_port_count_and_more.py b/netbox/dcim/migrations/0175_device_component_counters.py similarity index 55% rename from netbox/dcim/migrations/0175_device__console_port_count_and_more.py rename to netbox/dcim/migrations/0175_device_component_counters.py index 426902cfe..8327a2192 100644 --- a/netbox/dcim/migrations/0175_device__console_port_count_and_more.py +++ b/netbox/dcim/migrations/0175_device_component_counters.py @@ -1,46 +1,45 @@ -# Generated by Django 4.2.2 on 2023-06-23 19:26 - from django.db import migrations -import utilities.fields from django.db.models import Count +import utilities.fields + def recalculate_device_counts(apps, schema_editor): Device = apps.get_model("dcim", "Device") devices = list(Device.objects.all().annotate( - console_port_count=Count('consoleports', distinct=True), - console_server_port_count=Count('consoleserverports', 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), - inventory_item_count=Count('inventoryitems', distinct=True), - power_port_count=Count('powerports', distinct=True), - power_outlet_count=Count('poweroutlets', distinct=True), + _console_port_count=Count('consoleports', distinct=True), + _console_server_port_count=Count('consoleserverports', 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), + _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._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._inventory_item_count = device.inventory_item_count - device._power_port_count = device.power_port_count - device._power_outlet_count = device.power_outlet_count + device.console_port_count = device._console_port_count + device.console_server_port_count = device._console_server_port_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.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'], + ['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'], ) @@ -52,47 +51,47 @@ class Migration(migrations.Migration): operations = [ migrations.AddField( model_name='device', - name='_console_port_count', + name='console_port_count', field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.ConsolePort'), ), migrations.AddField( model_name='device', - name='_console_server_port_count', + name='console_server_port_count', field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.ConsoleServerPort'), ), migrations.AddField( model_name='device', - name='_device_bay_count', + 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', + 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', + 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', + name='inventory_item_count', field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.InventoryItem'), ), migrations.AddField( model_name='device', - name='_power_outlet_count', + name='power_outlet_count', field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.PowerOutlet'), ), migrations.AddField( model_name='device', - name='_power_port_count', + name='power_port_count', field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.PowerPort'), ), migrations.AddField( model_name='device', - name='_rear_port_count', + name='rear_port_count', field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.RearPort'), ), migrations.RunPython( diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 4ea980f5e..cf5853e9c 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -639,15 +639,43 @@ class Device(PrimaryModel, ConfigContextModel): help_text=_("GPS coordinate in decimal format (xx.yyyyyy)") ) - _console_port_count = CounterCacheField(to_model='dcim.ConsolePort', to_field='device') - _console_server_port_count = CounterCacheField(to_model='dcim.ConsoleServerPort', to_field='device') - _power_port_count = CounterCacheField(to_model='dcim.PowerPort', to_field='device') - _power_outlet_count = CounterCacheField(to_model='dcim.PowerOutlet', to_field='device') - _interface_count = CounterCacheField(to_model='dcim.Interface', to_field='device') - _front_port_count = CounterCacheField(to_model='dcim.FrontPort', to_field='device') - _rear_port_count = CounterCacheField(to_model='dcim.RearPort', to_field='device') - _device_bay_count = CounterCacheField(to_model='dcim.DeviceBay', to_field='device') - _inventory_item_count = CounterCacheField(to_model='dcim.InventoryItem', to_field='device') + # Counter fields + console_port_count = CounterCacheField( + to_model='dcim.ConsolePort', + to_field='device' + ) + console_server_port_count = CounterCacheField( + to_model='dcim.ConsoleServerPort', + to_field='device' + ) + power_port_count = CounterCacheField( + to_model='dcim.PowerPort', + to_field='device' + ) + power_outlet_count = CounterCacheField( + to_model='dcim.PowerOutlet', + to_field='device' + ) + interface_count = CounterCacheField( + to_model='dcim.Interface', + to_field='device' + ) + front_port_count = CounterCacheField( + to_model='dcim.FrontPort', + to_field='device' + ) + rear_port_count = CounterCacheField( + to_model='dcim.RearPort', + to_field='device' + ) + device_bay_count = CounterCacheField( + to_model='dcim.DeviceBay', + to_field='device' + ) + inventory_item_count = CounterCacheField( + to_model='dcim.InventoryItem', + to_field='device' + ) # Generic relations contacts = GenericRelation( diff --git a/netbox/utilities/fields.py b/netbox/utilities/fields.py index 4c17e77d2..ca1342df7 100644 --- a/netbox/utilities/fields.py +++ b/netbox/utilities/fields.py @@ -174,7 +174,9 @@ class CounterCacheField(models.BigIntegerField): self.to_model_name = to_model self.to_field_name = to_field + kwargs['default'] = kwargs.get('default', 0) + kwargs['editable'] = False super().__init__(*args, **kwargs) diff --git a/netbox/virtualization/migrations/0035_virtualmachine__interface_count.py b/netbox/virtualization/migrations/0035_virtualmachine_interface_count.py similarity index 72% rename from netbox/virtualization/migrations/0035_virtualmachine__interface_count.py rename to netbox/virtualization/migrations/0035_virtualmachine_interface_count.py index 78a270f6a..5f52d32e0 100644 --- a/netbox/virtualization/migrations/0035_virtualmachine__interface_count.py +++ b/netbox/virtualization/migrations/0035_virtualmachine_interface_count.py @@ -1,19 +1,18 @@ -# Generated by Django 4.1.8 on 2023-05-16 21:20 - from django.db import migrations -import utilities.fields from django.db.models import Count +import utilities.fields + def populate_virtualmachine_counts(apps, schema_editor): VirtualMachine = apps.get_model('virtualization', 'VirtualMachine') - vms = list(VirtualMachine.objects.annotate(interface_count=Count('interfaces', distinct=True))) + vms = list(VirtualMachine.objects.annotate(_interface_count=Count('interfaces', distinct=True))) for vm in vms: - vm._interface_count = vm.interface_count + vm.interface_count = vm._interface_count - VirtualMachine.objects.bulk_update(vms, ['_interface_count']) + VirtualMachine.objects.bulk_update(vms, ['interface_count']) class Migration(migrations.Migration): @@ -24,7 +23,7 @@ class Migration(migrations.Migration): operations = [ migrations.AddField( model_name='virtualmachine', - name='_interface_count', + name='interface_count', field=utilities.fields.CounterCacheField( default=0, to_field='virtual_machine', to_model='virtualization.VMInterface' ), diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index 04cf5108f..7a321c328 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -121,7 +121,11 @@ class VirtualMachine(PrimaryModel, ConfigContextModel): verbose_name='Disk (GB)' ) - _interface_count = CounterCacheField(to_model='virtualization.VMInterface', to_field='virtual_machine') + # Counter fields + interface_count = CounterCacheField( + to_model='virtualization.VMInterface', + to_field='virtual_machine' + ) # Generic relation contacts = GenericRelation(