nested_serializers.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. from rest_framework import serializers
  2. from dcim.constants import CONNECTION_STATUS_CHOICES
  3. from dcim.models import (
  4. Cable, ConsolePort, ConsoleServerPort, Device, DeviceBay, DeviceType, DeviceRole, FrontPort, FrontPortTemplate,
  5. Interface, Manufacturer, Platform, PowerFeed, PowerOutlet, PowerPanel, PowerPort, PowerPortTemplate, Rack,
  6. RackGroup, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis,
  7. )
  8. from utilities.api import ChoiceField, WritableNestedSerializer
  9. __all__ = [
  10. 'NestedCableSerializer',
  11. 'NestedConsolePortSerializer',
  12. 'NestedConsoleServerPortSerializer',
  13. 'NestedDeviceBaySerializer',
  14. 'NestedDeviceRoleSerializer',
  15. 'NestedDeviceSerializer',
  16. 'NestedDeviceTypeSerializer',
  17. 'NestedFrontPortSerializer',
  18. 'NestedFrontPortTemplateSerializer',
  19. 'NestedInterfaceSerializer',
  20. 'NestedManufacturerSerializer',
  21. 'NestedPlatformSerializer',
  22. 'NestedPowerFeedSerializer',
  23. 'NestedPowerOutletSerializer',
  24. 'NestedPowerPanelSerializer',
  25. 'NestedPowerPortSerializer',
  26. 'NestedPowerPortTemplateSerializer',
  27. 'NestedRackGroupSerializer',
  28. 'NestedRackRoleSerializer',
  29. 'NestedRackSerializer',
  30. 'NestedRearPortSerializer',
  31. 'NestedRearPortTemplateSerializer',
  32. 'NestedRegionSerializer',
  33. 'NestedSiteSerializer',
  34. 'NestedVirtualChassisSerializer',
  35. ]
  36. #
  37. # Regions/sites
  38. #
  39. class NestedRegionSerializer(WritableNestedSerializer):
  40. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail')
  41. site_count = serializers.IntegerField(read_only=True)
  42. class Meta:
  43. model = Region
  44. fields = ['id', 'url', 'name', 'slug', 'site_count']
  45. class NestedSiteSerializer(WritableNestedSerializer):
  46. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail')
  47. class Meta:
  48. model = Site
  49. fields = ['id', 'url', 'name', 'slug']
  50. #
  51. # Racks
  52. #
  53. class NestedRackGroupSerializer(WritableNestedSerializer):
  54. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackgroup-detail')
  55. rack_count = serializers.IntegerField(read_only=True)
  56. class Meta:
  57. model = RackGroup
  58. fields = ['id', 'url', 'name', 'slug', 'rack_count']
  59. class NestedRackRoleSerializer(WritableNestedSerializer):
  60. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
  61. rack_count = serializers.IntegerField(read_only=True)
  62. class Meta:
  63. model = RackRole
  64. fields = ['id', 'url', 'name', 'slug', 'rack_count']
  65. class NestedRackSerializer(WritableNestedSerializer):
  66. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail')
  67. device_count = serializers.IntegerField(read_only=True)
  68. class Meta:
  69. model = Rack
  70. fields = ['id', 'url', 'name', 'display_name', 'device_count']
  71. #
  72. # Device types
  73. #
  74. class NestedManufacturerSerializer(WritableNestedSerializer):
  75. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
  76. devicetype_count = serializers.IntegerField(read_only=True)
  77. class Meta:
  78. model = Manufacturer
  79. fields = ['id', 'url', 'name', 'slug', 'devicetype_count']
  80. class NestedDeviceTypeSerializer(WritableNestedSerializer):
  81. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
  82. manufacturer = NestedManufacturerSerializer(read_only=True)
  83. device_count = serializers.IntegerField(read_only=True)
  84. class Meta:
  85. model = DeviceType
  86. fields = ['id', 'url', 'manufacturer', 'model', 'slug', 'display_name', 'device_count']
  87. class NestedPowerPortTemplateSerializer(WritableNestedSerializer):
  88. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail')
  89. class Meta:
  90. model = PowerPortTemplate
  91. fields = ['id', 'url', 'name']
  92. class NestedRearPortTemplateSerializer(WritableNestedSerializer):
  93. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail')
  94. class Meta:
  95. model = RearPortTemplate
  96. fields = ['id', 'url', 'name']
  97. class NestedFrontPortTemplateSerializer(WritableNestedSerializer):
  98. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail')
  99. class Meta:
  100. model = FrontPortTemplate
  101. fields = ['id', 'url', 'name']
  102. #
  103. # Devices
  104. #
  105. class NestedDeviceRoleSerializer(WritableNestedSerializer):
  106. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail')
  107. device_count = serializers.IntegerField(read_only=True)
  108. virtualmachine_count = serializers.IntegerField(read_only=True)
  109. class Meta:
  110. model = DeviceRole
  111. fields = ['id', 'url', 'name', 'slug', 'device_count', 'virtualmachine_count']
  112. class NestedPlatformSerializer(WritableNestedSerializer):
  113. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail')
  114. device_count = serializers.IntegerField(read_only=True)
  115. virtualmachine_count = serializers.IntegerField(read_only=True)
  116. class Meta:
  117. model = Platform
  118. fields = ['id', 'url', 'name', 'slug', 'device_count', 'virtualmachine_count']
  119. class NestedDeviceSerializer(WritableNestedSerializer):
  120. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail')
  121. class Meta:
  122. model = Device
  123. fields = ['id', 'url', 'name', 'display_name']
  124. class NestedConsoleServerPortSerializer(WritableNestedSerializer):
  125. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail')
  126. device = NestedDeviceSerializer(read_only=True)
  127. connection_status = ChoiceField(choices=CONNECTION_STATUS_CHOICES, read_only=True)
  128. class Meta:
  129. model = ConsoleServerPort
  130. fields = ['id', 'url', 'device', 'name', 'cable', 'connection_status']
  131. class NestedConsolePortSerializer(WritableNestedSerializer):
  132. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail')
  133. device = NestedDeviceSerializer(read_only=True)
  134. connection_status = ChoiceField(choices=CONNECTION_STATUS_CHOICES, read_only=True)
  135. class Meta:
  136. model = ConsolePort
  137. fields = ['id', 'url', 'device', 'name', 'cable', 'connection_status']
  138. class NestedPowerOutletSerializer(WritableNestedSerializer):
  139. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail')
  140. device = NestedDeviceSerializer(read_only=True)
  141. connection_status = ChoiceField(choices=CONNECTION_STATUS_CHOICES, read_only=True)
  142. class Meta:
  143. model = PowerOutlet
  144. fields = ['id', 'url', 'device', 'name', 'cable', 'connection_status']
  145. class NestedPowerPortSerializer(WritableNestedSerializer):
  146. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail')
  147. device = NestedDeviceSerializer(read_only=True)
  148. connection_status = ChoiceField(choices=CONNECTION_STATUS_CHOICES, read_only=True)
  149. class Meta:
  150. model = PowerPort
  151. fields = ['id', 'url', 'device', 'name', 'cable', 'connection_status']
  152. class NestedInterfaceSerializer(WritableNestedSerializer):
  153. device = NestedDeviceSerializer(read_only=True)
  154. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail')
  155. connection_status = ChoiceField(choices=CONNECTION_STATUS_CHOICES, read_only=True)
  156. class Meta:
  157. model = Interface
  158. fields = ['id', 'url', 'device', 'name', 'cable', 'connection_status']
  159. class NestedRearPortSerializer(WritableNestedSerializer):
  160. device = NestedDeviceSerializer(read_only=True)
  161. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail')
  162. class Meta:
  163. model = RearPort
  164. fields = ['id', 'url', 'device', 'name', 'cable']
  165. class NestedFrontPortSerializer(WritableNestedSerializer):
  166. device = NestedDeviceSerializer(read_only=True)
  167. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail')
  168. class Meta:
  169. model = FrontPort
  170. fields = ['id', 'url', 'device', 'name', 'cable']
  171. class NestedDeviceBaySerializer(WritableNestedSerializer):
  172. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail')
  173. device = NestedDeviceSerializer(read_only=True)
  174. class Meta:
  175. model = DeviceBay
  176. fields = ['id', 'url', 'device', 'name']
  177. #
  178. # Cables
  179. #
  180. class NestedCableSerializer(serializers.ModelSerializer):
  181. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail')
  182. class Meta:
  183. model = Cable
  184. fields = ['id', 'url', 'label']
  185. #
  186. # Virtual chassis
  187. #
  188. class NestedVirtualChassisSerializer(WritableNestedSerializer):
  189. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail')
  190. master = NestedDeviceSerializer()
  191. member_count = serializers.IntegerField(read_only=True)
  192. class Meta:
  193. model = VirtualChassis
  194. fields = ['id', 'url', 'master', 'member_count']
  195. #
  196. # Power panels/feeds
  197. #
  198. class NestedPowerPanelSerializer(WritableNestedSerializer):
  199. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail')
  200. powerfeed_count = serializers.IntegerField(read_only=True)
  201. class Meta:
  202. model = PowerPanel
  203. fields = ['id', 'url', 'name', 'powerfeed_count']
  204. class NestedPowerFeedSerializer(WritableNestedSerializer):
  205. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail')
  206. class Meta:
  207. model = PowerFeed
  208. fields = ['id', 'url', 'name']