nested_serializers.py 15 KB

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