Coverage for /home/runner/work/netbox-InterfaceNameRules-plugin/netbox-InterfaceNameRules-plugin/netbox-InterfaceNameRules-plugin/netbox_interface_name_rules/filters.py: 100%

22 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-22 21:16 +0000

1# SPDX-License-Identifier: Apache-2.0 

2# Copyright (C) 2025 Marcin Zieba <marcinpsk@gmail.com> 

3import django_filters 

4from dcim.models import DeviceType, ModuleType, Platform 

5from django.db.models import Q 

6from netbox.filtersets import NetBoxModelFilterSet 

7 

8from .choices import BreakoutModeChoices 

9from .models import InterfaceNameRule 

10 

11 

12class InterfaceNameRuleFilterSet(NetBoxModelFilterSet): 

13 """FilterSet for InterfaceNameRule list/API filtering.""" 

14 

15 q = django_filters.CharFilter(method="search", label="Search") 

16 

17 module_type_id = django_filters.ModelChoiceFilter( 

18 queryset=ModuleType.objects.all(), 

19 field_name="module_type", 

20 label="Module Type", 

21 ) 

22 module_type_is_regex = django_filters.BooleanFilter(label="Regex Mode") 

23 enabled = django_filters.BooleanFilter(label="Enabled") 

24 applies_to_device_interfaces = django_filters.BooleanFilter(label="Device Interface Rules") 

25 module_type_pattern = django_filters.CharFilter(lookup_expr="icontains", label="Pattern") 

26 breakout_mode = django_filters.MultipleChoiceFilter(choices=BreakoutModeChoices, label="Breakout Mode") 

27 parent_module_type_id = django_filters.ModelChoiceFilter( 

28 queryset=ModuleType.objects.all(), 

29 field_name="parent_module_type", 

30 label="Parent Module Type", 

31 ) 

32 device_type_id = django_filters.ModelChoiceFilter( 

33 queryset=DeviceType.objects.all(), 

34 field_name="device_type", 

35 label="Device Type", 

36 ) 

37 platform_id = django_filters.ModelChoiceFilter( 

38 queryset=Platform.objects.all(), 

39 field_name="platform", 

40 label="Platform", 

41 ) 

42 

43 class Meta: 

44 model = InterfaceNameRule 

45 fields = [ 

46 "module_type_id", 

47 "module_type_is_regex", 

48 "applies_to_device_interfaces", 

49 "module_type_pattern", 

50 "breakout_mode", 

51 "parent_module_type_id", 

52 "device_type_id", 

53 "platform_id", 

54 "enabled", 

55 ] 

56 

57 def search(self, queryset, name, value): 

58 """Filter by pattern, either name template, description, or module type model name.""" 

59 return queryset.select_related("module_type").filter( 

60 Q(module_type_pattern__icontains=value) 

61 | Q(name_template__icontains=value) 

62 | Q(parent_name_template__icontains=value) 

63 | Q(description__icontains=value) 

64 | Q(module_type__model__icontains=value) 

65 )