Skip to content

Commit 48f5f53

Browse files
committed
feat(filtersets): Extend filter support for ACL source/destination
Adds support for filtering by aggregates, IP addresses, and IP ranges in both source and destination fields. Updates filter fields for better alignment with the extended ACL rules model.
1 parent 58e329c commit 48f5f53

File tree

1 file changed

+135
-14
lines changed

1 file changed

+135
-14
lines changed

netbox_acls/filtersets.py

Lines changed: 135 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from dcim.models import Device, Interface, Region, Site, SiteGroup, VirtualChassis
88
from django.db.models import Q
99
from django.utils.translation import gettext_lazy as _
10-
from ipam.models import Prefix
10+
from ipam.models import Aggregate, IPAddress, IPRange, Prefix
1111
from netbox.filtersets import NetBoxModelFilterSet
1212
from virtualization.models import VirtualMachine, VMInterface
1313

@@ -203,14 +203,50 @@ class ACLStandardRuleFilterSet(NetBoxModelFilterSet):
203203
)
204204

205205
# Source
206+
source_aggregate = django_filters.ModelMultipleChoiceFilter(
207+
field_name="_source_aggregate",
208+
queryset=Aggregate.objects.all(),
209+
to_field_name="name",
210+
label=_("Source Aggregate (name)"),
211+
)
212+
source_aggregate_id = django_filters.ModelMultipleChoiceFilter(
213+
field_name="_source_aggregate",
214+
queryset=Aggregate.objects.all(),
215+
to_field_name="id",
216+
label=_("Source Aggregate (ID)"),
217+
)
218+
source_ipaddress = django_filters.ModelMultipleChoiceFilter(
219+
field_name="_source_ipaddress",
220+
queryset=IPAddress.objects.all(),
221+
to_field_name="name",
222+
label=_("Source IP-Address (name)"),
223+
)
224+
source_ipaddress_id = django_filters.ModelMultipleChoiceFilter(
225+
field_name="_source_ipaddress",
226+
queryset=IPAddress.objects.all(),
227+
to_field_name="id",
228+
label=_("Source IP-Address (ID)"),
229+
)
230+
source_iprange = django_filters.ModelMultipleChoiceFilter(
231+
field_name="_source_iprange",
232+
queryset=IPRange.objects.all(),
233+
to_field_name="name",
234+
label=_("Source IP-Range (name)"),
235+
)
236+
source_iprange_id = django_filters.ModelMultipleChoiceFilter(
237+
field_name="_source_iprange",
238+
queryset=IPRange.objects.all(),
239+
to_field_name="id",
240+
label=_("Source IP-Range (ID)"),
241+
)
206242
source_prefix = django_filters.ModelMultipleChoiceFilter(
207-
field_name="source_prefix",
243+
field_name="_source_prefix",
208244
queryset=Prefix.objects.all(),
209245
to_field_name="name",
210246
label=_("Source Prefix (name)"),
211247
)
212248
source_prefix_id = django_filters.ModelMultipleChoiceFilter(
213-
field_name="source_prefix",
249+
field_name="_source_prefix",
214250
queryset=Prefix.objects.all(),
215251
to_field_name="id",
216252
label=_("Source Prefix (ID)"),
@@ -222,17 +258,20 @@ class Meta:
222258
"""
223259

224260
model = ACLStandardRule
225-
fields = ("id", "access_list", "index", "action")
261+
fields = (
262+
"id",
263+
"access_list",
264+
"index",
265+
"action",
266+
"source_type",
267+
"source_id",
268+
)
226269

227270
def search(self, queryset, name, value):
228271
"""
229272
Override the default search behavior for the django model.
230273
"""
231-
query = (
232-
Q(access_list__name__icontains=value)
233-
| Q(index__icontains=value)
234-
| Q(action__icontains=value)
235-
)
274+
query = Q(access_list__name__icontains=value) | Q(index__icontains=value) | Q(action__icontains=value)
236275
return queryset.filter(query)
237276

238277

@@ -254,28 +293,100 @@ class ACLExtendedRuleFilterSet(NetBoxModelFilterSet):
254293
)
255294

256295
# Source
296+
source_aggregate = django_filters.ModelMultipleChoiceFilter(
297+
field_name="_source_aggregate",
298+
queryset=Aggregate.objects.all(),
299+
to_field_name="name",
300+
label=_("Source Aggregate (name)"),
301+
)
302+
source_aggregate_id = django_filters.ModelMultipleChoiceFilter(
303+
field_name="_source_aggregate",
304+
queryset=Aggregate.objects.all(),
305+
to_field_name="id",
306+
label=_("Source Aggregate (ID)"),
307+
)
308+
source_ipaddress = django_filters.ModelMultipleChoiceFilter(
309+
field_name="_source_ipaddress",
310+
queryset=IPAddress.objects.all(),
311+
to_field_name="name",
312+
label=_("Source IP-Address (name)"),
313+
)
314+
source_ipaddress_id = django_filters.ModelMultipleChoiceFilter(
315+
field_name="_source_ipaddress",
316+
queryset=IPAddress.objects.all(),
317+
to_field_name="id",
318+
label=_("Source IP-Address (ID)"),
319+
)
320+
source_iprange = django_filters.ModelMultipleChoiceFilter(
321+
field_name="_source_iprange",
322+
queryset=IPRange.objects.all(),
323+
to_field_name="name",
324+
label=_("Source IP-Range (name)"),
325+
)
326+
source_iprange_id = django_filters.ModelMultipleChoiceFilter(
327+
field_name="_source_iprange",
328+
queryset=IPRange.objects.all(),
329+
to_field_name="id",
330+
label=_("Source IP-Range (ID)"),
331+
)
257332
source_prefix = django_filters.ModelMultipleChoiceFilter(
258-
field_name="source_prefix",
333+
field_name="_source_prefix",
259334
queryset=Prefix.objects.all(),
260335
to_field_name="name",
261336
label=_("Source Prefix (name)"),
262337
)
263338
source_prefix_id = django_filters.ModelMultipleChoiceFilter(
264-
field_name="source_prefix",
339+
field_name="_source_prefix",
265340
queryset=Prefix.objects.all(),
266341
to_field_name="id",
267342
label=_("Source Prefix (ID)"),
268343
)
269344

270345
# Destination
346+
destination_aggregate = django_filters.ModelMultipleChoiceFilter(
347+
field_name="_destination_aggregate",
348+
queryset=Aggregate.objects.all(),
349+
to_field_name="name",
350+
label=_("Destination Aggregate (name)"),
351+
)
352+
destination_aggregate_id = django_filters.ModelMultipleChoiceFilter(
353+
field_name="_destination_aggregate",
354+
queryset=Aggregate.objects.all(),
355+
to_field_name="id",
356+
label=_("Destination Aggregate (ID)"),
357+
)
358+
destination_ipaddress = django_filters.ModelMultipleChoiceFilter(
359+
field_name="_destination_ipaddress",
360+
queryset=IPAddress.objects.all(),
361+
to_field_name="name",
362+
label=_("Destination IP-Address (name)"),
363+
)
364+
destination_ipaddress_id = django_filters.ModelMultipleChoiceFilter(
365+
field_name="_destination_ipaddress",
366+
queryset=IPAddress.objects.all(),
367+
to_field_name="id",
368+
label=_("Destination IP-Address (ID)"),
369+
)
370+
destination_iprange = django_filters.ModelMultipleChoiceFilter(
371+
field_name="_destination_iprange",
372+
queryset=IPRange.objects.all(),
373+
to_field_name="name",
374+
label=_("Destination IP-Range (name)"),
375+
)
376+
destination_iprange_id = django_filters.ModelMultipleChoiceFilter(
377+
field_name="_destination_iprange",
378+
queryset=IPRange.objects.all(),
379+
to_field_name="id",
380+
label=_("Destination IP-Range (ID)"),
381+
)
271382
destination_prefix = django_filters.ModelMultipleChoiceFilter(
272-
field_name="destination_prefix",
383+
field_name="_destination_prefix",
273384
queryset=Prefix.objects.all(),
274385
to_field_name="name",
275386
label=_("Destination Prefix (name)"),
276387
)
277388
destination_prefix_id = django_filters.ModelMultipleChoiceFilter(
278-
field_name="destination_prefix",
389+
field_name="_destination_prefix",
279390
queryset=Prefix.objects.all(),
280391
to_field_name="id",
281392
label=_("Destination Prefix (ID)"),
@@ -287,7 +398,17 @@ class Meta:
287398
"""
288399

289400
model = ACLExtendedRule
290-
fields = ("id", "access_list", "index", "action", "protocol")
401+
fields = (
402+
"id",
403+
"access_list",
404+
"index",
405+
"action",
406+
"source_type",
407+
"source_id",
408+
"destination_type",
409+
"destination_id",
410+
"protocol",
411+
)
291412

292413
def search(self, queryset, name, value):
293414
"""

0 commit comments

Comments
 (0)