serializers.py 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. from rest_framework import serializers
  2. from ipam.models import IPAddress
  3. from dcim.models import (
  4. ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceType, DeviceRole,
  5. Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate,
  6. PowerPort, PowerPortTemplate, Rack, RackGroup, RACK_FACE_FRONT, RACK_FACE_REAR, Site,
  7. )
  8. #
  9. # Sites
  10. #
  11. class SiteSerializer(serializers.ModelSerializer):
  12. class Meta:
  13. model = Site
  14. fields = ['id', 'name', 'slug', 'facility', 'asn', 'physical_address', 'shipping_address', 'comments',
  15. 'count_prefixes', 'count_vlans', 'count_racks', 'count_devices', 'count_circuits']
  16. class SiteNestedSerializer(SiteSerializer):
  17. class Meta(SiteSerializer.Meta):
  18. fields = ['id', 'name', 'slug']
  19. #
  20. # Rack groups
  21. #
  22. class RackGroupSerializer(serializers.ModelSerializer):
  23. site = SiteNestedSerializer()
  24. class Meta:
  25. model = RackGroup
  26. fields = ['id', 'name', 'slug', 'site']
  27. class RackGroupNestedSerializer(SiteSerializer):
  28. class Meta(SiteSerializer.Meta):
  29. fields = ['id', 'name', 'slug']
  30. #
  31. # Racks
  32. #
  33. class RackSerializer(serializers.ModelSerializer):
  34. display_name = serializers.SerializerMethodField()
  35. site = SiteNestedSerializer()
  36. group = RackGroupNestedSerializer()
  37. class Meta:
  38. model = Rack
  39. fields = ['id', 'name', 'facility_id', 'display_name', 'site', 'group', 'u_height', 'comments']
  40. def get_display_name(self, obj):
  41. return str(obj)
  42. class RackNestedSerializer(RackSerializer):
  43. class Meta(RackSerializer.Meta):
  44. fields = ['id', 'name', 'facility_id', 'display_name']
  45. class RackDetailSerializer(RackSerializer):
  46. front_units = serializers.SerializerMethodField()
  47. rear_units = serializers.SerializerMethodField()
  48. class Meta(RackSerializer.Meta):
  49. fields = ['id', 'name', 'facility_id', 'display_name', 'site', 'group', 'u_height', 'comments', 'front_units',
  50. 'rear_units']
  51. def get_front_units(self, obj):
  52. units = obj.get_rack_units(face=RACK_FACE_FRONT)
  53. for u in units:
  54. u['device'] = DeviceNestedSerializer(u['device']).data if u['device'] else None
  55. return units
  56. def get_rear_units(self, obj):
  57. units = obj.get_rack_units(face=RACK_FACE_REAR)
  58. for u in units:
  59. u['device'] = DeviceNestedSerializer(u['device']).data if u['device'] else None
  60. return units
  61. #
  62. # Manufacturers
  63. #
  64. class ManufacturerSerializer(serializers.ModelSerializer):
  65. class Meta:
  66. model = Manufacturer
  67. fields = ['id', 'name', 'slug']
  68. class ManufacturerNestedSerializer(ManufacturerSerializer):
  69. class Meta(ManufacturerSerializer.Meta):
  70. pass
  71. #
  72. # Device types
  73. #
  74. class DeviceTypeSerializer(serializers.ModelSerializer):
  75. manufacturer = ManufacturerNestedSerializer()
  76. class Meta:
  77. model = DeviceType
  78. fields = ['id', 'manufacturer', 'model', 'slug', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu',
  79. 'is_network_device']
  80. class DeviceTypeNestedSerializer(DeviceTypeSerializer):
  81. class Meta(DeviceTypeSerializer.Meta):
  82. fields = ['id', 'manufacturer', 'model', 'slug']
  83. class ConsolePortTemplateNestedSerializer(serializers.ModelSerializer):
  84. class Meta:
  85. model = ConsolePortTemplate
  86. fields = ['id', 'name']
  87. class ConsoleServerPortTemplateNestedSerializer(serializers.ModelSerializer):
  88. class Meta:
  89. model = ConsoleServerPortTemplate
  90. fields = ['id', 'name']
  91. class PowerPortTemplateNestedSerializer(serializers.ModelSerializer):
  92. class Meta:
  93. model = PowerPortTemplate
  94. fields = ['id', 'name']
  95. class PowerOutletTemplateNestedSerializer(serializers.ModelSerializer):
  96. class Meta:
  97. model = PowerOutletTemplate
  98. fields = ['id', 'name']
  99. class InterfaceTemplateNestedSerializer(serializers.ModelSerializer):
  100. class Meta:
  101. model = InterfaceTemplate
  102. fields = ['id', 'name', 'form_factor', 'mgmt_only']
  103. class DeviceTypeDetailSerializer(DeviceTypeSerializer):
  104. console_port_templates = ConsolePortTemplateNestedSerializer(many=True, read_only=True)
  105. cs_port_templates = ConsoleServerPortTemplateNestedSerializer(many=True, read_only=True)
  106. power_port_templates = PowerPortTemplateNestedSerializer(many=True, read_only=True)
  107. power_outlet_templates = PowerPortTemplateNestedSerializer(many=True, read_only=True)
  108. interface_templates = InterfaceTemplateNestedSerializer(many=True, read_only=True)
  109. class Meta(DeviceTypeSerializer.Meta):
  110. fields = ['id', 'manufacturer', 'model', 'slug', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu',
  111. 'is_network_device', 'console_port_templates', 'cs_port_templates', 'power_port_templates',
  112. 'power_outlet_templates', 'interface_templates']
  113. #
  114. # Device roles
  115. #
  116. class DeviceRoleSerializer(serializers.ModelSerializer):
  117. class Meta:
  118. model = DeviceRole
  119. fields = ['id', 'name', 'slug', 'color']
  120. class DeviceRoleNestedSerializer(DeviceRoleSerializer):
  121. class Meta(DeviceRoleSerializer.Meta):
  122. fields = ['id', 'name', 'slug']
  123. #
  124. # Platforms
  125. #
  126. class PlatformSerializer(serializers.ModelSerializer):
  127. class Meta:
  128. model = Platform
  129. fields = ['id', 'name', 'slug', 'rpc_client']
  130. class PlatformNestedSerializer(PlatformSerializer):
  131. class Meta(PlatformSerializer.Meta):
  132. fields = ['id', 'name', 'slug']
  133. #
  134. # Devices
  135. #
  136. # Cannot import ipam.api.IPAddressNestedSerializer due to circular dependency
  137. class DeviceIPAddressNestedSerializer(serializers.ModelSerializer):
  138. class Meta:
  139. model = IPAddress
  140. fields = ['id', 'family', 'address']
  141. class DeviceSerializer(serializers.ModelSerializer):
  142. device_type = DeviceTypeNestedSerializer()
  143. device_role = DeviceRoleNestedSerializer()
  144. platform = PlatformNestedSerializer()
  145. rack = RackNestedSerializer()
  146. primary_ip = DeviceIPAddressNestedSerializer()
  147. class Meta:
  148. model = Device
  149. fields = ['id', 'name', 'display_name', 'device_type', 'device_role', 'platform', 'serial', 'rack', 'position',
  150. 'face', 'status', 'primary_ip', 'comments']
  151. class DeviceNestedSerializer(DeviceSerializer):
  152. class Meta(DeviceSerializer.Meta):
  153. model = Device
  154. fields = ['id', 'name']
  155. #
  156. # Console server ports
  157. #
  158. class ConsoleServerPortSerializer(serializers.ModelSerializer):
  159. device = DeviceNestedSerializer()
  160. class Meta:
  161. model = ConsoleServerPort
  162. fields = ['id', 'device', 'name', 'connected_console']
  163. class ConsoleServerPortNestedSerializer(ConsoleServerPortSerializer):
  164. class Meta(ConsoleServerPortSerializer.Meta):
  165. fields = ['id', 'device', 'name']
  166. #
  167. # Console ports
  168. #
  169. class ConsolePortSerializer(serializers.ModelSerializer):
  170. device = DeviceNestedSerializer()
  171. cs_port = ConsoleServerPortNestedSerializer()
  172. class Meta:
  173. model = ConsolePort
  174. fields = ['id', 'device', 'name', 'cs_port', 'connection_status']
  175. class ConsolePortNestedSerializer(ConsolePortSerializer):
  176. class Meta(ConsolePortSerializer.Meta):
  177. fields = ['id', 'device', 'name']
  178. #
  179. # Power outlets
  180. #
  181. class PowerOutletSerializer(serializers.ModelSerializer):
  182. device = DeviceNestedSerializer()
  183. class Meta:
  184. model = PowerOutlet
  185. fields = ['id', 'device', 'name', 'connected_port']
  186. class PowerOutletNestedSerializer(PowerOutletSerializer):
  187. class Meta(PowerOutletSerializer.Meta):
  188. fields = ['id', 'device', 'name']
  189. #
  190. # Power ports
  191. #
  192. class PowerPortSerializer(serializers.ModelSerializer):
  193. device = DeviceNestedSerializer()
  194. power_outlet = PowerOutletNestedSerializer()
  195. class Meta:
  196. model = PowerPort
  197. fields = ['id', 'device', 'name', 'power_outlet', 'connection_status']
  198. class PowerPortNestedSerializer(PowerPortSerializer):
  199. class Meta(PowerPortSerializer.Meta):
  200. fields = ['id', 'device', 'name']
  201. #
  202. # Interfaces
  203. #
  204. class InterfaceSerializer(serializers.ModelSerializer):
  205. device = DeviceNestedSerializer()
  206. form_factor = serializers.ReadOnlyField(source='get_form_factor_display')
  207. class Meta:
  208. model = Interface
  209. fields = ['id', 'device', 'name', 'form_factor', 'mgmt_only', 'description', 'is_connected']
  210. class InterfaceNestedSerializer(InterfaceSerializer):
  211. form_factor = serializers.ReadOnlyField(source='get_form_factor_display')
  212. class Meta(InterfaceSerializer.Meta):
  213. fields = ['id', 'device', 'name']
  214. class InterfaceDetailSerializer(InterfaceSerializer):
  215. connected_interface = InterfaceSerializer(source='get_connected_interface')
  216. class Meta(InterfaceSerializer.Meta):
  217. fields = ['id', 'device', 'name', 'form_factor', 'mgmt_only', 'description', 'is_connected',
  218. 'connected_interface']
  219. #
  220. # Interface connections
  221. #
  222. class InterfaceConnectionSerializer(serializers.ModelSerializer):
  223. class Meta:
  224. model = InterfaceConnection
  225. fields = ['id', 'interface_a', 'interface_b', 'connection_status']