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 )