nested_serializers.py 16 KB

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