From 0afaacf2d77e8f02f35fea0ab2ad895080429f5e Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Tue, 4 Mar 2025 18:56:01 +0000 Subject: [PATCH 01/11] Add Contact filter to Services --- netbox/ipam/filtersets.py | 5 +++-- netbox/ipam/forms/filtersets.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 81cbd2ef8ed..b1b037c8a96 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -12,7 +12,8 @@ from circuits.models import Provider from dcim.models import Device, Interface, Region, Site, SiteGroup from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet -from tenancy.filtersets import TenancyFilterSet +from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet + from utilities.filters import ( ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter, ) @@ -1136,7 +1137,7 @@ def search(self, queryset, name, value): return queryset.filter(qs_filter) -class ServiceFilterSet(NetBoxModelFilterSet): +class ServiceFilterSet(ContactModelFilterSet, NetBoxModelFilterSet): device_id = django_filters.ModelMultipleChoiceFilter( queryset=Device.objects.all(), label=_('Device (ID)'), diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 3f951512b3a..8f109ed3c66 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -6,7 +6,7 @@ from ipam.constants import * from ipam.models import * from netbox.forms import NetBoxModelFilterSetForm -from tenancy.forms import TenancyFilterForm +from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, add_blank_choice from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.rendering import FieldSet @@ -590,12 +590,13 @@ class ServiceTemplateFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -class ServiceFilterForm(ServiceTemplateFilterForm): +class ServiceFilterForm(ContactModelFilterForm, ServiceTemplateFilterForm): model = Service fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('protocol', 'port', name=_('Attributes')), FieldSet('device_id', 'virtual_machine_id', name=_('Assignment')), + FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) device_id = DynamicModelMultipleChoiceField( queryset=Device.objects.all(), From 22c3d5f0adcf732bdcab2a1c5037b64c89164858 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Tue, 4 Mar 2025 19:04:13 +0000 Subject: [PATCH 02/11] Add ContactModelFilterForm to ProviderAccountFilterForm --- netbox/circuits/forms/filtersets.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 297af5e7168..2bd932a9cf9 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -66,11 +66,12 @@ class ProviderFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm): tag = TagFilterField(model) -class ProviderAccountFilterForm(NetBoxModelFilterSetForm): +class ProviderAccountFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm): model = ProviderAccount fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('provider_id', 'account', name=_('Attributes')), + FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) provider_id = DynamicModelMultipleChoiceField( queryset=Provider.objects.all(), From 433013c79e2bef6618dee5091012e81ef88906b0 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Tue, 4 Mar 2025 19:10:51 +0000 Subject: [PATCH 03/11] Add Contact filter support for Aggregate --- netbox/ipam/filtersets.py | 2 +- netbox/ipam/forms/filtersets.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index b1b037c8a96..229734f399f 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -149,7 +149,7 @@ class Meta: fields = ('id', 'name', 'slug', 'is_private', 'description') -class AggregateFilterSet(NetBoxModelFilterSet, TenancyFilterSet): +class AggregateFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet): family = django_filters.NumberFilter( field_name='prefix', lookup_expr='family' diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 8f109ed3c66..6ee75b6946f 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -94,12 +94,13 @@ class RIRFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -class AggregateFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): +class AggregateFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = Aggregate fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('family', 'rir_id', name=_('Attributes')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), + FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) family = forms.ChoiceField( required=False, From 0f7a663f13d9c6ef9dd0e053e716e34d7c60038a Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Tue, 4 Mar 2025 19:14:05 +0000 Subject: [PATCH 04/11] Add Contact filter support for Prefix --- netbox/ipam/filtersets.py | 2 +- netbox/ipam/forms/filtersets.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 229734f399f..c6a098e2633 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -277,7 +277,7 @@ class Meta: fields = ('id', 'name', 'slug', 'description', 'weight') -class PrefixFilterSet(NetBoxModelFilterSet, ScopedFilterSet, TenancyFilterSet): +class PrefixFilterSet(NetBoxModelFilterSet, ScopedFilterSet, TenancyFilterSet, ContactModelFilterSet): family = django_filters.NumberFilter( field_name='prefix', lookup_expr='family' diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 6ee75b6946f..cc5b73fec73 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -163,7 +163,7 @@ class RoleFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -class PrefixFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): +class PrefixFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm, ): model = Prefix fieldsets = ( FieldSet('q', 'filter_id', 'tag'), @@ -175,6 +175,7 @@ class PrefixFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): FieldSet('vrf_id', 'present_in_vrf_id', name=_('VRF')), FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Scope')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), + FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) mask_length__lte = forms.IntegerField( widget=forms.HiddenInput() From 99423af0f7ccb0cb904e5760236de134a198c079 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Wed, 5 Mar 2025 12:53:45 +0000 Subject: [PATCH 05/11] Add Contact filter to IPRange --- netbox/ipam/filtersets.py | 2 +- netbox/ipam/forms/filtersets.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index c6a098e2633..01ba035eb76 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -431,7 +431,7 @@ def filter_present_in_vrf(self, queryset, name, vrf): ).distinct() -class IPRangeFilterSet(TenancyFilterSet, NetBoxModelFilterSet): +class IPRangeFilterSet(TenancyFilterSet, NetBoxModelFilterSet, ContactModelFilterSet): family = django_filters.NumberFilter( field_name='start_address', lookup_expr='family' diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index cc5b73fec73..57266e9ac16 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -264,12 +264,13 @@ class PrefixFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFil tag = TagFilterField(model) -class IPRangeFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): +class IPRangeFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm, ContactModelFilterForm): model = IPRange fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('family', 'vrf_id', 'status', 'role_id', 'mark_utilized', name=_('Attributes')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), + FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) family = forms.ChoiceField( required=False, From aaa94969faa8652e913e2f55cae4753ec62ed527 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Wed, 5 Mar 2025 12:56:27 +0000 Subject: [PATCH 06/11] Add Contact filter to IPAddress --- netbox/ipam/filtersets.py | 2 +- netbox/ipam/forms/filtersets.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 01ba035eb76..1b56e03acf9 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -523,7 +523,7 @@ def search_by_parent(self, queryset, name, value): return queryset.filter(q) -class IPAddressFilterSet(NetBoxModelFilterSet, TenancyFilterSet): +class IPAddressFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet): family = django_filters.NumberFilter( field_name='address', lookup_expr='family' diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index 57266e9ac16..b6059e9baec 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -304,7 +304,7 @@ class IPRangeFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm, ContactMode tag = TagFilterField(model) -class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): +class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm, ContactModelFilterForm): model = IPAddress fieldsets = ( FieldSet('q', 'filter_id', 'tag'), @@ -315,6 +315,7 @@ class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): FieldSet('vrf_id', 'present_in_vrf_id', name=_('VRF')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), FieldSet('device_id', 'virtual_machine_id', name=_('Device/VM')), + FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) selector_fields = ('filter_id', 'q', 'region_id', 'group_id', 'parent', 'status', 'role') parent = forms.CharField( From b51f613010591d685bf336993b839a93acc14d2f Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Wed, 5 Mar 2025 13:01:10 +0000 Subject: [PATCH 07/11] Add Contact filter to L2VPN --- netbox/vpn/filtersets.py | 4 ++-- netbox/vpn/forms/filtersets.py | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py index 6403b662fcb..1408cf04445 100644 --- a/netbox/vpn/filtersets.py +++ b/netbox/vpn/filtersets.py @@ -5,7 +5,7 @@ from dcim.models import Device, Interface from ipam.models import IPAddress, RouteTarget, VLAN from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet -from tenancy.filtersets import TenancyFilterSet +from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter from virtualization.models import VirtualMachine, VMInterface from .choices import * @@ -293,7 +293,7 @@ def search(self, queryset, name, value): ) -class L2VPNFilterSet(NetBoxModelFilterSet, TenancyFilterSet): +class L2VPNFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet): type = django_filters.MultipleChoiceFilter( choices=L2VPNTypeChoices, null_value=None diff --git a/netbox/vpn/forms/filtersets.py b/netbox/vpn/forms/filtersets.py index 10dc441e211..dc310915609 100644 --- a/netbox/vpn/forms/filtersets.py +++ b/netbox/vpn/forms/filtersets.py @@ -5,7 +5,7 @@ from dcim.models import Device, Region, Site from ipam.models import RouteTarget, VLAN from netbox.forms import NetBoxModelFilterSetForm -from tenancy.forms import TenancyFilterForm +from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms.fields import ( ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField, ) @@ -206,12 +206,13 @@ class IPSecProfileFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -class L2VPNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): +class L2VPNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm, ContactModelFilterForm): model = L2VPN fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('type', 'import_target_id', 'export_target_id', name=_('Attributes')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), + FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) type = forms.ChoiceField( label=_('Type'), From cf2a60c6f7684da7bd5ae201e5690a618ccf3174 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Wed, 5 Mar 2025 13:06:21 +0000 Subject: [PATCH 08/11] Add Contact filter to TunnelGroup --- netbox/vpn/filtersets.py | 2 +- netbox/vpn/forms/filtersets.py | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py index 1408cf04445..5b8a09bc6ec 100644 --- a/netbox/vpn/filtersets.py +++ b/netbox/vpn/filtersets.py @@ -25,7 +25,7 @@ ) -class TunnelGroupFilterSet(OrganizationalModelFilterSet): +class TunnelGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet): class Meta: model = TunnelGroup diff --git a/netbox/vpn/forms/filtersets.py b/netbox/vpn/forms/filtersets.py index dc310915609..cff83362f23 100644 --- a/netbox/vpn/forms/filtersets.py +++ b/netbox/vpn/forms/filtersets.py @@ -30,8 +30,12 @@ ) -class TunnelGroupFilterForm(NetBoxModelFilterSetForm): +class TunnelGroupFilterForm(NetBoxModelFilterSetForm, ContactModelFilterForm): model = TunnelGroup + fieldsets = ( + FieldSet('q', 'filter_id', 'tag'), + FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), + ) tag = TagFilterField(model) From d1af106c8ce138560d37281863609353c4809b6e Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Wed, 5 Mar 2025 13:08:14 +0000 Subject: [PATCH 09/11] Add Contact filter to Tunnel --- netbox/vpn/filtersets.py | 2 +- netbox/vpn/forms/filtersets.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py index 5b8a09bc6ec..f29c5dd60eb 100644 --- a/netbox/vpn/filtersets.py +++ b/netbox/vpn/filtersets.py @@ -32,7 +32,7 @@ class Meta: fields = ('id', 'name', 'slug', 'description') -class TunnelFilterSet(NetBoxModelFilterSet, TenancyFilterSet): +class TunnelFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet): status = django_filters.MultipleChoiceFilter( choices=TunnelStatusChoices ) diff --git a/netbox/vpn/forms/filtersets.py b/netbox/vpn/forms/filtersets.py index cff83362f23..4b103fe5c51 100644 --- a/netbox/vpn/forms/filtersets.py +++ b/netbox/vpn/forms/filtersets.py @@ -39,13 +39,14 @@ class TunnelGroupFilterForm(NetBoxModelFilterSetForm, ContactModelFilterForm): tag = TagFilterField(model) -class TunnelFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): +class TunnelFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm, ContactModelFilterForm): model = Tunnel fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('status', 'encapsulation', 'tunnel_id', name=_('Tunnel')), FieldSet('ipsec_profile_id', name=_('Security')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenancy')), + FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) status = forms.MultipleChoiceField( label=_('Status'), From 85e2277f055bf31cbd29c53e0be8ba48fabc9f72 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Zaroubin Date: Wed, 5 Mar 2025 22:12:27 +0000 Subject: [PATCH 10/11] Add ContactModelFilterSet to ProviderAccountFilterSet --- netbox/circuits/filtersets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 188b5343ef4..7775255fca3 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -95,7 +95,7 @@ def search(self, queryset, name, value): ) -class ProviderAccountFilterSet(NetBoxModelFilterSet): +class ProviderAccountFilterSet(NetBoxModelFilterSet, ContactModelFilterSet): provider_id = django_filters.ModelMultipleChoiceFilter( queryset=Provider.objects.all(), label=_('Provider (ID)'), From ccbe8e6931ff2e7cdd209447078cfd2a17889851 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Date: Thu, 6 Mar 2025 12:23:00 -0300 Subject: [PATCH 11/11] Fixes classes inheritance order Setup NetBoxModelFilterSetForm as the last inherited class Co-authored-by: Jason Novinger --- netbox/ipam/filtersets.py | 2 +- netbox/ipam/forms/filtersets.py | 4 ++-- netbox/vpn/filtersets.py | 2 +- netbox/vpn/forms/filtersets.py | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 1b56e03acf9..b23322a22b2 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -12,7 +12,7 @@ from circuits.models import Provider from dcim.models import Device, Interface, Region, Site, SiteGroup from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet -from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet +from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet from utilities.filters import ( ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter, diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index b6059e9baec..a4faa18ed37 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -264,7 +264,7 @@ class PrefixFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFil tag = TagFilterField(model) -class IPRangeFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm, ContactModelFilterForm): +class IPRangeFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = IPRange fieldsets = ( FieldSet('q', 'filter_id', 'tag'), @@ -304,7 +304,7 @@ class IPRangeFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm, ContactMode tag = TagFilterField(model) -class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm, ContactModelFilterForm): +class IPAddressFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = IPAddress fieldsets = ( FieldSet('q', 'filter_id', 'tag'), diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py index f29c5dd60eb..5b8d1899ba5 100644 --- a/netbox/vpn/filtersets.py +++ b/netbox/vpn/filtersets.py @@ -5,7 +5,7 @@ from dcim.models import Device, Interface from ipam.models import IPAddress, RouteTarget, VLAN from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet -from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet +from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter from virtualization.models import VirtualMachine, VMInterface from .choices import * diff --git a/netbox/vpn/forms/filtersets.py b/netbox/vpn/forms/filtersets.py index 4b103fe5c51..6199561569d 100644 --- a/netbox/vpn/forms/filtersets.py +++ b/netbox/vpn/forms/filtersets.py @@ -30,7 +30,7 @@ ) -class TunnelGroupFilterForm(NetBoxModelFilterSetForm, ContactModelFilterForm): +class TunnelGroupFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm): model = TunnelGroup fieldsets = ( FieldSet('q', 'filter_id', 'tag'), @@ -39,7 +39,7 @@ class TunnelGroupFilterForm(NetBoxModelFilterSetForm, ContactModelFilterForm): tag = TagFilterField(model) -class TunnelFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm, ContactModelFilterForm): +class TunnelFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = Tunnel fieldsets = ( FieldSet('q', 'filter_id', 'tag'), @@ -211,7 +211,7 @@ class IPSecProfileFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) -class L2VPNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm, ContactModelFilterForm): +class L2VPNFilterForm(ContactModelFilterForm, TenancyFilterForm, NetBoxModelFilterSetForm): model = L2VPN fieldsets = ( FieldSet('q', 'filter_id', 'tag'),