serializers.py 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767
  1. from __future__ import unicode_literals
  2. from collections import OrderedDict
  3. from rest_framework import serializers
  4. from rest_framework.validators import UniqueTogetherValidator
  5. from ipam.models import IPAddress
  6. from circuits.models import Circuit, CircuitTermination
  7. from dcim.models import (
  8. CONNECTION_STATUS_CHOICES, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device,
  9. DeviceBay, DeviceBayTemplate, DeviceType, DeviceRole, IFACE_FF_CHOICES, IFACE_ORDERING_CHOICES, Interface,
  10. InterfaceConnection, InterfaceTemplate, Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate,
  11. PowerPort, PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, RACK_FACE_CHOICES, RACK_TYPE_CHOICES,
  12. RACK_WIDTH_CHOICES, Region, Site, STATUS_CHOICES, SUBDEVICE_ROLE_CHOICES,
  13. )
  14. from extras.api.customfields import CustomFieldModelSerializer
  15. from tenancy.api.serializers import NestedTenantSerializer
  16. from utilities.api import ChoiceFieldSerializer, ValidatedModelSerializer
  17. from virtualization.models import Cluster
  18. #
  19. # Regions
  20. #
  21. class NestedRegionSerializer(serializers.ModelSerializer):
  22. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:region-detail')
  23. class Meta:
  24. model = Region
  25. fields = ['id', 'url', 'name', 'slug']
  26. class RegionSerializer(serializers.ModelSerializer):
  27. parent = NestedRegionSerializer()
  28. class Meta:
  29. model = Region
  30. fields = ['id', 'name', 'slug', 'parent']
  31. class WritableRegionSerializer(ValidatedModelSerializer):
  32. class Meta:
  33. model = Region
  34. fields = ['id', 'name', 'slug', 'parent']
  35. #
  36. # Sites
  37. #
  38. class SiteSerializer(CustomFieldModelSerializer):
  39. region = NestedRegionSerializer()
  40. tenant = NestedTenantSerializer()
  41. class Meta:
  42. model = Site
  43. fields = [
  44. 'id', 'name', 'slug', 'region', 'tenant', 'facility', 'asn', 'physical_address', 'shipping_address',
  45. 'contact_name', 'contact_phone', 'contact_email', 'comments', 'custom_fields', 'count_prefixes',
  46. 'count_vlans', 'count_racks', 'count_devices', 'count_circuits',
  47. ]
  48. class NestedSiteSerializer(serializers.ModelSerializer):
  49. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:site-detail')
  50. class Meta:
  51. model = Site
  52. fields = ['id', 'url', 'name', 'slug']
  53. class WritableSiteSerializer(CustomFieldModelSerializer):
  54. class Meta:
  55. model = Site
  56. fields = [
  57. 'id', 'name', 'slug', 'region', 'tenant', 'facility', 'asn', 'physical_address', 'shipping_address',
  58. 'contact_name', 'contact_phone', 'contact_email', 'comments', 'custom_fields',
  59. ]
  60. #
  61. # Rack groups
  62. #
  63. class RackGroupSerializer(serializers.ModelSerializer):
  64. site = NestedSiteSerializer()
  65. class Meta:
  66. model = RackGroup
  67. fields = ['id', 'name', 'slug', 'site']
  68. class NestedRackGroupSerializer(serializers.ModelSerializer):
  69. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackgroup-detail')
  70. class Meta:
  71. model = RackGroup
  72. fields = ['id', 'url', 'name', 'slug']
  73. class WritableRackGroupSerializer(ValidatedModelSerializer):
  74. class Meta:
  75. model = RackGroup
  76. fields = ['id', 'name', 'slug', 'site']
  77. #
  78. # Rack roles
  79. #
  80. class RackRoleSerializer(ValidatedModelSerializer):
  81. class Meta:
  82. model = RackRole
  83. fields = ['id', 'name', 'slug', 'color']
  84. class NestedRackRoleSerializer(serializers.ModelSerializer):
  85. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rackrole-detail')
  86. class Meta:
  87. model = RackRole
  88. fields = ['id', 'url', 'name', 'slug']
  89. #
  90. # Racks
  91. #
  92. class RackSerializer(CustomFieldModelSerializer):
  93. site = NestedSiteSerializer()
  94. group = NestedRackGroupSerializer()
  95. tenant = NestedTenantSerializer()
  96. role = NestedRackRoleSerializer()
  97. type = ChoiceFieldSerializer(choices=RACK_TYPE_CHOICES)
  98. width = ChoiceFieldSerializer(choices=RACK_WIDTH_CHOICES)
  99. class Meta:
  100. model = Rack
  101. fields = [
  102. 'id', 'name', 'facility_id', 'display_name', 'site', 'group', 'tenant', 'role', 'type', 'width', 'u_height',
  103. 'desc_units', 'comments', 'custom_fields',
  104. ]
  105. class NestedRackSerializer(serializers.ModelSerializer):
  106. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rack-detail')
  107. class Meta:
  108. model = Rack
  109. fields = ['id', 'url', 'name', 'display_name']
  110. class WritableRackSerializer(CustomFieldModelSerializer):
  111. class Meta:
  112. model = Rack
  113. fields = [
  114. 'id', 'name', 'facility_id', 'site', 'group', 'tenant', 'role', 'type', 'width', 'u_height', 'desc_units',
  115. 'comments', 'custom_fields',
  116. ]
  117. # Omit the UniqueTogetherValidator that would be automatically added to validate (site, facility_id). This
  118. # prevents facility_id from being interpreted as a required field.
  119. validators = [
  120. UniqueTogetherValidator(queryset=Rack.objects.all(), fields=('site', 'name'))
  121. ]
  122. def validate(self, data):
  123. # Validate uniqueness of (site, facility_id) since we omitted the automatically-created validator from Meta.
  124. if data.get('facility_id', None):
  125. validator = UniqueTogetherValidator(queryset=Rack.objects.all(), fields=('site', 'facility_id'))
  126. validator.set_context(self)
  127. validator(data)
  128. # Enforce model validation
  129. super(WritableRackSerializer, self).validate(data)
  130. return data
  131. #
  132. # Rack units
  133. #
  134. class NestedDeviceSerializer(serializers.ModelSerializer):
  135. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:device-detail')
  136. class Meta:
  137. model = Device
  138. fields = ['id', 'url', 'name', 'display_name']
  139. class RackUnitSerializer(serializers.Serializer):
  140. """
  141. A rack unit is an abstraction formed by the set (rack, position, face); it does not exist as a row in the database.
  142. """
  143. id = serializers.IntegerField(read_only=True)
  144. name = serializers.CharField(read_only=True)
  145. face = serializers.IntegerField(read_only=True)
  146. device = NestedDeviceSerializer(read_only=True)
  147. #
  148. # Rack reservations
  149. #
  150. class RackReservationSerializer(serializers.ModelSerializer):
  151. rack = NestedRackSerializer()
  152. class Meta:
  153. model = RackReservation
  154. fields = ['id', 'rack', 'units', 'created', 'user', 'description']
  155. class WritableRackReservationSerializer(ValidatedModelSerializer):
  156. class Meta:
  157. model = RackReservation
  158. fields = ['id', 'rack', 'units', 'description']
  159. #
  160. # Manufacturers
  161. #
  162. class ManufacturerSerializer(ValidatedModelSerializer):
  163. class Meta:
  164. model = Manufacturer
  165. fields = ['id', 'name', 'slug']
  166. class NestedManufacturerSerializer(serializers.ModelSerializer):
  167. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:manufacturer-detail')
  168. class Meta:
  169. model = Manufacturer
  170. fields = ['id', 'url', 'name', 'slug']
  171. #
  172. # Device types
  173. #
  174. class DeviceTypeSerializer(CustomFieldModelSerializer):
  175. manufacturer = NestedManufacturerSerializer()
  176. interface_ordering = ChoiceFieldSerializer(choices=IFACE_ORDERING_CHOICES)
  177. subdevice_role = ChoiceFieldSerializer(choices=SUBDEVICE_ROLE_CHOICES)
  178. instance_count = serializers.IntegerField(source='instances.count', read_only=True)
  179. class Meta:
  180. model = DeviceType
  181. fields = [
  182. 'id', 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'interface_ordering',
  183. 'is_console_server', 'is_pdu', 'is_network_device', 'subdevice_role', 'comments', 'custom_fields',
  184. 'instance_count',
  185. ]
  186. class NestedDeviceTypeSerializer(serializers.ModelSerializer):
  187. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicetype-detail')
  188. manufacturer = NestedManufacturerSerializer()
  189. class Meta:
  190. model = DeviceType
  191. fields = ['id', 'url', 'manufacturer', 'model', 'slug']
  192. class WritableDeviceTypeSerializer(CustomFieldModelSerializer):
  193. class Meta:
  194. model = DeviceType
  195. fields = [
  196. 'id', 'manufacturer', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'interface_ordering',
  197. 'is_console_server', 'is_pdu', 'is_network_device', 'subdevice_role', 'comments', 'custom_fields',
  198. ]
  199. #
  200. # Console port templates
  201. #
  202. class ConsolePortTemplateSerializer(serializers.ModelSerializer):
  203. device_type = NestedDeviceTypeSerializer()
  204. class Meta:
  205. model = ConsolePortTemplate
  206. fields = ['id', 'device_type', 'name']
  207. class WritableConsolePortTemplateSerializer(ValidatedModelSerializer):
  208. class Meta:
  209. model = ConsolePortTemplate
  210. fields = ['id', 'device_type', 'name']
  211. #
  212. # Console server port templates
  213. #
  214. class ConsoleServerPortTemplateSerializer(serializers.ModelSerializer):
  215. device_type = NestedDeviceTypeSerializer()
  216. class Meta:
  217. model = ConsoleServerPortTemplate
  218. fields = ['id', 'device_type', 'name']
  219. class WritableConsoleServerPortTemplateSerializer(ValidatedModelSerializer):
  220. class Meta:
  221. model = ConsoleServerPortTemplate
  222. fields = ['id', 'device_type', 'name']
  223. #
  224. # Power port templates
  225. #
  226. class PowerPortTemplateSerializer(serializers.ModelSerializer):
  227. device_type = NestedDeviceTypeSerializer()
  228. class Meta:
  229. model = PowerPortTemplate
  230. fields = ['id', 'device_type', 'name']
  231. class WritablePowerPortTemplateSerializer(ValidatedModelSerializer):
  232. class Meta:
  233. model = PowerPortTemplate
  234. fields = ['id', 'device_type', 'name']
  235. #
  236. # Power outlet templates
  237. #
  238. class PowerOutletTemplateSerializer(serializers.ModelSerializer):
  239. device_type = NestedDeviceTypeSerializer()
  240. class Meta:
  241. model = PowerOutletTemplate
  242. fields = ['id', 'device_type', 'name']
  243. class WritablePowerOutletTemplateSerializer(ValidatedModelSerializer):
  244. class Meta:
  245. model = PowerOutletTemplate
  246. fields = ['id', 'device_type', 'name']
  247. #
  248. # Interface templates
  249. #
  250. class InterfaceTemplateSerializer(serializers.ModelSerializer):
  251. device_type = NestedDeviceTypeSerializer()
  252. form_factor = ChoiceFieldSerializer(choices=IFACE_FF_CHOICES)
  253. class Meta:
  254. model = InterfaceTemplate
  255. fields = ['id', 'device_type', 'name', 'form_factor', 'mgmt_only']
  256. class WritableInterfaceTemplateSerializer(ValidatedModelSerializer):
  257. class Meta:
  258. model = InterfaceTemplate
  259. fields = ['id', 'device_type', 'name', 'form_factor', 'mgmt_only']
  260. #
  261. # Device bay templates
  262. #
  263. class DeviceBayTemplateSerializer(serializers.ModelSerializer):
  264. device_type = NestedDeviceTypeSerializer()
  265. class Meta:
  266. model = DeviceBayTemplate
  267. fields = ['id', 'device_type', 'name']
  268. class WritableDeviceBayTemplateSerializer(ValidatedModelSerializer):
  269. class Meta:
  270. model = DeviceBayTemplate
  271. fields = ['id', 'device_type', 'name']
  272. #
  273. # Device roles
  274. #
  275. class DeviceRoleSerializer(ValidatedModelSerializer):
  276. class Meta:
  277. model = DeviceRole
  278. fields = ['id', 'name', 'slug', 'color']
  279. class NestedDeviceRoleSerializer(serializers.ModelSerializer):
  280. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicerole-detail')
  281. class Meta:
  282. model = DeviceRole
  283. fields = ['id', 'url', 'name', 'slug']
  284. #
  285. # Platforms
  286. #
  287. class PlatformSerializer(ValidatedModelSerializer):
  288. class Meta:
  289. model = Platform
  290. fields = ['id', 'name', 'slug', 'napalm_driver', 'rpc_client']
  291. class NestedPlatformSerializer(serializers.ModelSerializer):
  292. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:platform-detail')
  293. class Meta:
  294. model = Platform
  295. fields = ['id', 'url', 'name', 'slug']
  296. #
  297. # Devices
  298. #
  299. # Cannot import ipam.api.NestedIPAddressSerializer due to circular dependency
  300. class DeviceIPAddressSerializer(serializers.ModelSerializer):
  301. url = serializers.HyperlinkedIdentityField(view_name='ipam-api:ipaddress-detail')
  302. class Meta:
  303. model = IPAddress
  304. fields = ['id', 'url', 'family', 'address']
  305. # Cannot import virtualization.api.NestedClusterSerializer due to circular dependency
  306. class NestedClusterSerializer(serializers.ModelSerializer):
  307. url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:cluster-detail')
  308. class Meta:
  309. model = Cluster
  310. fields = ['id', 'url', 'name']
  311. class DeviceSerializer(CustomFieldModelSerializer):
  312. device_type = NestedDeviceTypeSerializer()
  313. device_role = NestedDeviceRoleSerializer()
  314. tenant = NestedTenantSerializer()
  315. platform = NestedPlatformSerializer()
  316. site = NestedSiteSerializer()
  317. rack = NestedRackSerializer()
  318. face = ChoiceFieldSerializer(choices=RACK_FACE_CHOICES)
  319. status = ChoiceFieldSerializer(choices=STATUS_CHOICES)
  320. primary_ip = DeviceIPAddressSerializer()
  321. primary_ip4 = DeviceIPAddressSerializer()
  322. primary_ip6 = DeviceIPAddressSerializer()
  323. parent_device = serializers.SerializerMethodField()
  324. cluster = NestedClusterSerializer()
  325. class Meta:
  326. model = Device
  327. fields = [
  328. 'id', 'name', 'display_name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag',
  329. 'site', 'rack', 'position', 'face', 'parent_device', 'status', 'primary_ip', 'primary_ip4', 'primary_ip6',
  330. 'cluster', 'comments', 'custom_fields',
  331. ]
  332. def get_parent_device(self, obj):
  333. try:
  334. device_bay = obj.parent_bay
  335. except DeviceBay.DoesNotExist:
  336. return None
  337. context = {'request': self.context['request']}
  338. data = NestedDeviceSerializer(instance=device_bay.device, context=context).data
  339. data['device_bay'] = NestedDeviceBaySerializer(instance=device_bay, context=context).data
  340. return data
  341. class WritableDeviceSerializer(CustomFieldModelSerializer):
  342. class Meta:
  343. model = Device
  344. fields = [
  345. 'id', 'name', 'device_type', 'device_role', 'tenant', 'platform', 'serial', 'asset_tag', 'site', 'rack',
  346. 'position', 'face', 'status', 'primary_ip4', 'primary_ip6', 'comments', 'custom_fields',
  347. ]
  348. validators = []
  349. def validate(self, data):
  350. # Validate uniqueness of (rack, position, face) since we omitted the automatically-created validator from Meta.
  351. if data.get('rack') and data.get('position') and data.get('face'):
  352. validator = UniqueTogetherValidator(queryset=Device.objects.all(), fields=('rack', 'position', 'face'))
  353. validator.set_context(self)
  354. validator(data)
  355. # Enforce model validation
  356. super(WritableDeviceSerializer, self).validate(data)
  357. return data
  358. #
  359. # Console server ports
  360. #
  361. class ConsoleServerPortSerializer(serializers.ModelSerializer):
  362. device = NestedDeviceSerializer()
  363. class Meta:
  364. model = ConsoleServerPort
  365. fields = ['id', 'device', 'name', 'connected_console']
  366. read_only_fields = ['connected_console']
  367. class WritableConsoleServerPortSerializer(ValidatedModelSerializer):
  368. class Meta:
  369. model = ConsoleServerPort
  370. fields = ['id', 'device', 'name']
  371. #
  372. # Console ports
  373. #
  374. class ConsolePortSerializer(serializers.ModelSerializer):
  375. device = NestedDeviceSerializer()
  376. cs_port = ConsoleServerPortSerializer()
  377. class Meta:
  378. model = ConsolePort
  379. fields = ['id', 'device', 'name', 'cs_port', 'connection_status']
  380. class WritableConsolePortSerializer(ValidatedModelSerializer):
  381. class Meta:
  382. model = ConsolePort
  383. fields = ['id', 'device', 'name', 'cs_port', 'connection_status']
  384. #
  385. # Power outlets
  386. #
  387. class PowerOutletSerializer(serializers.ModelSerializer):
  388. device = NestedDeviceSerializer()
  389. class Meta:
  390. model = PowerOutlet
  391. fields = ['id', 'device', 'name', 'connected_port']
  392. read_only_fields = ['connected_port']
  393. class WritablePowerOutletSerializer(ValidatedModelSerializer):
  394. class Meta:
  395. model = PowerOutlet
  396. fields = ['id', 'device', 'name']
  397. #
  398. # Power ports
  399. #
  400. class PowerPortSerializer(serializers.ModelSerializer):
  401. device = NestedDeviceSerializer()
  402. power_outlet = PowerOutletSerializer()
  403. class Meta:
  404. model = PowerPort
  405. fields = ['id', 'device', 'name', 'power_outlet', 'connection_status']
  406. class WritablePowerPortSerializer(ValidatedModelSerializer):
  407. class Meta:
  408. model = PowerPort
  409. fields = ['id', 'device', 'name', 'power_outlet', 'connection_status']
  410. #
  411. # Interfaces
  412. #
  413. class NestedInterfaceSerializer(serializers.ModelSerializer):
  414. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail')
  415. class Meta:
  416. model = Interface
  417. fields = ['id', 'url', 'name']
  418. class InterfaceNestedCircuitSerializer(serializers.ModelSerializer):
  419. url = serializers.HyperlinkedIdentityField(view_name='circuits-api:circuit-detail')
  420. class Meta:
  421. model = Circuit
  422. fields = ['id', 'url', 'cid']
  423. class InterfaceCircuitTerminationSerializer(serializers.ModelSerializer):
  424. circuit = InterfaceNestedCircuitSerializer()
  425. class Meta:
  426. model = CircuitTermination
  427. fields = [
  428. 'id', 'circuit', 'term_side', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info',
  429. ]
  430. class InterfaceSerializer(serializers.ModelSerializer):
  431. device = NestedDeviceSerializer()
  432. form_factor = ChoiceFieldSerializer(choices=IFACE_FF_CHOICES)
  433. lag = NestedInterfaceSerializer()
  434. is_connected = serializers.SerializerMethodField(read_only=True)
  435. interface_connection = serializers.SerializerMethodField(read_only=True)
  436. circuit_termination = InterfaceCircuitTerminationSerializer()
  437. class Meta:
  438. model = Interface
  439. fields = [
  440. 'id', 'device', 'name', 'form_factor', 'enabled', 'lag', 'mtu', 'mac_address', 'mgmt_only', 'description',
  441. 'is_connected', 'interface_connection', 'circuit_termination',
  442. ]
  443. def get_is_connected(self, obj):
  444. """
  445. Return True if the interface has a connected interface or circuit termination.
  446. """
  447. if obj.connection:
  448. return True
  449. try:
  450. circuit_termination = obj.circuit_termination
  451. return True
  452. except CircuitTermination.DoesNotExist:
  453. pass
  454. return False
  455. def get_interface_connection(self, obj):
  456. if obj.connection:
  457. return OrderedDict((
  458. ('interface', PeerInterfaceSerializer(obj.connected_interface, context=self.context).data),
  459. ('status', obj.connection.connection_status),
  460. ))
  461. return None
  462. class PeerInterfaceSerializer(serializers.ModelSerializer):
  463. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interface-detail')
  464. device = NestedDeviceSerializer()
  465. form_factor = ChoiceFieldSerializer(choices=IFACE_FF_CHOICES)
  466. lag = NestedInterfaceSerializer()
  467. class Meta:
  468. model = Interface
  469. fields = [
  470. 'id', 'url', 'device', 'name', 'form_factor', 'enabled', 'lag', 'mtu', 'mac_address', 'mgmt_only',
  471. 'description',
  472. ]
  473. class WritableInterfaceSerializer(ValidatedModelSerializer):
  474. class Meta:
  475. model = Interface
  476. fields = [
  477. 'id', 'device', 'name', 'form_factor', 'enabled', 'lag', 'mtu', 'mac_address', 'mgmt_only', 'description',
  478. ]
  479. #
  480. # Device bays
  481. #
  482. class DeviceBaySerializer(serializers.ModelSerializer):
  483. device = NestedDeviceSerializer()
  484. installed_device = NestedDeviceSerializer()
  485. class Meta:
  486. model = DeviceBay
  487. fields = ['id', 'device', 'name', 'installed_device']
  488. class NestedDeviceBaySerializer(serializers.ModelSerializer):
  489. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:devicebay-detail')
  490. class Meta:
  491. model = DeviceBay
  492. fields = ['id', 'url', 'name']
  493. class WritableDeviceBaySerializer(ValidatedModelSerializer):
  494. class Meta:
  495. model = DeviceBay
  496. fields = ['id', 'device', 'name', 'installed_device']
  497. #
  498. # Inventory items
  499. #
  500. class InventoryItemSerializer(serializers.ModelSerializer):
  501. device = NestedDeviceSerializer()
  502. manufacturer = NestedManufacturerSerializer()
  503. class Meta:
  504. model = InventoryItem
  505. fields = [
  506. 'id', 'device', 'parent', 'name', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered',
  507. 'description',
  508. ]
  509. class WritableInventoryItemSerializer(ValidatedModelSerializer):
  510. class Meta:
  511. model = InventoryItem
  512. fields = [
  513. 'id', 'device', 'parent', 'name', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'discovered',
  514. 'description',
  515. ]
  516. #
  517. # Interface connections
  518. #
  519. class InterfaceConnectionSerializer(serializers.ModelSerializer):
  520. interface_a = PeerInterfaceSerializer()
  521. interface_b = PeerInterfaceSerializer()
  522. connection_status = ChoiceFieldSerializer(choices=CONNECTION_STATUS_CHOICES)
  523. class Meta:
  524. model = InterfaceConnection
  525. fields = ['id', 'interface_a', 'interface_b', 'connection_status']
  526. class NestedInterfaceConnectionSerializer(serializers.ModelSerializer):
  527. url = serializers.HyperlinkedIdentityField(view_name='dcim-api:interfaceconnection-detail')
  528. class Meta:
  529. model = InterfaceConnection
  530. fields = ['id', 'url', 'connection_status']
  531. class WritableInterfaceConnectionSerializer(ValidatedModelSerializer):
  532. class Meta:
  533. model = InterfaceConnection
  534. fields = ['id', 'interface_a', 'interface_b', 'connection_status']