2
0

serializers.py 21 KB

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