Coverage for circuits/api/serializers_/circuits.py: 100%
95 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from django.contrib.contenttypes.models import ContentType
2from rest_framework import serializers
4from circuits.choices import CircuitPriorityChoices, CircuitStatusChoices, VirtualCircuitTerminationRoleChoices
5from circuits.constants import CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS, CIRCUIT_TERMINATION_TERMINATION_TYPES
6from circuits.models import (
7 Circuit,
8 CircuitGroup,
9 CircuitGroupAssignment,
10 CircuitTermination,
11 CircuitType,
12 VirtualCircuit,
13 VirtualCircuitTermination,
14 VirtualCircuitType,
15)
16from dcim.api.serializers_.cables import CabledObjectSerializer
17from dcim.api.serializers_.device_components import InterfaceSerializer
18from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField
19from netbox.api.gfk_fields import GFKSerializerField
20from netbox.api.serializers import (
21 NetBoxModelSerializer,
22 OrganizationalModelSerializer,
23 PrimaryModelSerializer,
24 WritableNestedSerializer,
25)
26from netbox.choices import DistanceUnitChoices
27from tenancy.api.serializers_.tenants import TenantSerializer
29from .providers import ProviderAccountSerializer, ProviderNetworkSerializer, ProviderSerializer
31__all__ = (
32 'CircuitGroupAssignmentSerializer',
33 'CircuitGroupSerializer',
34 'CircuitSerializer',
35 'CircuitTerminationSerializer',
36 'CircuitTypeSerializer',
37 'VirtualCircuitSerializer',
38 'VirtualCircuitTerminationSerializer',
39 'VirtualCircuitTypeSerializer',
40)
43class CircuitTypeSerializer(OrganizationalModelSerializer):
45 # Related object counts
46 circuit_count = RelatedObjectCountField('circuits')
48 class Meta:
49 model = CircuitType
50 fields = [
51 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
52 'custom_fields', 'created', 'last_updated', 'circuit_count',
53 ]
54 brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'circuit_count')
57class CircuitCircuitTerminationSerializer(WritableNestedSerializer):
58 termination_type = ContentTypeField(
59 queryset=ContentType.objects.filter(
60 model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES
61 ),
62 allow_null=True,
63 required=False,
64 default=None
65 )
66 termination_id = serializers.IntegerField(allow_null=True, required=False, default=None)
67 termination = GFKSerializerField(read_only=True)
69 class Meta:
70 model = CircuitTermination
71 fields = [
72 'id', 'url', 'display_url', 'display', 'termination_type', 'termination_id', 'termination', 'port_speed',
73 'upstream_speed', 'xconnect_id', 'description',
74 ]
77class CircuitGroupSerializer(OrganizationalModelSerializer):
78 tenant = TenantSerializer(nested=True, required=False, allow_null=True)
79 circuit_count = RelatedObjectCountField('assignments')
81 class Meta:
82 model = CircuitGroup
83 fields = [
84 'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tenant', 'owner', 'comments', 'tags',
85 'custom_fields', 'created', 'last_updated', 'circuit_count'
86 ]
87 brief_fields = ('id', 'url', 'display', 'name')
90class CircuitGroupAssignmentSerializer_(NetBoxModelSerializer):
91 """
92 Base serializer for group assignments under CircuitSerializer.
93 """
94 group = CircuitGroupSerializer(nested=True)
95 priority = ChoiceField(choices=CircuitPriorityChoices, allow_blank=True, required=False)
97 class Meta:
98 model = CircuitGroupAssignment
99 fields = [
100 'id', 'url', 'display_url', 'display', 'group', 'priority', 'tags', 'created', 'last_updated',
101 ]
102 brief_fields = ('id', 'url', 'display', 'group', 'priority')
105class CircuitSerializer(PrimaryModelSerializer):
106 provider = ProviderSerializer(nested=True)
107 provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None)
108 status = ChoiceField(choices=CircuitStatusChoices, required=False)
109 type = CircuitTypeSerializer(nested=True)
110 distance_unit = ChoiceField(choices=DistanceUnitChoices, allow_blank=True, required=False, allow_null=True)
111 tenant = TenantSerializer(nested=True, required=False, allow_null=True)
112 termination_a = CircuitCircuitTerminationSerializer(read_only=True, allow_null=True)
113 termination_z = CircuitCircuitTerminationSerializer(read_only=True, allow_null=True)
114 assignments = CircuitGroupAssignmentSerializer_(nested=True, many=True, required=False)
116 class Meta:
117 model = Circuit
118 fields = [
119 'id', 'url', 'display_url', 'display', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant',
120 'install_date', 'termination_date', 'commit_rate', 'description', 'distance', 'distance_unit',
121 'termination_a', 'termination_z', 'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
122 'assignments',
123 ]
124 brief_fields = ('id', 'url', 'display', 'provider', 'cid', 'description')
127class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer):
128 circuit = CircuitSerializer(nested=True)
129 termination_type = ContentTypeField(
130 queryset=ContentType.objects.filter(
131 model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES
132 ),
133 allow_null=True,
134 required=False,
135 default=None
136 )
137 termination_id = serializers.IntegerField(allow_null=True, required=False, default=None)
138 termination = GFKSerializerField(read_only=True)
140 class Meta:
141 model = CircuitTermination
142 fields = [
143 'id', 'url', 'display_url', 'display', 'circuit', 'term_side', 'termination_type', 'termination_id',
144 'termination', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'mark_connected',
145 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated',
146 '_occupied',
147 ]
148 brief_fields = ('id', 'url', 'display', 'circuit', 'term_side', 'description', 'cable', '_occupied')
151class CircuitGroupAssignmentSerializer(CircuitGroupAssignmentSerializer_):
152 member_type = ContentTypeField(
153 queryset=ContentType.objects.filter(CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS)
154 )
155 member = GFKSerializerField(read_only=True)
157 class Meta:
158 model = CircuitGroupAssignment
159 fields = [
160 'id', 'url', 'display_url', 'display', 'group', 'member_type', 'member_id', 'member', 'priority', 'tags',
161 'created', 'last_updated',
162 ]
163 brief_fields = ('id', 'url', 'display', 'group', 'member_type', 'member_id', 'member', 'priority')
166class VirtualCircuitTypeSerializer(OrganizationalModelSerializer):
168 # Related object counts
169 virtual_circuit_count = RelatedObjectCountField('virtual_circuits')
171 class Meta:
172 model = VirtualCircuitType
173 fields = [
174 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
175 'custom_fields', 'created', 'last_updated', 'virtual_circuit_count',
176 ]
177 brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'virtual_circuit_count')
180class VirtualCircuitSerializer(PrimaryModelSerializer):
181 provider_network = ProviderNetworkSerializer(nested=True)
182 provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None)
183 type = VirtualCircuitTypeSerializer(nested=True)
184 status = ChoiceField(choices=CircuitStatusChoices, required=False)
185 tenant = TenantSerializer(nested=True, required=False, allow_null=True)
187 class Meta:
188 model = VirtualCircuit
189 fields = [
190 'id', 'url', 'display_url', 'display', 'cid', 'provider_network', 'provider_account', 'type', 'status',
191 'tenant', 'description', 'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
192 ]
193 brief_fields = ('id', 'url', 'display', 'provider_network', 'cid', 'description')
196class VirtualCircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer):
197 virtual_circuit = VirtualCircuitSerializer(nested=True)
198 role = ChoiceField(choices=VirtualCircuitTerminationRoleChoices, required=False)
199 interface = InterfaceSerializer(nested=True)
201 class Meta:
202 model = VirtualCircuitTermination
203 fields = [
204 'id', 'url', 'display_url', 'display', 'virtual_circuit', 'role', 'interface', 'description', 'tags',
205 'custom_fields', 'created', 'last_updated',
206 ]
207 brief_fields = ('id', 'url', 'display', 'virtual_circuit', 'role', 'interface', 'description')