circuits.py 8.5 KB

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