admin.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. from django.contrib import admin
  2. from django.db.models import Count
  3. from mptt.admin import MPTTModelAdmin
  4. from .models import (
  5. ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
  6. DeviceBayTemplate, DeviceRole, DeviceType, Interface, InterfaceTemplate, Manufacturer, Module, Platform,
  7. PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, Region,
  8. Site,
  9. )
  10. @admin.register(Region)
  11. class RegionAdmin(MPTTModelAdmin):
  12. list_display = ['name', 'parent', 'slug']
  13. prepopulated_fields = {
  14. 'slug': ['name'],
  15. }
  16. @admin.register(Site)
  17. class SiteAdmin(admin.ModelAdmin):
  18. list_display = ['name', 'slug', 'facility', 'asn']
  19. prepopulated_fields = {
  20. 'slug': ['name'],
  21. }
  22. @admin.register(RackGroup)
  23. class RackGroupAdmin(admin.ModelAdmin):
  24. list_display = ['name', 'slug', 'site']
  25. prepopulated_fields = {
  26. 'slug': ['name'],
  27. }
  28. @admin.register(RackRole)
  29. class RackRoleAdmin(admin.ModelAdmin):
  30. list_display = ['name', 'slug', 'color']
  31. prepopulated_fields = {
  32. 'slug': ['name'],
  33. }
  34. @admin.register(Rack)
  35. class RackAdmin(admin.ModelAdmin):
  36. list_display = ['name', 'facility_id', 'site', 'group', 'tenant', 'role', 'type', 'width', 'u_height']
  37. @admin.register(RackReservation)
  38. class RackRackReservationAdmin(admin.ModelAdmin):
  39. list_display = ['rack', 'units', 'description', 'user', 'created']
  40. #
  41. # Device types
  42. #
  43. @admin.register(Manufacturer)
  44. class ManufacturerAdmin(admin.ModelAdmin):
  45. prepopulated_fields = {
  46. 'slug': ['name'],
  47. }
  48. list_display = ['name', 'slug']
  49. class ConsolePortTemplateAdmin(admin.TabularInline):
  50. model = ConsolePortTemplate
  51. class ConsoleServerPortTemplateAdmin(admin.TabularInline):
  52. model = ConsoleServerPortTemplate
  53. class PowerPortTemplateAdmin(admin.TabularInline):
  54. model = PowerPortTemplate
  55. class PowerOutletTemplateAdmin(admin.TabularInline):
  56. model = PowerOutletTemplate
  57. class InterfaceTemplateAdmin(admin.TabularInline):
  58. model = InterfaceTemplate
  59. class DeviceBayTemplateAdmin(admin.TabularInline):
  60. model = DeviceBayTemplate
  61. @admin.register(DeviceType)
  62. class DeviceTypeAdmin(admin.ModelAdmin):
  63. prepopulated_fields = {
  64. 'slug': ['model'],
  65. }
  66. inlines = [
  67. ConsolePortTemplateAdmin,
  68. ConsoleServerPortTemplateAdmin,
  69. PowerPortTemplateAdmin,
  70. PowerOutletTemplateAdmin,
  71. InterfaceTemplateAdmin,
  72. DeviceBayTemplateAdmin,
  73. ]
  74. list_display = ['model', 'manufacturer', 'slug', 'part_number', 'u_height', 'console_ports', 'console_server_ports',
  75. 'power_ports', 'power_outlets', 'interfaces', 'device_bays']
  76. list_filter = ['manufacturer']
  77. def get_queryset(self, request):
  78. return DeviceType.objects.annotate(
  79. console_port_count=Count('console_port_templates', distinct=True),
  80. cs_port_count=Count('cs_port_templates', distinct=True),
  81. power_port_count=Count('power_port_templates', distinct=True),
  82. power_outlet_count=Count('power_outlet_templates', distinct=True),
  83. interface_count=Count('interface_templates', distinct=True),
  84. devicebay_count=Count('device_bay_templates', distinct=True),
  85. )
  86. def console_ports(self, instance):
  87. return instance.console_port_count
  88. def console_server_ports(self, instance):
  89. return instance.cs_port_count
  90. def power_ports(self, instance):
  91. return instance.power_port_count
  92. def power_outlets(self, instance):
  93. return instance.power_outlet_count
  94. def interfaces(self, instance):
  95. return instance.interface_count
  96. def device_bays(self, instance):
  97. return instance.devicebay_count
  98. #
  99. # Devices
  100. #
  101. @admin.register(DeviceRole)
  102. class DeviceRoleAdmin(admin.ModelAdmin):
  103. prepopulated_fields = {
  104. 'slug': ['name'],
  105. }
  106. list_display = ['name', 'slug', 'color']
  107. @admin.register(Platform)
  108. class PlatformAdmin(admin.ModelAdmin):
  109. prepopulated_fields = {
  110. 'slug': ['name'],
  111. }
  112. list_display = ['name', 'rpc_client']
  113. class ConsolePortAdmin(admin.TabularInline):
  114. model = ConsolePort
  115. readonly_fields = ['cs_port']
  116. class ConsoleServerPortAdmin(admin.TabularInline):
  117. model = ConsoleServerPort
  118. class PowerPortAdmin(admin.TabularInline):
  119. model = PowerPort
  120. readonly_fields = ['power_outlet']
  121. class PowerOutletAdmin(admin.TabularInline):
  122. model = PowerOutlet
  123. class InterfaceAdmin(admin.TabularInline):
  124. model = Interface
  125. class DeviceBayAdmin(admin.TabularInline):
  126. model = DeviceBay
  127. fk_name = 'device'
  128. readonly_fields = ['installed_device']
  129. class ModuleAdmin(admin.TabularInline):
  130. model = Module
  131. readonly_fields = ['parent', 'discovered']
  132. @admin.register(Device)
  133. class DeviceAdmin(admin.ModelAdmin):
  134. inlines = [
  135. ConsolePortAdmin,
  136. ConsoleServerPortAdmin,
  137. PowerPortAdmin,
  138. PowerOutletAdmin,
  139. InterfaceAdmin,
  140. DeviceBayAdmin,
  141. ModuleAdmin,
  142. ]
  143. list_display = ['display_name', 'device_type_full_name', 'device_role', 'primary_ip', 'rack', 'position', 'asset_tag',
  144. 'serial']
  145. list_filter = ['device_role']
  146. def get_queryset(self, request):
  147. qs = super(DeviceAdmin, self).get_queryset(request)
  148. return qs.select_related('device_type__manufacturer', 'device_role', 'primary_ip4', 'primary_ip6', 'rack')
  149. def device_type_full_name(self, obj):
  150. return obj.device_type.full_name
  151. device_type_full_name.short_description = 'Device type'