nested_serializers.py 16 KB

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