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

1from django.contrib.contenttypes.models import ContentType 

2from rest_framework import serializers 

3 

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 

28 

29from .providers import ProviderAccountSerializer, ProviderNetworkSerializer, ProviderSerializer 

30 

31__all__ = ( 

32 'CircuitGroupAssignmentSerializer', 

33 'CircuitGroupSerializer', 

34 'CircuitSerializer', 

35 'CircuitTerminationSerializer', 

36 'CircuitTypeSerializer', 

37 'VirtualCircuitSerializer', 

38 'VirtualCircuitTerminationSerializer', 

39 'VirtualCircuitTypeSerializer', 

40) 

41 

42 

43class CircuitTypeSerializer(OrganizationalModelSerializer): 

44 

45 # Related object counts 

46 circuit_count = RelatedObjectCountField('circuits') 

47 

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') 

55 

56 

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) 

68 

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 ] 

75 

76 

77class CircuitGroupSerializer(OrganizationalModelSerializer): 

78 tenant = TenantSerializer(nested=True, required=False, allow_null=True) 

79 circuit_count = RelatedObjectCountField('assignments') 

80 

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') 

88 

89 

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) 

96 

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') 

103 

104 

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) 

115 

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') 

125 

126 

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) 

139 

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') 

149 

150 

151class CircuitGroupAssignmentSerializer(CircuitGroupAssignmentSerializer_): 

152 member_type = ContentTypeField( 

153 queryset=ContentType.objects.filter(CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS) 

154 ) 

155 member = GFKSerializerField(read_only=True) 

156 

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') 

164 

165 

166class VirtualCircuitTypeSerializer(OrganizationalModelSerializer): 

167 

168 # Related object counts 

169 virtual_circuit_count = RelatedObjectCountField('virtual_circuits') 

170 

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') 

178 

179 

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) 

186 

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') 

194 

195 

196class VirtualCircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer): 

197 virtual_circuit = VirtualCircuitSerializer(nested=True) 

198 role = ChoiceField(choices=VirtualCircuitTerminationRoleChoices, required=False) 

199 interface = InterfaceSerializer(nested=True) 

200 

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')