Coverage for circuits/forms/bulk_import.py: 100%
92 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 import forms
2from django.contrib.contenttypes.models import ContentType
3from django.utils.translation import gettext_lazy as _
5from circuits.choices import *
6from circuits.constants import *
7from circuits.models import *
8from dcim.models import Interface
9from netbox.choices import DistanceUnitChoices
10from netbox.forms import NetBoxModelImportForm, OrganizationalModelImportForm, PrimaryModelImportForm
11from tenancy.models import Tenant
12from utilities.forms.fields import CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, SlugField
14__all__ = (
15 'CircuitGroupAssignmentImportForm',
16 'CircuitGroupImportForm',
17 'CircuitImportForm',
18 'CircuitTerminationImportForm',
19 'CircuitTerminationImportRelatedForm',
20 'CircuitTypeImportForm',
21 'ProviderAccountImportForm',
22 'ProviderImportForm',
23 'ProviderNetworkImportForm',
24 'VirtualCircuitImportForm',
25 'VirtualCircuitTerminationImportForm',
26 'VirtualCircuitTerminationImportRelatedForm',
27 'VirtualCircuitTypeImportForm',
28)
31class ProviderImportForm(PrimaryModelImportForm):
32 slug = SlugField()
34 class Meta:
35 model = Provider
36 fields = (
37 'name', 'slug', 'description', 'owner', 'comments', 'tags',
38 )
41class ProviderAccountImportForm(PrimaryModelImportForm):
42 provider = CSVModelChoiceField(
43 label=_('Provider'),
44 queryset=Provider.objects.all(),
45 to_field_name='name',
46 help_text=_('Assigned provider')
47 )
49 class Meta:
50 model = ProviderAccount
51 fields = (
52 'provider', 'name', 'account', 'description', 'owner', 'comments', 'tags',
53 )
56class ProviderNetworkImportForm(PrimaryModelImportForm):
57 provider = CSVModelChoiceField(
58 label=_('Provider'),
59 queryset=Provider.objects.all(),
60 to_field_name='name',
61 help_text=_('Assigned provider')
62 )
64 class Meta:
65 model = ProviderNetwork
66 fields = [
67 'provider', 'name', 'service_id', 'description', 'owner', 'comments', 'tags'
68 ]
71class CircuitTypeImportForm(OrganizationalModelImportForm):
72 slug = SlugField()
74 class Meta:
75 model = CircuitType
76 fields = ('name', 'slug', 'color', 'description', 'owner', 'comments', 'tags')
79class CircuitImportForm(PrimaryModelImportForm):
80 provider = CSVModelChoiceField(
81 label=_('Provider'),
82 queryset=Provider.objects.all(),
83 to_field_name='name',
84 help_text=_('Assigned provider')
85 )
86 provider_account = CSVModelChoiceField(
87 label=_('Provider account'),
88 queryset=ProviderAccount.objects.all(),
89 to_field_name='name',
90 help_text=_('Assigned provider account'),
91 required=False
92 )
93 type = CSVModelChoiceField(
94 label=_('Type'),
95 queryset=CircuitType.objects.all(),
96 to_field_name='name',
97 help_text=_('Type of circuit')
98 )
99 status = CSVChoiceField(
100 label=_('Status'),
101 choices=CircuitStatusChoices,
102 help_text=_('Operational status')
103 )
104 distance_unit = CSVChoiceField(
105 label=_('Distance unit'),
106 choices=DistanceUnitChoices,
107 required=False,
108 help_text=_('Distance unit')
109 )
110 tenant = CSVModelChoiceField(
111 label=_('Tenant'),
112 queryset=Tenant.objects.all(),
113 required=False,
114 to_field_name='name',
115 help_text=_('Assigned tenant')
116 )
118 class Meta:
119 model = Circuit
120 fields = [
121 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date',
122 'commit_rate', 'distance', 'distance_unit', 'description', 'owner', 'comments', 'tags'
123 ]
126class BaseCircuitTerminationImportForm(forms.ModelForm):
127 circuit = CSVModelChoiceField(
128 label=_('Circuit'),
129 queryset=Circuit.objects.all(),
130 to_field_name='cid',
131 )
132 term_side = CSVChoiceField(
133 label=_('Termination'),
134 choices=CircuitTerminationSideChoices,
135 )
136 termination_type = CSVContentTypeField(
137 queryset=ContentType.objects.filter(model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES),
138 required=False,
139 label=_('Termination type (app & model)')
140 )
143class CircuitTerminationImportRelatedForm(BaseCircuitTerminationImportForm):
144 class Meta:
145 model = CircuitTermination
146 fields = [
147 'circuit', 'term_side', 'termination_type', 'termination_id', 'port_speed', 'upstream_speed', 'xconnect_id',
148 'pp_info', 'description'
149 ]
150 labels = {
151 'termination_id': _('Termination ID'),
152 }
155class CircuitTerminationImportForm(NetBoxModelImportForm, BaseCircuitTerminationImportForm):
157 class Meta:
158 model = CircuitTermination
159 fields = [
160 'circuit', 'term_side', 'termination_type', 'termination_id', 'port_speed', 'upstream_speed', 'xconnect_id',
161 'pp_info', 'description', 'tags'
162 ]
163 labels = {
164 'termination_id': _('Termination ID'),
165 }
168class CircuitGroupImportForm(OrganizationalModelImportForm):
169 tenant = CSVModelChoiceField(
170 label=_('Tenant'),
171 queryset=Tenant.objects.all(),
172 required=False,
173 to_field_name='name',
174 help_text=_('Assigned tenant')
175 )
177 class Meta:
178 model = CircuitGroup
179 fields = ('name', 'slug', 'description', 'tenant', 'owner', 'comments', 'tags')
182class CircuitGroupAssignmentImportForm(NetBoxModelImportForm):
183 member_type = CSVContentTypeField(
184 queryset=ContentType.objects.filter(CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS),
185 label=_('Circuit type (app & model)')
186 )
187 priority = CSVChoiceField(
188 label=_('Priority'),
189 choices=CircuitPriorityChoices,
190 required=False
191 )
193 class Meta:
194 model = CircuitGroupAssignment
195 fields = ('member_type', 'member_id', 'group', 'priority')
198class VirtualCircuitTypeImportForm(OrganizationalModelImportForm):
200 class Meta:
201 model = VirtualCircuitType
202 fields = ('name', 'slug', 'color', 'description', 'owner', 'comments', 'tags')
205class VirtualCircuitImportForm(PrimaryModelImportForm):
206 provider_network = CSVModelChoiceField(
207 label=_('Provider network'),
208 queryset=ProviderNetwork.objects.all(),
209 to_field_name='name',
210 help_text=_('The network to which this virtual circuit belongs')
211 )
212 provider_account = CSVModelChoiceField(
213 label=_('Provider account'),
214 queryset=ProviderAccount.objects.all(),
215 to_field_name='account',
216 help_text=_('Assigned provider account (if any)'),
217 required=False
218 )
219 type = CSVModelChoiceField(
220 label=_('Type'),
221 queryset=VirtualCircuitType.objects.all(),
222 to_field_name='name',
223 help_text=_('Type of virtual circuit')
224 )
225 status = CSVChoiceField(
226 label=_('Status'),
227 choices=CircuitStatusChoices,
228 help_text=_('Operational status')
229 )
230 tenant = CSVModelChoiceField(
231 label=_('Tenant'),
232 queryset=Tenant.objects.all(),
233 required=False,
234 to_field_name='name',
235 help_text=_('Assigned tenant')
236 )
238 class Meta:
239 model = VirtualCircuit
240 fields = [
241 'cid', 'provider_network', 'provider_account', 'type', 'status', 'tenant', 'description', 'owner',
242 'comments', 'tags',
243 ]
246class BaseVirtualCircuitTerminationImportForm(forms.ModelForm):
247 virtual_circuit = CSVModelChoiceField(
248 label=_('Virtual circuit'),
249 queryset=VirtualCircuit.objects.all(),
250 to_field_name='cid',
251 )
252 role = CSVChoiceField(
253 label=_('Role'),
254 choices=VirtualCircuitTerminationRoleChoices,
255 help_text=_('Operational role')
256 )
257 interface = CSVModelChoiceField(
258 label=_('Interface'),
259 queryset=Interface.objects.all(),
260 to_field_name='pk',
261 )
264class VirtualCircuitTerminationImportRelatedForm(BaseVirtualCircuitTerminationImportForm):
266 class Meta:
267 model = VirtualCircuitTermination
268 fields = [
269 'virtual_circuit', 'role', 'interface', 'description',
270 ]
273class VirtualCircuitTerminationImportForm(NetBoxModelImportForm, BaseVirtualCircuitTerminationImportForm):
275 class Meta:
276 model = VirtualCircuitTermination
277 fields = [
278 'virtual_circuit', 'role', 'interface', 'description', 'tags',
279 ]