Coverage for circuits/forms/bulk_edit.py: 100%
89 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 (
6 CircuitCommitRateChoices,
7 CircuitPriorityChoices,
8 CircuitStatusChoices,
9 VirtualCircuitTerminationRoleChoices,
10)
11from circuits.constants import CIRCUIT_TERMINATION_TERMINATION_TYPES
12from circuits.models import *
13from ipam.models import ASN
14from netbox.choices import DistanceUnitChoices
15from netbox.forms import NetBoxModelBulkEditForm, OrganizationalModelBulkEditForm, PrimaryModelBulkEditForm
16from tenancy.models import Tenant
17from utilities.forms import GenericObjectFormMixin, add_blank_choice
18from utilities.forms.fields import (
19 ChoiceField,
20 ColorField,
21 DynamicModelChoiceField,
22 DynamicModelMultipleChoiceField,
23 GenericObjectChoiceField,
24)
25from utilities.forms.rendering import FieldSet
26from utilities.forms.widgets import BulkEditNullBooleanSelect, DatePicker, NumberWithOptions
28__all__ = (
29 'CircuitBulkEditForm',
30 'CircuitGroupAssignmentBulkEditForm',
31 'CircuitGroupBulkEditForm',
32 'CircuitTerminationBulkEditForm',
33 'CircuitTypeBulkEditForm',
34 'ProviderAccountBulkEditForm',
35 'ProviderBulkEditForm',
36 'ProviderNetworkBulkEditForm',
37 'VirtualCircuitBulkEditForm',
38 'VirtualCircuitTerminationBulkEditForm',
39 'VirtualCircuitTypeBulkEditForm',
40)
43class ProviderBulkEditForm(PrimaryModelBulkEditForm):
44 asns = DynamicModelMultipleChoiceField(
45 queryset=ASN.objects.all(),
46 label=_('ASNs'),
47 required=False
48 )
50 model = Provider
51 fieldsets = (
52 FieldSet('asns', 'description'),
53 )
54 nullable_fields = (
55 'asns', 'description', 'comments',
56 )
59class ProviderAccountBulkEditForm(PrimaryModelBulkEditForm):
60 provider = DynamicModelChoiceField(
61 label=_('Provider'),
62 queryset=Provider.objects.all(),
63 required=False
64 )
66 model = ProviderAccount
67 fieldsets = (
68 FieldSet('provider', 'description'),
69 )
70 nullable_fields = (
71 'description', 'comments',
72 )
75class ProviderNetworkBulkEditForm(PrimaryModelBulkEditForm):
76 provider = DynamicModelChoiceField(
77 label=_('Provider'),
78 queryset=Provider.objects.all(),
79 required=False
80 )
81 service_id = forms.CharField(
82 max_length=100,
83 required=False,
84 label=_('Service ID')
85 )
87 model = ProviderNetwork
88 fieldsets = (
89 FieldSet('provider', 'service_id', 'description'),
90 )
91 nullable_fields = (
92 'service_id', 'description', 'comments',
93 )
96class CircuitTypeBulkEditForm(OrganizationalModelBulkEditForm):
97 color = ColorField(
98 label=_('Color'),
99 required=False
100 )
102 model = CircuitType
103 fieldsets = (
104 FieldSet('color', 'description'),
105 )
106 nullable_fields = ('color', 'description', 'comments')
109class CircuitBulkEditForm(PrimaryModelBulkEditForm):
110 type = DynamicModelChoiceField(
111 label=_('Type'),
112 queryset=CircuitType.objects.all(),
113 required=False
114 )
115 provider = DynamicModelChoiceField(
116 label=_('Provider'),
117 queryset=Provider.objects.all(),
118 required=False
119 )
120 provider_account = DynamicModelChoiceField(
121 label=_('Provider account'),
122 queryset=ProviderAccount.objects.all(),
123 required=False,
124 query_params={
125 'provider': '$provider'
126 }
127 )
128 status = ChoiceField(
129 label=_('Status'),
130 choices=add_blank_choice(CircuitStatusChoices),
131 required=False,
132 initial=''
133 )
134 tenant = DynamicModelChoiceField(
135 label=_('Tenant'),
136 queryset=Tenant.objects.all(),
137 required=False
138 )
139 install_date = forms.DateField(
140 label=_('Install date'),
141 required=False,
142 widget=DatePicker()
143 )
144 termination_date = forms.DateField(
145 label=_('Termination date'),
146 required=False,
147 widget=DatePicker()
148 )
149 commit_rate = forms.IntegerField(
150 required=False,
151 label=_('Commit rate (Kbps)'),
152 widget=NumberWithOptions(
153 options=CircuitCommitRateChoices
154 )
155 )
156 distance = forms.DecimalField(
157 label=_('Distance'),
158 min_value=0,
159 required=False
160 )
161 distance_unit = ChoiceField(
162 label=_('Distance unit'),
163 choices=add_blank_choice(DistanceUnitChoices),
164 required=False,
165 initial=''
166 )
168 model = Circuit
169 fieldsets = (
170 FieldSet('provider', 'type', 'status', 'description', name=_('Circuit')),
171 FieldSet('provider_account', 'install_date', 'termination_date', 'commit_rate', name=_('Service Parameters')),
172 FieldSet('distance', 'distance_unit', name=_('Attributes')),
173 FieldSet('tenant', name=_('Tenancy')),
174 )
175 nullable_fields = (
176 'tenant', 'commit_rate', 'description', 'comments',
177 )
180class CircuitTerminationBulkEditForm(GenericObjectFormMixin, NetBoxModelBulkEditForm):
181 description = forms.CharField(
182 label=_('Description'),
183 max_length=200,
184 required=False
185 )
186 termination = GenericObjectChoiceField(
187 label=_('Termination'),
188 content_type_queryset=ContentType.objects.filter(model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES),
189 required=False,
190 selector=True,
191 hx_method='post',
192 )
193 port_speed = forms.IntegerField(
194 required=False,
195 label=_('Port speed (Kbps)'),
196 )
197 upstream_speed = forms.IntegerField(
198 required=False,
199 label=_('Upstream speed (Kbps)'),
200 )
201 mark_connected = forms.NullBooleanField(
202 label=_('Mark connected'),
203 required=False,
204 widget=BulkEditNullBooleanSelect
205 )
207 model = CircuitTermination
208 fieldsets = (
209 FieldSet(
210 'description', 'termination', 'mark_connected', name=_('Circuit Termination')
211 ),
212 FieldSet('port_speed', 'upstream_speed', name=_('Termination Details')),
213 )
214 nullable_fields = ('description', 'termination')
217class CircuitGroupBulkEditForm(OrganizationalModelBulkEditForm):
218 tenant = DynamicModelChoiceField(
219 label=_('Tenant'),
220 queryset=Tenant.objects.all(),
221 required=False
222 )
224 model = CircuitGroup
225 nullable_fields = (
226 'description', 'tenant', 'comments',
227 )
230class CircuitGroupAssignmentBulkEditForm(NetBoxModelBulkEditForm):
231 member = DynamicModelChoiceField(
232 label=_('Circuit'),
233 queryset=Circuit.objects.all(),
234 required=False
235 )
236 priority = ChoiceField(
237 label=_('Priority'),
238 choices=add_blank_choice(CircuitPriorityChoices),
239 required=False
240 )
242 model = CircuitGroupAssignment
243 fieldsets = (
244 FieldSet('member', 'priority'),
245 )
246 nullable_fields = ('priority',)
249class VirtualCircuitTypeBulkEditForm(OrganizationalModelBulkEditForm):
250 color = ColorField(
251 label=_('Color'),
252 required=False
253 )
255 model = VirtualCircuitType
256 fieldsets = (
257 FieldSet('color', 'description'),
258 )
259 nullable_fields = ('color', 'description', 'comments')
262class VirtualCircuitBulkEditForm(PrimaryModelBulkEditForm):
263 provider_network = DynamicModelChoiceField(
264 label=_('Provider network'),
265 queryset=ProviderNetwork.objects.all(),
266 required=False
267 )
268 provider_account = DynamicModelChoiceField(
269 label=_('Provider account'),
270 queryset=ProviderAccount.objects.all(),
271 required=False
272 )
273 type = DynamicModelChoiceField(
274 label=_('Type'),
275 queryset=VirtualCircuitType.objects.all(),
276 required=False
277 )
278 status = ChoiceField(
279 label=_('Status'),
280 choices=add_blank_choice(CircuitStatusChoices),
281 required=False,
282 initial=''
283 )
284 tenant = DynamicModelChoiceField(
285 label=_('Tenant'),
286 queryset=Tenant.objects.all(),
287 required=False
288 )
290 model = VirtualCircuit
291 fieldsets = (
292 FieldSet('provider_network', 'provider_account', 'status', 'description', name=_('Virtual circuit')),
293 FieldSet('tenant', name=_('Tenancy')),
294 )
295 nullable_fields = (
296 'provider_account', 'tenant', 'description', 'comments',
297 )
300class VirtualCircuitTerminationBulkEditForm(NetBoxModelBulkEditForm):
301 role = ChoiceField(
302 label=_('Role'),
303 choices=add_blank_choice(VirtualCircuitTerminationRoleChoices),
304 required=False,
305 initial=''
306 )
307 description = forms.CharField(
308 label=_('Description'),
309 max_length=200,
310 required=False
311 )
313 model = VirtualCircuitTermination
314 fieldsets = (
315 FieldSet('role', 'description'),
316 )
317 nullable_fields = ('description',)