nested_serializers.py 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. from rest_framework import serializers
  2. from dcim import models
  3. from netbox.api.serializers import BaseModelSerializer, WritableNestedSerializer
  4. __all__ = [
  5. 'ComponentNestedModuleSerializer',
  6. 'NestedCableSerializer',
  7. 'NestedConsolePortSerializer',
  8. 'NestedConsolePortTemplateSerializer',
  9. 'NestedConsoleServerPortSerializer',
  10. 'NestedConsoleServerPortTemplateSerializer',
  11. 'NestedDeviceBaySerializer',
  12. 'NestedDeviceBayTemplateSerializer',
  13. 'NestedDeviceRoleSerializer',
  14. 'NestedDeviceSerializer',
  15. 'NestedDeviceTypeSerializer',
  16. 'NestedFrontPortSerializer',
  17. 'NestedFrontPortTemplateSerializer',
  18. 'NestedInterfaceSerializer',
  19. 'NestedInterfaceTemplateSerializer',
  20. 'NestedInventoryItemSerializer',
  21. 'NestedManufacturerSerializer',
  22. 'NestedModuleBaySerializer',
  23. 'NestedModuleBayTemplateSerializer',
  24. 'NestedModuleSerializer',
  25. 'NestedModuleTypeSerializer',
  26. 'NestedPlatformSerializer',
  27. 'NestedPowerFeedSerializer',
  28. 'NestedPowerOutletSerializer',
  29. 'NestedPowerOutletTemplateSerializer',
  30. 'NestedPowerPanelSerializer',
  31. 'NestedPowerPortSerializer',
  32. 'NestedPowerPortTemplateSerializer',
  33. 'NestedLocationSerializer',
  34. 'NestedRackReservationSerializer',
  35. 'NestedRackRoleSerializer',
  36. 'NestedRackSerializer',
  37. 'NestedRearPortSerializer',
  38. 'NestedRearPortTemplateSerializer',
  39. 'NestedRegionSerializer',
  40. 'NestedSiteSerializer',
  41. 'NestedSiteGroupSerializer',
  42. 'NestedVirtualChassisSerializer',
  43. ]
  44. #
  45. # Regions/sites
  46. #
  47. class NestedRegionSerializer(WritableNestedSerializer):
  48. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail')
  49. site_count = serializers.IntegerField(read_only=True)
  50. _depth = serializers.IntegerField(source='level', read_only=True)
  51. class Meta:
  52. model = models.Region
  53. fields = ['id', 'url', 'display', 'name', 'slug', 'site_count', '_depth']
  54. class NestedSiteGroupSerializer(WritableNestedSerializer):
  55. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:sitegroup-detail')
  56. site_count = serializers.IntegerField(read_only=True)
  57. _depth = serializers.IntegerField(source='level', read_only=True)
  58. class Meta:
  59. model = models.SiteGroup
  60. fields = ['id', 'url', 'display', 'name', 'slug', 'site_count', '_depth']
  61. class NestedSiteSerializer(WritableNestedSerializer):
  62. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail')
  63. class Meta:
  64. model = models.Site
  65. fields = ['id', 'url', 'display', 'name', 'slug']
  66. #
  67. # Racks
  68. #
  69. class NestedLocationSerializer(WritableNestedSerializer):
  70. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:location-detail')
  71. rack_count = serializers.IntegerField(read_only=True)
  72. _depth = serializers.IntegerField(source='level', read_only=True)
  73. class Meta:
  74. model = models.Location
  75. fields = ['id', 'url', 'display', 'name', 'slug', 'rack_count', '_depth']
  76. class NestedRackRoleSerializer(WritableNestedSerializer):
  77. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
  78. rack_count = serializers.IntegerField(read_only=True)
  79. class Meta:
  80. model = models.RackRole
  81. fields = ['id', 'url', 'display', 'name', 'slug', 'rack_count']
  82. class NestedRackSerializer(WritableNestedSerializer):
  83. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail')
  84. device_count = serializers.IntegerField(read_only=True)
  85. class Meta:
  86. model = models.Rack
  87. fields = ['id', 'url', 'display', 'name', 'device_count']
  88. class NestedRackReservationSerializer(WritableNestedSerializer):
  89. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackreservation-detail')
  90. user = serializers.SerializerMethodField(read_only=True)
  91. class Meta:
  92. model = models.RackReservation
  93. fields = ['id', 'url', 'display', 'user', 'units']
  94. def get_user(self, obj):
  95. return obj.user.username
  96. #
  97. # Device/module types
  98. #
  99. class NestedManufacturerSerializer(WritableNestedSerializer):
  100. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
  101. devicetype_count = serializers.IntegerField(read_only=True)
  102. class Meta:
  103. model = models.Manufacturer
  104. fields = ['id', 'url', 'display', 'name', 'slug', 'devicetype_count']
  105. class NestedDeviceTypeSerializer(WritableNestedSerializer):
  106. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
  107. manufacturer = NestedManufacturerSerializer(read_only=True)
  108. device_count = serializers.IntegerField(read_only=True)
  109. class Meta:
  110. model = models.DeviceType
  111. fields = ['id', 'url', 'display', 'manufacturer', 'model', 'slug', 'device_count']
  112. class NestedModuleTypeSerializer(WritableNestedSerializer):
  113. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:moduletype-detail')
  114. manufacturer = NestedManufacturerSerializer(read_only=True)
  115. # module_count = serializers.IntegerField(read_only=True)
  116. class Meta:
  117. model = models.ModuleType
  118. fields = ['id', 'url', 'display', 'manufacturer', 'model']
  119. #
  120. # Component templates
  121. #
  122. class NestedConsolePortTemplateSerializer(WritableNestedSerializer):
  123. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleporttemplate-detail')
  124. class Meta:
  125. model = models.ConsolePortTemplate
  126. fields = ['id', 'url', 'display', 'name']
  127. class NestedConsoleServerPortTemplateSerializer(WritableNestedSerializer):
  128. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverporttemplate-detail')
  129. class Meta:
  130. model = models.ConsoleServerPortTemplate
  131. fields = ['id', 'url', 'display', 'name']
  132. class NestedPowerPortTemplateSerializer(WritableNestedSerializer):
  133. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerporttemplate-detail')
  134. class Meta:
  135. model = models.PowerPortTemplate
  136. fields = ['id', 'url', 'display', 'name']
  137. class NestedPowerOutletTemplateSerializer(WritableNestedSerializer):
  138. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlettemplate-detail')
  139. class Meta:
  140. model = models.PowerOutletTemplate
  141. fields = ['id', 'url', 'display', 'name']
  142. class NestedInterfaceTemplateSerializer(WritableNestedSerializer):
  143. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfacetemplate-detail')
  144. class Meta:
  145. model = models.InterfaceTemplate
  146. fields = ['id', 'url', 'display', 'name']
  147. class NestedRearPortTemplateSerializer(WritableNestedSerializer):
  148. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail')
  149. class Meta:
  150. model = models.RearPortTemplate
  151. fields = ['id', 'url', 'display', 'name']
  152. class NestedFrontPortTemplateSerializer(WritableNestedSerializer):
  153. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail')
  154. class Meta:
  155. model = models.FrontPortTemplate
  156. fields = ['id', 'url', 'display', 'name']
  157. class NestedModuleBayTemplateSerializer(WritableNestedSerializer):
  158. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebaytemplate-detail')
  159. class Meta:
  160. model = models.ModuleBayTemplate
  161. fields = ['id', 'url', 'display', 'name']
  162. class NestedDeviceBayTemplateSerializer(WritableNestedSerializer):
  163. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebaytemplate-detail')
  164. class Meta:
  165. model = models.DeviceBayTemplate
  166. fields = ['id', 'url', 'display', 'name']
  167. #
  168. # Devices
  169. #
  170. class NestedDeviceRoleSerializer(WritableNestedSerializer):
  171. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail')
  172. device_count = serializers.IntegerField(read_only=True)
  173. virtualmachine_count = serializers.IntegerField(read_only=True)
  174. class Meta:
  175. model = models.DeviceRole
  176. fields = ['id', 'url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count']
  177. class NestedPlatformSerializer(WritableNestedSerializer):
  178. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail')
  179. device_count = serializers.IntegerField(read_only=True)
  180. virtualmachine_count = serializers.IntegerField(read_only=True)
  181. class Meta:
  182. model = models.Platform
  183. fields = ['id', 'url', 'display', 'name', 'slug', 'device_count', 'virtualmachine_count']
  184. class NestedDeviceSerializer(WritableNestedSerializer):
  185. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail')
  186. class Meta:
  187. model = models.Device
  188. fields = ['id', 'url', 'display', 'name']
  189. class ModuleNestedModuleBaySerializer(WritableNestedSerializer):
  190. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail')
  191. class Meta:
  192. model = models.ModuleBay
  193. fields = ['id', 'url', 'display', 'name']
  194. class ComponentNestedModuleSerializer(WritableNestedSerializer):
  195. """
  196. Used by device component serializers.
  197. """
  198. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail')
  199. module_bay = ModuleNestedModuleBaySerializer(read_only=True)
  200. class Meta:
  201. model = models.Module
  202. fields = ['id', 'url', 'display', 'device', 'module_bay']
  203. class NestedModuleSerializer(WritableNestedSerializer):
  204. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:module-detail')
  205. device = NestedDeviceSerializer(read_only=True)
  206. module_bay = ModuleNestedModuleBaySerializer(read_only=True)
  207. module_type = NestedModuleTypeSerializer(read_only=True)
  208. class Meta:
  209. model = models.Module
  210. fields = ['id', 'url', 'display', 'device', 'module_bay', 'module_type']
  211. class NestedConsoleServerPortSerializer(WritableNestedSerializer):
  212. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleserverport-detail')
  213. device = NestedDeviceSerializer(read_only=True)
  214. class Meta:
  215. model = models.ConsoleServerPort
  216. fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied']
  217. class NestedConsolePortSerializer(WritableNestedSerializer):
  218. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:consoleport-detail')
  219. device = NestedDeviceSerializer(read_only=True)
  220. class Meta:
  221. model = models.ConsolePort
  222. fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied']
  223. class NestedPowerOutletSerializer(WritableNestedSerializer):
  224. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:poweroutlet-detail')
  225. device = NestedDeviceSerializer(read_only=True)
  226. class Meta:
  227. model = models.PowerOutlet
  228. fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied']
  229. class NestedPowerPortSerializer(WritableNestedSerializer):
  230. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerport-detail')
  231. device = NestedDeviceSerializer(read_only=True)
  232. class Meta:
  233. model = models.PowerPort
  234. fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied']
  235. class NestedInterfaceSerializer(WritableNestedSerializer):
  236. device = NestedDeviceSerializer(read_only=True)
  237. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail')
  238. class Meta:
  239. model = models.Interface
  240. fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied']
  241. class NestedRearPortSerializer(WritableNestedSerializer):
  242. device = NestedDeviceSerializer(read_only=True)
  243. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail')
  244. class Meta:
  245. model = models.RearPort
  246. fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied']
  247. class NestedFrontPortSerializer(WritableNestedSerializer):
  248. device = NestedDeviceSerializer(read_only=True)
  249. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail')
  250. class Meta:
  251. model = models.FrontPort
  252. fields = ['id', 'url', 'display', 'device', 'name', 'cable', '_occupied']
  253. class NestedModuleBaySerializer(WritableNestedSerializer):
  254. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:modulebay-detail')
  255. module = NestedModuleSerializer(read_only=True)
  256. class Meta:
  257. model = models.ModuleBay
  258. fields = ['id', 'url', 'display', 'module', 'name']
  259. class NestedDeviceBaySerializer(WritableNestedSerializer):
  260. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail')
  261. device = NestedDeviceSerializer(read_only=True)
  262. class Meta:
  263. model = models.DeviceBay
  264. fields = ['id', 'url', 'display', 'device', 'name']
  265. class NestedInventoryItemSerializer(WritableNestedSerializer):
  266. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:inventoryitem-detail')
  267. device = NestedDeviceSerializer(read_only=True)
  268. _depth = serializers.IntegerField(source='level', read_only=True)
  269. class Meta:
  270. model = models.InventoryItem
  271. fields = ['id', 'url', 'display', 'device', 'name', '_depth']
  272. #
  273. # Cables
  274. #
  275. class NestedCableSerializer(BaseModelSerializer):
  276. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:cable-detail')
  277. class Meta:
  278. model = models.Cable
  279. fields = ['id', 'url', 'display', 'label']
  280. #
  281. # Virtual chassis
  282. #
  283. class NestedVirtualChassisSerializer(WritableNestedSerializer):
  284. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:virtualchassis-detail')
  285. master = NestedDeviceSerializer()
  286. member_count = serializers.IntegerField(read_only=True)
  287. class Meta:
  288. model = models.VirtualChassis
  289. fields = ['id', 'url', 'display', 'name', 'master', 'member_count']
  290. #
  291. # Power panels/feeds
  292. #
  293. class NestedPowerPanelSerializer(WritableNestedSerializer):
  294. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerpanel-detail')
  295. powerfeed_count = serializers.IntegerField(read_only=True)
  296. class Meta:
  297. model = models.PowerPanel
  298. fields = ['id', 'url', 'display', 'name', 'powerfeed_count']
  299. class NestedPowerFeedSerializer(WritableNestedSerializer):
  300. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:powerfeed-detail')
  301. class Meta:
  302. model = models.PowerFeed
  303. fields = ['id', 'url', 'display', 'name', 'cable', '_occupied']