Coverage for virtualization/forms/filtersets.py: 96%
93 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.conf import settings
3from django.utils.translation import gettext_lazy as _
5from dcim.choices import *
6from dcim.models import Device, DeviceRole, Location, Platform, Region, Site, SiteGroup
7from extras.forms import LocalConfigContextFilterForm
8from extras.models import ConfigTemplate
9from ipam.models import VRF, VLANTranslationPolicy
10from netbox.forms import NetBoxModelFilterSetForm, OrganizationalModelFilterSetForm, PrimaryModelFilterSetForm
11from netbox.forms.mixins import OwnerFilterMixin
12from tenancy.forms import ContactModelFilterForm, TenancyFilterForm
13from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES
14from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField
15from utilities.forms.rendering import FieldSet
16from utilities.forms.utils import get_capacity_unit_label
17from vpn.models import L2VPN
19from ..choices import *
20from ..models import *
22__all__ = (
23 'ClusterFilterForm',
24 'ClusterGroupFilterForm',
25 'ClusterTypeFilterForm',
26 'VMInterfaceFilterForm',
27 'VirtualDiskFilterForm',
28 'VirtualMachineFilterForm',
29 'VirtualMachineTypeFilterForm',
30)
33class ClusterTypeFilterForm(OrganizationalModelFilterSetForm):
34 model = ClusterType
35 fieldsets = (
36 FieldSet('q', 'filter_id', 'tag'),
37 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')),
38 )
39 tag = TagFilterField(model)
42class ClusterGroupFilterForm(ContactModelFilterForm, OrganizationalModelFilterSetForm):
43 model = ClusterGroup
44 tag = TagFilterField(model)
45 fieldsets = (
46 FieldSet('q', 'filter_id', 'tag'),
47 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')),
48 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')),
49 )
52class ClusterFilterForm(TenancyFilterForm, ContactModelFilterForm, PrimaryModelFilterSetForm):
53 model = Cluster
54 fieldsets = (
55 FieldSet('q', 'filter_id', 'tag'),
56 FieldSet('group_id', 'type_id', 'status', name=_('Attributes')),
57 FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Scope')),
58 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')),
59 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')),
60 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')),
61 )
62 selector_fields = ('filter_id', 'q', 'group_id')
63 type_id = DynamicModelMultipleChoiceField(
64 queryset=ClusterType.objects.all(),
65 required=False,
66 label=_('Type')
67 )
68 region_id = DynamicModelMultipleChoiceField(
69 queryset=Region.objects.all(),
70 required=False,
71 label=_('Region')
72 )
73 site_group_id = DynamicModelMultipleChoiceField(
74 queryset=SiteGroup.objects.all(),
75 required=False,
76 label=_('Site group')
77 )
78 site_id = DynamicModelMultipleChoiceField(
79 queryset=Site.objects.all(),
80 required=False,
81 null_option='None',
82 query_params={
83 'region_id': '$region_id',
84 'site_group_id': '$site_group_id',
85 },
86 label=_('Site')
87 )
88 location_id = DynamicModelMultipleChoiceField(
89 queryset=Location.objects.all(),
90 required=False,
91 label=_('Location')
92 )
93 status = forms.MultipleChoiceField(
94 label=_('Status'),
95 choices=ClusterStatusChoices,
96 required=False
97 )
98 group_id = DynamicModelMultipleChoiceField(
99 queryset=ClusterGroup.objects.all(),
100 required=False,
101 null_option='None',
102 label=_('Group')
103 )
104 tag = TagFilterField(model)
107class VirtualMachineTypeFilterForm(PrimaryModelFilterSetForm):
108 model = VirtualMachineType
110 fieldsets = (
111 FieldSet('q', 'filter_id', 'tag'),
112 FieldSet(
113 'default_platform_id', 'default_vcpus', 'default_memory', 'virtual_machine_count',
114 name=_('Attributes'),
115 ),
116 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')),
117 )
119 selector_fields = ('filter_id', 'q')
121 default_platform_id = DynamicModelMultipleChoiceField(
122 queryset=Platform.objects.all(),
123 required=False,
124 label=_('Default platform'),
125 )
126 default_vcpus = forms.DecimalField(
127 label=_('Default vCPUs'),
128 required=False,
129 )
130 default_memory = forms.IntegerField(
131 label=_('Default memory'),
132 required=False,
133 min_value=0,
134 )
135 virtual_machine_count = forms.IntegerField(
136 label=_('Virtual machine count'),
137 required=False,
138 min_value=0,
139 )
141 tag = TagFilterField(model)
143 def __init__(self, *args, **kwargs):
144 super().__init__(*args, **kwargs)
146 # Set unit label based on configured RAM_BASE_UNIT (MB vs MiB)
147 self.fields['default_memory'].label = _('Default memory ({unit})').format(
148 unit=get_capacity_unit_label(settings.RAM_BASE_UNIT)
149 )
152class VirtualMachineFilterForm(
153 LocalConfigContextFilterForm,
154 TenancyFilterForm,
155 ContactModelFilterForm,
156 PrimaryModelFilterSetForm
157):
158 model = VirtualMachine
159 fieldsets = (
160 FieldSet('q', 'filter_id', 'tag'),
161 FieldSet('cluster_group_id', 'cluster_type_id', 'cluster_id', 'device_id', name=_('Cluster')),
162 FieldSet('region_id', 'site_group_id', 'site_id', name=_('Location')),
163 FieldSet(
164 'virtual_machine_type_id', 'status', 'start_on_boot', 'role_id', 'platform_id', 'mac_address',
165 'has_primary_ip', 'config_template_id', 'local_context_data', 'serial',
166 name=_('Attributes')
167 ),
168 FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')),
169 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')),
170 FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')),
171 )
172 virtual_machine_type_id = DynamicModelMultipleChoiceField(
173 queryset=VirtualMachineType.objects.all(),
174 required=False,
175 null_option='None',
176 label=_('Virtual machine type'),
177 )
178 cluster_group_id = DynamicModelMultipleChoiceField(
179 queryset=ClusterGroup.objects.all(),
180 required=False,
181 null_option='None',
182 label=_('Cluster group')
183 )
184 cluster_type_id = DynamicModelMultipleChoiceField(
185 queryset=ClusterType.objects.all(),
186 required=False,
187 null_option='None',
188 label=_('Cluster type')
189 )
190 cluster_id = DynamicModelMultipleChoiceField(
191 queryset=Cluster.objects.all(),
192 required=False,
193 label=_('Cluster')
194 )
195 device_id = DynamicModelMultipleChoiceField(
196 queryset=Device.objects.all(),
197 required=False,
198 label=_('Device')
199 )
200 region_id = DynamicModelMultipleChoiceField(
201 queryset=Region.objects.all(),
202 required=False,
203 label=_('Region')
204 )
205 site_group_id = DynamicModelMultipleChoiceField(
206 queryset=SiteGroup.objects.all(),
207 required=False,
208 label=_('Site group')
209 )
210 site_id = DynamicModelMultipleChoiceField(
211 queryset=Site.objects.all(),
212 required=False,
213 null_option='None',
214 query_params={
215 'region_id': '$region_id',
216 'group_id': '$site_group_id',
217 },
218 label=_('Site')
219 )
220 role_id = DynamicModelMultipleChoiceField(
221 queryset=DeviceRole.objects.all(),
222 required=False,
223 null_option='None',
224 query_params={
225 'vm_role': "True"
226 },
227 label=_('Role')
228 )
229 status = forms.MultipleChoiceField(
230 label=_('Status'),
231 choices=VirtualMachineStatusChoices,
232 required=False
233 )
234 start_on_boot = forms.MultipleChoiceField(
235 label=_('Start on boot'),
236 choices=VirtualMachineStartOnBootChoices,
237 required=False
238 )
239 platform_id = DynamicModelMultipleChoiceField(
240 queryset=Platform.objects.all(),
241 required=False,
242 null_option='None',
243 label=_('Platform')
244 )
245 mac_address = forms.CharField(
246 required=False,
247 label=_('MAC address')
248 )
249 has_primary_ip = forms.NullBooleanField(
250 required=False,
251 label=_('Has a primary IP'),
252 widget=forms.Select(
253 choices=BOOLEAN_WITH_BLANK_CHOICES
254 )
255 )
256 serial = forms.CharField(
257 required=False,
258 label=_('Serial number')
259 )
260 config_template_id = DynamicModelMultipleChoiceField(
261 queryset=ConfigTemplate.objects.all(),
262 required=False,
263 label=_('Config template')
264 )
265 tag = TagFilterField(model)
268class VMInterfaceFilterForm(OwnerFilterMixin, NetBoxModelFilterSetForm):
269 model = VMInterface
270 fieldsets = (
271 FieldSet('q', 'filter_id', 'tag'),
272 FieldSet('cluster_id', 'virtual_machine_id', name=_('Virtual Machine')),
273 FieldSet('enabled', name=_('Attributes')),
274 FieldSet('vrf_id', 'l2vpn_id', 'mac_address', name=_('Addressing')),
275 FieldSet('mode', 'vlan_translation_policy_id', name=_('802.1Q Switching')),
276 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')),
277 )
278 selector_fields = ('filter_id', 'q', 'virtual_machine_id')
279 cluster_id = DynamicModelMultipleChoiceField(
280 queryset=Cluster.objects.all(),
281 required=False,
282 label=_('Cluster')
283 )
284 virtual_machine_id = DynamicModelMultipleChoiceField(
285 queryset=VirtualMachine.objects.all(),
286 required=False,
287 query_params={
288 'cluster_id': '$cluster_id'
289 },
290 label=_('Virtual machine')
291 )
292 enabled = forms.NullBooleanField(
293 label=_('Enabled'),
294 required=False,
295 widget=forms.Select(
296 choices=BOOLEAN_WITH_BLANK_CHOICES
297 )
298 )
299 mac_address = forms.CharField(
300 required=False,
301 label=_('MAC address')
302 )
303 vrf_id = DynamicModelMultipleChoiceField(
304 queryset=VRF.objects.all(),
305 required=False,
306 label=_('VRF')
307 )
308 l2vpn_id = DynamicModelMultipleChoiceField(
309 queryset=L2VPN.objects.all(),
310 required=False,
311 label=_('L2VPN')
312 )
313 mode = forms.MultipleChoiceField(
314 choices=InterfaceModeChoices,
315 required=False,
316 label=_('802.1Q mode')
317 )
318 vlan_translation_policy_id = DynamicModelMultipleChoiceField(
319 queryset=VLANTranslationPolicy.objects.all(),
320 required=False,
321 label=_('VLAN Translation Policy')
322 )
323 tag = TagFilterField(model)
326class VirtualDiskFilterForm(OwnerFilterMixin, NetBoxModelFilterSetForm):
327 model = VirtualDisk
328 fieldsets = (
329 FieldSet('q', 'filter_id', 'tag'),
330 FieldSet('virtual_machine_id', name=_('Virtual Machine')),
331 FieldSet('size', name=_('Attributes')),
332 FieldSet('owner_group_id', 'owner_id', name=_('Ownership')),
333 )
334 virtual_machine_id = DynamicModelMultipleChoiceField(
335 queryset=VirtualMachine.objects.all(),
336 required=False,
337 label=_('Virtual machine')
338 )
339 size = forms.IntegerField(
340 label=_('Size'),
341 required=False,
342 min_value=1
343 )
344 tag = TagFilterField(model)
346 def __init__(self, *args, **kwargs):
347 super().__init__(*args, **kwargs)
349 # Set unit label based on configured DISK_BASE_UNIT (MB vs MiB)
350 self.fields['size'].label = _('Size ({unit})').format(unit=get_capacity_unit_label(settings.DISK_BASE_UNIT))