circuits.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. from django.contrib.contenttypes.models import ContentType
  2. from rest_framework import serializers
  3. from circuits.choices import CircuitPriorityChoices, CircuitStatusChoices, VirtualCircuitTerminationRoleChoices
  4. from circuits.constants import CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS, CIRCUIT_TERMINATION_TERMINATION_TYPES
  5. from circuits.models import (
  6. Circuit,
  7. CircuitGroup,
  8. CircuitGroupAssignment,
  9. CircuitTermination,
  10. CircuitType,
  11. VirtualCircuit,
  12. VirtualCircuitTermination,
  13. VirtualCircuitType,
  14. )
  15. from dcim.api.serializers_.cables import CabledObjectSerializer
  16. from dcim.api.serializers_.device_components import InterfaceSerializer
  17. from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
  18. from netbox.api.gfk_fields import GFKSerializerField
  19. from netbox.api.serializers import (
  20. NetBoxModelSerializer,
  21. OrganizationalModelSerializer,
  22. PrimaryModelSerializer,
  23. WritableNestedSerializer,
  24. )
  25. from netbox.choices import DistanceUnitChoices
  26. from tenancy.api.serializers_.tenants import TenantSerializer
  27. from .providers import ProviderAccountSerializer, ProviderNetworkSerializer, ProviderSerializer
  28. __all__ = (
  29. 'CircuitSerializer',
  30. 'CircuitGroupAssignmentSerializer',
  31. 'CircuitGroupSerializer',
  32. 'CircuitTerminationSerializer',
  33. 'CircuitTypeSerializer',
  34. 'VirtualCircuitSerializer',
  35. 'VirtualCircuitTerminationSerializer',
  36. 'VirtualCircuitTypeSerializer',
  37. )
  38. class CircuitTypeSerializer(OrganizationalModelSerializer):
  39. # Related object counts
  40. circuit_count = RelatedObjectCountField('circuits')
  41. class Meta:
  42. model = CircuitType
  43. fields = [
  44. 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
  45. 'custom_fields', 'created', 'last_updated', 'circuit_count',
  46. ]
  47. brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'circuit_count')
  48. class CircuitCircuitTerminationSerializer(WritableNestedSerializer):
  49. termination_type = ContentTypeField(
  50. queryset=ContentType.objects.filter(
  51. model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES
  52. ),
  53. allow_null=True,
  54. required=False,
  55. default=None
  56. )
  57. termination_id = serializers.IntegerField(allow_null=True, required=False, default=None)
  58. termination = GFKSerializerField(read_only=True)
  59. class Meta:
  60. model = CircuitTermination
  61. fields = [
  62. 'id', 'url', 'display_url', 'display', 'termination_type', 'termination_id', 'termination', 'port_speed',
  63. 'upstream_speed', 'xconnect_id', 'description',
  64. ]
  65. class CircuitGroupSerializer(OrganizationalModelSerializer):
  66. tenant = TenantSerializer(nested=True, required=False, allow_null=True)
  67. circuit_count = RelatedObjectCountField('assignments')
  68. class Meta:
  69. model = CircuitGroup
  70. fields = [
  71. 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tenant', 'owner', 'comments', 'tags',
  72. 'custom_fields', 'created', 'last_updated', 'circuit_count'
  73. ]
  74. brief_fields = ('id', 'url', 'display', 'name')
  75. class CircuitGroupAssignmentSerializer_(NetBoxModelSerializer):
  76. """
  77. Base serializer for group assignments under CircuitSerializer.
  78. """
  79. group = CircuitGroupSerializer(nested=True)
  80. priority = ChoiceField(choices=CircuitPriorityChoices, allow_blank=True, required=False)
  81. class Meta:
  82. model = CircuitGroupAssignment
  83. fields = [
  84. 'id', 'url', 'display_url', 'display', 'group', 'priority', 'tags', 'created', 'last_updated',
  85. ]
  86. brief_fields = ('id', 'url', 'display', 'group', 'priority')
  87. class CircuitSerializer(PrimaryModelSerializer):
  88. provider = ProviderSerializer(nested=True)
  89. provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None)
  90. status = ChoiceField(choices=CircuitStatusChoices, required=False)
  91. type = CircuitTypeSerializer(nested=True)
  92. distance_unit = ChoiceField(choices=DistanceUnitChoices, allow_blank=True, required=False, allow_null=True)
  93. tenant = TenantSerializer(nested=True, required=False, allow_null=True)
  94. termination_a = CircuitCircuitTerminationSerializer(read_only=True, allow_null=True)
  95. termination_z = CircuitCircuitTerminationSerializer(read_only=True, allow_null=True)
  96. assignments = CircuitGroupAssignmentSerializer_(nested=True, many=True, required=False)
  97. class Meta:
  98. model = Circuit
  99. fields = [
  100. 'id', 'url', 'display_url', 'display', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant',
  101. 'install_date', 'termination_date', 'commit_rate', 'description', 'distance', 'distance_unit',
  102. 'termination_a', 'termination_z', 'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  103. 'assignments',
  104. ]
  105. brief_fields = ('id', 'url', 'display', 'provider', 'cid', 'description')
  106. class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer):
  107. circuit = CircuitSerializer(nested=True)
  108. termination_type = ContentTypeField(
  109. queryset=ContentType.objects.filter(
  110. model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES
  111. ),
  112. allow_null=True,
  113. required=False,
  114. default=None
  115. )
  116. termination_id = serializers.IntegerField(allow_null=True, required=False, default=None)
  117. termination = GFKSerializerField(read_only=True)
  118. class Meta:
  119. model = CircuitTermination
  120. fields = [
  121. 'id', 'url', 'display_url', 'display', 'circuit', 'term_side', 'termination_type', 'termination_id',
  122. 'termination', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'mark_connected',
  123. 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated',
  124. '_occupied',
  125. ]
  126. brief_fields = ('id', 'url', 'display', 'circuit', 'term_side', 'description', 'cable', '_occupied')
  127. class CircuitGroupAssignmentSerializer(CircuitGroupAssignmentSerializer_):
  128. member_type = ContentTypeField(
  129. queryset=ContentType.objects.filter(CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS)
  130. )
  131. member = GFKSerializerField(read_only=True)
  132. class Meta:
  133. model = CircuitGroupAssignment
  134. fields = [
  135. 'id', 'url', 'display_url', 'display', 'group', 'member_type', 'member_id', 'member', 'priority', 'tags',
  136. 'created', 'last_updated',
  137. ]
  138. brief_fields = ('id', 'url', 'display', 'group', 'member_type', 'member_id', 'member', 'priority')
  139. class VirtualCircuitTypeSerializer(OrganizationalModelSerializer):
  140. # Related object counts
  141. virtual_circuit_count = RelatedObjectCountField('virtual_circuits')
  142. class Meta:
  143. model = VirtualCircuitType
  144. fields = [
  145. 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
  146. 'custom_fields', 'created', 'last_updated', 'virtual_circuit_count',
  147. ]
  148. brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'virtual_circuit_count')
  149. class VirtualCircuitSerializer(PrimaryModelSerializer):
  150. provider_network = ProviderNetworkSerializer(nested=True)
  151. provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None)
  152. type = VirtualCircuitTypeSerializer(nested=True)
  153. status = ChoiceField(choices=CircuitStatusChoices, required=False)
  154. tenant = TenantSerializer(nested=True, required=False, allow_null=True)
  155. class Meta:
  156. model = VirtualCircuit
  157. fields = [
  158. 'id', 'url', 'display_url', 'display', 'cid', 'provider_network', 'provider_account', 'type', 'status',
  159. 'tenant', 'description', 'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
  160. ]
  161. brief_fields = ('id', 'url', 'display', 'provider_network', 'cid', 'description')
  162. class VirtualCircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer):
  163. virtual_circuit = VirtualCircuitSerializer(nested=True)
  164. role = ChoiceField(choices=VirtualCircuitTerminationRoleChoices, required=False)
  165. interface = InterfaceSerializer(nested=True)
  166. class Meta:
  167. model = VirtualCircuitTermination
  168. fields = [
  169. 'id', 'url', 'display_url', 'display', 'virtual_circuit', 'role', 'interface', 'description', 'tags',
  170. 'custom_fields', 'created', 'last_updated',
  171. ]
  172. brief_fields = ('id', 'url', 'display', 'virtual_circuit', 'role', 'interface', 'description')