Skip to content

Commit e0a2b2b

Browse files
committed
feat(filtersets): Extend ACL filtersets with ACL fields
Adds enhanced filtering options for ACL models, enabling filtering by access list, source prefix, and destination prefix using names and IDs. Improves query flexibility and aligns with extended ACL use cases. Fixes #243
1 parent e716efc commit e0a2b2b

File tree

1 file changed

+93
-12
lines changed

1 file changed

+93
-12
lines changed

netbox_acls/filtersets.py

Lines changed: 93 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
"""
22
Filters enable users to request only a specific subset of objects matching a query;
3-
when filtering the sites list by status or region, for instance.
3+
when filtering the site list by status or region, for instance.
44
"""
5+
56
import django_filters
67
from dcim.models import Device, Interface, Region, Site, SiteGroup, VirtualChassis
78
from django.db.models import Q
9+
from django.utils.translation import gettext_lazy as _
10+
from ipam.models import Prefix
811
from netbox.filtersets import NetBoxModelFilterSet
912
from virtualization.models import VirtualMachine, VMInterface
1013

14+
from .choices import ACLTypeChoices
1115
from .models import AccessList, ACLExtendedRule, ACLInterfaceAssignment, ACLStandardRule
1216

1317
__all__ = (
@@ -22,6 +26,7 @@ class AccessListFilterSet(NetBoxModelFilterSet):
2226
"""
2327
Define the filter set for the django model AccessList.
2428
"""
29+
2530
region = django_filters.ModelMultipleChoiceFilter(
2631
field_name="device__site__region",
2732
queryset=Region.objects.all(),
@@ -102,13 +107,13 @@ def search(self, queryset, name, value):
102107
Override the default search behavior for the django model.
103108
"""
104109
query = (
105-
Q(name__icontains=value)
106-
| Q(device__name__icontains=value)
107-
| Q(virtual_chassis__name__icontains=value)
108-
| Q(virtual_machine__name__icontains=value)
109-
| Q(type__icontains=value)
110-
| Q(default_action__icontains=value)
111-
| Q(comments__icontains=value)
110+
Q(name__icontains=value)
111+
| Q(device__name__icontains=value)
112+
| Q(virtual_chassis__name__icontains=value)
113+
| Q(virtual_machine__name__icontains=value)
114+
| Q(type__icontains=value)
115+
| Q(default_action__icontains=value)
116+
| Q(comments__icontains=value)
112117
)
113118
return queryset.filter(query)
114119

@@ -118,6 +123,16 @@ class ACLInterfaceAssignmentFilterSet(NetBoxModelFilterSet):
118123
Define the filter set for the django model ACLInterfaceAssignment.
119124
"""
120125

126+
access_list = django_filters.ModelMultipleChoiceFilter(
127+
queryset=AccessList.objects.all(),
128+
to_field_name="name",
129+
label=_("Access List (name)"),
130+
)
131+
access_list_id = django_filters.ModelMultipleChoiceFilter(
132+
queryset=AccessList.objects.all(),
133+
to_field_name="id",
134+
label=_("Access List (ID)"),
135+
)
121136
interface = django_filters.ModelMultipleChoiceFilter(
122137
field_name="interface__name",
123138
queryset=Interface.objects.all(),
@@ -175,6 +190,32 @@ class ACLStandardRuleFilterSet(NetBoxModelFilterSet):
175190
Define the filter set for the django model ACLStandardRule.
176191
"""
177192

193+
# Access List
194+
access_list = django_filters.ModelMultipleChoiceFilter(
195+
queryset=AccessList.objects.all(),
196+
to_field_name="name",
197+
label=_("Access List (name)"),
198+
)
199+
access_list_id = django_filters.ModelMultipleChoiceFilter(
200+
queryset=AccessList.objects.all(),
201+
to_field_name="id",
202+
label=_("Access List (ID)"),
203+
)
204+
205+
# Source
206+
source_prefix = django_filters.ModelMultipleChoiceFilter(
207+
field_name="source_prefix",
208+
queryset=Prefix.objects.all(),
209+
to_field_name="name",
210+
label=_("Source Prefix (name)"),
211+
)
212+
source_prefix_id = django_filters.ModelMultipleChoiceFilter(
213+
field_name="source_prefix",
214+
queryset=Prefix.objects.all(),
215+
to_field_name="id",
216+
label=_("Source Prefix (ID)"),
217+
)
218+
178219
class Meta:
179220
"""
180221
Associates the django model ACLStandardRule & fields to the filter set.
@@ -200,6 +241,46 @@ class ACLExtendedRuleFilterSet(NetBoxModelFilterSet):
200241
Define the filter set for the django model ACLExtendedRule.
201242
"""
202243

244+
# Access List
245+
access_list = django_filters.ModelMultipleChoiceFilter(
246+
queryset=AccessList.objects.filter(type=ACLTypeChoices.TYPE_EXTENDED),
247+
to_field_name="name",
248+
label=_("Access List (name)"),
249+
)
250+
access_list_id = django_filters.ModelMultipleChoiceFilter(
251+
queryset=AccessList.objects.filter(type=ACLTypeChoices.TYPE_EXTENDED),
252+
to_field_name="id",
253+
label=_("Access List (ID)"),
254+
)
255+
256+
# Source
257+
source_prefix = django_filters.ModelMultipleChoiceFilter(
258+
field_name="source_prefix",
259+
queryset=Prefix.objects.all(),
260+
to_field_name="name",
261+
label=_("Source Prefix (name)"),
262+
)
263+
source_prefix_id = django_filters.ModelMultipleChoiceFilter(
264+
field_name="source_prefix",
265+
queryset=Prefix.objects.all(),
266+
to_field_name="id",
267+
label=_("Source Prefix (ID)"),
268+
)
269+
270+
# Destination
271+
destination_prefix = django_filters.ModelMultipleChoiceFilter(
272+
field_name="destination_prefix",
273+
queryset=Prefix.objects.all(),
274+
to_field_name="name",
275+
label=_("Destination Prefix (name)"),
276+
)
277+
destination_prefix_id = django_filters.ModelMultipleChoiceFilter(
278+
field_name="destination_prefix",
279+
queryset=Prefix.objects.all(),
280+
to_field_name="id",
281+
label=_("Destination Prefix (ID)"),
282+
)
283+
203284
class Meta:
204285
"""
205286
Associates the django model ACLExtendedRule & fields to the filter set.
@@ -213,9 +294,9 @@ def search(self, queryset, name, value):
213294
Override the default search behavior for the django model.
214295
"""
215296
query = (
216-
Q(access_list__name__icontains=value)
217-
| Q(index__icontains=value)
218-
| Q(action__icontains=value)
219-
| Q(protocol__icontains=value)
297+
Q(access_list__name__icontains=value)
298+
| Q(index__icontains=value)
299+
| Q(action__icontains=value)
300+
| Q(protocol__icontains=value)
220301
)
221302
return queryset.filter(query)

0 commit comments

Comments
 (0)