Skip to content

Commit 0a4fa6f

Browse files
committed
feat(forms): Add generic source and destination fields for ACL rules
Integrates generic object handling for source and destination fields in ACLStandardRuleForm and ACLExtendedRuleForm. Introduces support for content types, dynamic queries, and enhanced validation. Improves alignment with the generic source/destination model update.
1 parent 48f5f53 commit 0a4fa6f

File tree

2 files changed

+363
-55
lines changed

2 files changed

+363
-55
lines changed

netbox_acls/forms/filtersets.py

Lines changed: 140 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from dcim.models import Device, Interface, Region, Site, SiteGroup, VirtualChassis
66
from django import forms
77
from django.utils.translation import gettext_lazy as _
8-
from ipam.models import Prefix
8+
from ipam.models import Aggregate, IPAddress, IPRange, Prefix
99
from netbox.forms import NetBoxModelFilterSetForm
1010
from utilities.forms.fields import (
1111
DynamicModelChoiceField,
@@ -45,17 +45,38 @@ class AccessListFilterForm(NetBoxModelFilterSetForm):
4545

4646
model = AccessList
4747
fieldsets = (
48-
FieldSet("q", "tag", name=None),
49-
FieldSet("type", "default_action", name=_("ACL Details")),
50-
FieldSet("region_id", "site_group_id", "site_id", "device_id", name=_("Device Details")),
51-
FieldSet("virtual_chassis_id", name=_("Virtual Chassis Details")),
52-
FieldSet("virtual_machine_id", name=_("Virtual Machine Details")),
48+
FieldSet(
49+
"q",
50+
"tag",
51+
name=None,
52+
),
53+
FieldSet(
54+
"type",
55+
"default_action",
56+
name=_("ACL Details"),
57+
),
58+
FieldSet(
59+
"region_id",
60+
"site_group_id",
61+
"site_id",
62+
"device_id",
63+
name=_("Device Details"),
64+
),
65+
FieldSet(
66+
"virtual_chassis_id",
67+
name=_("Virtual Chassis Details"),
68+
),
69+
FieldSet(
70+
"virtual_machine_id",
71+
name=_("Virtual Machine Details"),
72+
),
5373
)
5474

55-
# ACL
75+
# ACL selector
5676
type = forms.ChoiceField(
5777
choices=add_blank_choice(ACLTypeChoices),
5878
required=False,
79+
label=_("Type"),
5980
)
6081
default_action = forms.ChoiceField(
6182
choices=add_blank_choice(ACLActionChoices),
@@ -119,10 +140,29 @@ class ACLInterfaceAssignmentFilterForm(NetBoxModelFilterSetForm):
119140

120141
model = ACLInterfaceAssignment
121142
fieldsets = (
122-
FieldSet("q", "tag", name=None),
123-
FieldSet("access_list_id", "direction", name=_("ACL Details")),
124-
FieldSet("region_id", "site_group_id", "site_id", "device_id", "interface_id", name=_("Device Details")),
125-
FieldSet("virtual_machine_id", "vminterface_id", name=_("Virtual Machine Details")),
143+
FieldSet(
144+
"q",
145+
"tag",
146+
name=None,
147+
),
148+
FieldSet(
149+
"access_list_id",
150+
"direction",
151+
name=_("ACL Details"),
152+
),
153+
FieldSet(
154+
"region_id",
155+
"site_group_id",
156+
"site_id",
157+
"device_id",
158+
"interface_id",
159+
name=_("Device Details"),
160+
),
161+
FieldSet(
162+
"virtual_machine_id",
163+
"vminterface_id",
164+
name=_("Virtual Machine Details"),
165+
),
126166
)
127167

128168
# ACL selector
@@ -202,9 +242,24 @@ class ACLStandardRuleFilterForm(NetBoxModelFilterSetForm):
202242

203243
model = ACLStandardRule
204244
fieldsets = (
205-
FieldSet("q", "tag", name=None),
206-
FieldSet("access_list_id", "index", "action", name=_("ACL Details")),
207-
FieldSet("source_prefix_id", name=_("Source Details")),
245+
FieldSet(
246+
"q",
247+
"tag",
248+
name=None,
249+
),
250+
FieldSet(
251+
"access_list_id",
252+
"index",
253+
"action",
254+
name=_("ACL Details"),
255+
),
256+
FieldSet(
257+
"source_aggregate_id",
258+
"source_ipaddress_id",
259+
"source_iprange_id",
260+
"source_prefix_id",
261+
name=_("Source Details"),
262+
),
208263
)
209264

210265
access_list_id = DynamicModelMultipleChoiceField(
@@ -226,6 +281,21 @@ class ACLStandardRuleFilterForm(NetBoxModelFilterSetForm):
226281
)
227282

228283
# Source selectors
284+
source_aggregate_id = DynamicModelMultipleChoiceField(
285+
queryset=Aggregate.objects.all(),
286+
required=False,
287+
label=_("Source Aggregate"),
288+
)
289+
source_ipaddress_id = DynamicModelMultipleChoiceField(
290+
queryset=IPAddress.objects.all(),
291+
required=False,
292+
label=_("Source IP-Address"),
293+
)
294+
source_iprange_id = DynamicModelMultipleChoiceField(
295+
queryset=IPRange.objects.all(),
296+
required=False,
297+
label=_("Source IP-Range"),
298+
)
229299
source_prefix_id = DynamicModelMultipleChoiceField(
230300
queryset=Prefix.objects.all(),
231301
required=False,
@@ -243,10 +313,32 @@ class ACLExtendedRuleFilterForm(NetBoxModelFilterSetForm):
243313

244314
model = ACLExtendedRule
245315
fieldsets = (
246-
FieldSet("q", "tag", name=None),
247-
FieldSet("access_list_id", "index", "action", "protocol", name=_("ACL Details")),
248-
FieldSet("source_prefix_id", name=_("Source Details")),
249-
FieldSet("destination_prefix_id", name=_("Destination Details")),
316+
FieldSet(
317+
"q",
318+
"tag",
319+
name=None,
320+
),
321+
FieldSet(
322+
"access_list_id",
323+
"index",
324+
"action",
325+
"protocol",
326+
name=_("ACL Details"),
327+
),
328+
FieldSet(
329+
"source_aggregate_id",
330+
"source_ipaddress_id",
331+
"source_iprange_id",
332+
"source_prefix_id",
333+
name=_("Source Details"),
334+
),
335+
FieldSet(
336+
"destination_aggregate_id",
337+
"destination_ipaddress_id",
338+
"destination_iprange_id",
339+
"destination_prefix_id",
340+
name=_("Destination Details"),
341+
),
250342
)
251343

252344
access_list_id = DynamicModelMultipleChoiceField(
@@ -273,13 +365,43 @@ class ACLExtendedRuleFilterForm(NetBoxModelFilterSetForm):
273365
)
274366

275367
# Source selectors
368+
source_aggregate_id = DynamicModelMultipleChoiceField(
369+
queryset=Aggregate.objects.all(),
370+
required=False,
371+
label=_("Source Aggregate"),
372+
)
373+
source_ipaddress_id = DynamicModelMultipleChoiceField(
374+
queryset=IPAddress.objects.all(),
375+
required=False,
376+
label=_("Source IP-Address"),
377+
)
378+
source_iprange_id = DynamicModelMultipleChoiceField(
379+
queryset=IPRange.objects.all(),
380+
required=False,
381+
label=_("Source IP-Range"),
382+
)
276383
source_prefix_id = DynamicModelMultipleChoiceField(
277384
queryset=Prefix.objects.all(),
278385
required=False,
279386
label=_("Source Prefix"),
280387
)
281388

282389
# Destination selectors
390+
destination_aggregate_id = DynamicModelMultipleChoiceField(
391+
queryset=Aggregate.objects.all(),
392+
required=False,
393+
label=_("Destination Aggregate"),
394+
)
395+
destination_ipaddress_id = DynamicModelMultipleChoiceField(
396+
queryset=IPAddress.objects.all(),
397+
required=False,
398+
label=_("Destination IP-Address"),
399+
)
400+
destination_iprange_id = DynamicModelMultipleChoiceField(
401+
queryset=IPRange.objects.all(),
402+
required=False,
403+
label=_("Destination IP-Range"),
404+
)
283405
destination_prefix_id = DynamicModelMultipleChoiceField(
284406
queryset=Prefix.objects.all(),
285407
required=False,

0 commit comments

Comments
 (0)