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

1from django import forms 

2from django.conf import settings 

3from django.utils.translation import gettext_lazy as _ 

4 

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 

18 

19from ..choices import * 

20from ..models import * 

21 

22__all__ = ( 

23 'ClusterFilterForm', 

24 'ClusterGroupFilterForm', 

25 'ClusterTypeFilterForm', 

26 'VMInterfaceFilterForm', 

27 'VirtualDiskFilterForm', 

28 'VirtualMachineFilterForm', 

29 'VirtualMachineTypeFilterForm', 

30) 

31 

32 

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) 

40 

41 

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 ) 

50 

51 

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) 

105 

106 

107class VirtualMachineTypeFilterForm(PrimaryModelFilterSetForm): 

108 model = VirtualMachineType 

109 

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 ) 

118 

119 selector_fields = ('filter_id', 'q') 

120 

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 ) 

140 

141 tag = TagFilterField(model) 

142 

143 def __init__(self, *args, **kwargs): 

144 super().__init__(*args, **kwargs) 

145 

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 ) 

150 

151 

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) 

266 

267 

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) 

324 

325 

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) 

345 

346 def __init__(self, *args, **kwargs): 

347 super().__init__(*args, **kwargs) 

348 

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