Skip to content

Commit a9e0d5f

Browse files
authored
Merge pull request #244 from pheus/feature/243-allow-rule-filtering-by-acl-id-and-name
#243 [Feature]: Allow rule filtering by ACL ID and name
2 parents f97daad + 0c04fbb commit a9e0d5f

File tree

6 files changed

+281
-151
lines changed

6 files changed

+281
-151
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)