77from dcim .models import Device , Interface , Region , Site , SiteGroup , VirtualChassis
88from django .db .models import Q
99from django .utils .translation import gettext_lazy as _
10- from ipam .models import Prefix
10+ from ipam .models import Aggregate , IPAddress , IPRange , Prefix
1111from netbox .filtersets import NetBoxModelFilterSet
1212from 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