2
0

racks.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. from django.utils.translation import gettext as _
  2. from rest_framework import serializers
  3. from dcim.choices import *
  4. from dcim.constants import *
  5. from dcim.models import Rack, RackGroup, RackReservation, RackRole, RackType
  6. from netbox.api.fields import ChoiceField, RelatedObjectCountField
  7. from netbox.api.serializers import OrganizationalModelSerializer, PrimaryModelSerializer
  8. from netbox.choices import *
  9. from netbox.config import ConfigItem
  10. from tenancy.api.serializers_.tenants import TenantSerializer
  11. from users.api.serializers_.users import UserSerializer
  12. from .manufacturers import ManufacturerSerializer
  13. from .sites import LocationSerializer, SiteSerializer
  14. __all__ = (
  15. 'RackElevationDetailFilterSerializer',
  16. 'RackGroupSerializer',
  17. 'RackReservationSerializer',
  18. 'RackRoleSerializer',
  19. 'RackSerializer',
  20. 'RackTypeSerializer',
  21. )
  22. class RackGroupSerializer(OrganizationalModelSerializer):
  23. # Related object counts
  24. rack_count = RelatedObjectCountField('racks')
  25. class Meta:
  26. model = RackGroup
  27. fields = [
  28. 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'comments', 'tags',
  29. 'custom_fields', 'created', 'last_updated', 'rack_count',
  30. ]
  31. brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'rack_count')
  32. class RackRoleSerializer(OrganizationalModelSerializer):
  33. # Related object counts
  34. rack_count = RelatedObjectCountField('racks')
  35. class Meta:
  36. model = RackRole
  37. fields = [
  38. 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
  39. 'custom_fields', 'created', 'last_updated', 'rack_count',
  40. ]
  41. brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'rack_count')
  42. class RackBaseSerializer(PrimaryModelSerializer):
  43. form_factor = ChoiceField(
  44. choices=RackFormFactorChoices,
  45. allow_blank=True,
  46. required=False,
  47. allow_null=True
  48. )
  49. width = ChoiceField(
  50. choices=RackWidthChoices,
  51. required=False
  52. )
  53. outer_unit = ChoiceField(
  54. choices=RackDimensionUnitChoices,
  55. allow_blank=True,
  56. required=False,
  57. allow_null=True
  58. )
  59. weight_unit = ChoiceField(
  60. choices=WeightUnitChoices,
  61. allow_blank=True,
  62. required=False,
  63. allow_null=True
  64. )
  65. class RackTypeSerializer(RackBaseSerializer):
  66. manufacturer = ManufacturerSerializer(nested=True)
  67. rack_count = serializers.IntegerField(read_only=True)
  68. class Meta:
  69. model = RackType
  70. fields = [
  71. 'id', 'url', 'display_url', 'display', 'manufacturer', 'model', 'slug', 'description', 'form_factor',
  72. 'width', 'u_height', 'starting_unit', 'desc_units', 'outer_width', 'outer_height', 'outer_depth',
  73. 'outer_unit', 'weight', 'max_weight', 'weight_unit', 'mounting_depth', 'description', 'owner', 'comments',
  74. 'tags', 'custom_fields', 'created', 'last_updated', 'rack_count',
  75. ]
  76. brief_fields = ('id', 'url', 'display', 'manufacturer', 'model', 'slug', 'description', 'rack_count')
  77. class RackSerializer(RackBaseSerializer):
  78. site = SiteSerializer(
  79. nested=True
  80. )
  81. location = LocationSerializer(
  82. nested=True,
  83. required=False,
  84. allow_null=True,
  85. default=None
  86. )
  87. group = RackGroupSerializer(
  88. nested=True,
  89. required=False,
  90. allow_null=True
  91. )
  92. tenant = TenantSerializer(
  93. nested=True,
  94. required=False,
  95. allow_null=True
  96. )
  97. status = ChoiceField(
  98. choices=RackStatusChoices,
  99. required=False
  100. )
  101. airflow = ChoiceField(
  102. choices=RackAirflowChoices,
  103. allow_blank=True,
  104. required=False
  105. )
  106. role = RackRoleSerializer(
  107. nested=True,
  108. required=False,
  109. allow_null=True
  110. )
  111. facility_id = serializers.CharField(
  112. max_length=50,
  113. allow_blank=True,
  114. allow_null=True,
  115. label=_('Facility ID'),
  116. default=None
  117. )
  118. rack_type = RackTypeSerializer(
  119. nested=True,
  120. required=False,
  121. allow_null=True,
  122. default=None
  123. )
  124. # Related object counts
  125. device_count = RelatedObjectCountField('devices')
  126. powerfeed_count = RelatedObjectCountField('powerfeeds')
  127. class Meta:
  128. model = Rack
  129. fields = [
  130. 'id', 'url', 'display_url', 'display', 'name', 'facility_id', 'site', 'location', 'group', 'tenant',
  131. 'status', 'role', 'serial', 'asset_tag', 'rack_type', 'form_factor', 'width', 'u_height', 'starting_unit',
  132. 'weight', 'max_weight', 'weight_unit', 'desc_units', 'outer_width', 'outer_height', 'outer_depth',
  133. 'outer_unit', 'mounting_depth', 'airflow', 'description', 'owner', 'comments', 'tags', 'custom_fields',
  134. 'created', 'last_updated', 'device_count', 'powerfeed_count',
  135. ]
  136. brief_fields = ('id', 'url', 'display', 'name', 'description', 'device_count')
  137. class RackReservationSerializer(PrimaryModelSerializer):
  138. rack = RackSerializer(
  139. nested=True,
  140. )
  141. status = ChoiceField(
  142. choices=RackReservationStatusChoices,
  143. required=False,
  144. )
  145. user = UserSerializer(
  146. nested=True,
  147. )
  148. tenant = TenantSerializer(
  149. nested=True,
  150. required=False,
  151. allow_null=True,
  152. )
  153. class Meta:
  154. model = RackReservation
  155. fields = [
  156. 'id', 'url', 'display_url', 'display', 'rack', 'units', 'status', 'created', 'last_updated', 'user',
  157. 'tenant', 'description', 'owner', 'comments', 'tags', 'custom_fields',
  158. ]
  159. brief_fields = ('id', 'url', 'display', 'status', 'user', 'description', 'units')
  160. class RackElevationDetailFilterSerializer(serializers.Serializer):
  161. q = serializers.CharField(
  162. required=False,
  163. default=None
  164. )
  165. face = serializers.ChoiceField(
  166. choices=DeviceFaceChoices,
  167. default=DeviceFaceChoices.FACE_FRONT
  168. )
  169. render = serializers.ChoiceField(
  170. choices=RackElevationDetailRenderChoices,
  171. default=RackElevationDetailRenderChoices.RENDER_JSON
  172. )
  173. unit_width = serializers.IntegerField(
  174. default=ConfigItem('RACK_ELEVATION_DEFAULT_UNIT_WIDTH')
  175. )
  176. unit_height = serializers.IntegerField(
  177. default=ConfigItem('RACK_ELEVATION_DEFAULT_UNIT_HEIGHT')
  178. )
  179. legend_width = serializers.IntegerField(
  180. default=RACK_ELEVATION_DEFAULT_LEGEND_WIDTH
  181. )
  182. margin_width = serializers.IntegerField(
  183. default=RACK_ELEVATION_DEFAULT_MARGIN_WIDTH
  184. )
  185. exclude = serializers.IntegerField(
  186. required=False,
  187. default=None
  188. )
  189. expand_devices = serializers.BooleanField(
  190. required=False,
  191. default=True
  192. )
  193. include_images = serializers.BooleanField(
  194. required=False,
  195. default=True
  196. )