0175_device_component_counters.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from django.db import migrations
  2. from django.db.models import Count
  3. import utilities.fields
  4. def recalculate_device_counts(apps, schema_editor):
  5. Device = apps.get_model("dcim", "Device")
  6. devices = list(Device.objects.all().annotate(
  7. _console_port_count=Count('consoleports', distinct=True),
  8. _console_server_port_count=Count('consoleserverports', distinct=True),
  9. _power_port_count=Count('powerports', distinct=True),
  10. _power_outlet_count=Count('poweroutlets', distinct=True),
  11. _interface_count=Count('interfaces', distinct=True),
  12. _front_port_count=Count('frontports', distinct=True),
  13. _rear_port_count=Count('rearports', distinct=True),
  14. _device_bay_count=Count('devicebays', distinct=True),
  15. _module_bay_count=Count('modulebays', distinct=True),
  16. _inventory_item_count=Count('inventoryitems', distinct=True),
  17. ))
  18. for device in devices:
  19. device.console_port_count = device._console_port_count
  20. device.console_server_port_count = device._console_server_port_count
  21. device.power_port_count = device._power_port_count
  22. device.power_outlet_count = device._power_outlet_count
  23. device.interface_count = device._interface_count
  24. device.front_port_count = device._front_port_count
  25. device.rear_port_count = device._rear_port_count
  26. device.device_bay_count = device._device_bay_count
  27. device.module_bay_count = device._module_bay_count
  28. device.inventory_item_count = device._inventory_item_count
  29. Device.objects.bulk_update(devices, [
  30. 'console_port_count', 'console_server_port_count', 'power_port_count', 'power_outlet_count', 'interface_count',
  31. 'front_port_count', 'rear_port_count', 'device_bay_count', 'module_bay_count', 'inventory_item_count',
  32. ])
  33. class Migration(migrations.Migration):
  34. dependencies = [
  35. ('dcim', '0174_rack_starting_unit'),
  36. ]
  37. operations = [
  38. migrations.AddField(
  39. model_name='device',
  40. name='console_port_count',
  41. field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.ConsolePort'),
  42. ),
  43. migrations.AddField(
  44. model_name='device',
  45. name='console_server_port_count',
  46. field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.ConsoleServerPort'),
  47. ),
  48. migrations.AddField(
  49. model_name='device',
  50. name='power_port_count',
  51. field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.PowerPort'),
  52. ),
  53. migrations.AddField(
  54. model_name='device',
  55. name='power_outlet_count',
  56. field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.PowerOutlet'),
  57. ),
  58. migrations.AddField(
  59. model_name='device',
  60. name='interface_count',
  61. field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.Interface'),
  62. ),
  63. migrations.AddField(
  64. model_name='device',
  65. name='front_port_count',
  66. field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.FrontPort'),
  67. ),
  68. migrations.AddField(
  69. model_name='device',
  70. name='rear_port_count',
  71. field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.RearPort'),
  72. ),
  73. migrations.AddField(
  74. model_name='device',
  75. name='device_bay_count',
  76. field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.DeviceBay'),
  77. ),
  78. migrations.AddField(
  79. model_name='device',
  80. name='module_bay_count',
  81. field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.ModuleBay'),
  82. ),
  83. migrations.AddField(
  84. model_name='device',
  85. name='inventory_item_count',
  86. field=utilities.fields.CounterCacheField(default=0, to_field='device', to_model='dcim.InventoryItem'),
  87. ),
  88. migrations.RunPython(
  89. recalculate_device_counts,
  90. reverse_code=migrations.RunPython.noop
  91. ),
  92. ]