diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 0a90116bd..998a7bb6d 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -3,7 +3,6 @@ from django.db.models import Q from dcim.filtersets import CableTerminationFilterSet from dcim.models import Region, Site, SiteGroup -from extras.filters import TagFilter from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import TreeNodeMultipleChoiceFilter @@ -61,7 +60,6 @@ class ProviderFilterSet(PrimaryModelFilterSet): to_field_name='slug', label='Site (slug)', ) - tag = TagFilter() class Meta: model = Provider @@ -94,7 +92,6 @@ class ProviderNetworkFilterSet(PrimaryModelFilterSet): to_field_name='slug', label='Provider (slug)', ) - tag = TagFilter() class Meta: model = ProviderNetwork @@ -112,7 +109,6 @@ class ProviderNetworkFilterSet(PrimaryModelFilterSet): class CircuitTypeFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = CircuitType @@ -190,7 +186,6 @@ class CircuitFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='slug', label='Site (slug)', ) - tag = TagFilter() class Meta: model = Circuit diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 4dfb080bc..a7402fa5f 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1,7 +1,6 @@ import django_filters from django.contrib.auth.models import User -from extras.filters import TagFilter from extras.filtersets import LocalConfigContextFilterSet from ipam.models import ASN, VRF from netbox.filtersets import ( @@ -79,7 +78,6 @@ class RegionFilterSet(OrganizationalModelFilterSet): to_field_name='slug', label='Parent region (slug)', ) - tag = TagFilter() class Meta: model = Region @@ -97,7 +95,6 @@ class SiteGroupFilterSet(OrganizationalModelFilterSet): to_field_name='slug', label='Parent site group (slug)', ) - tag = TagFilter() class Meta: model = SiteGroup @@ -148,7 +145,6 @@ class SiteFilterSet(PrimaryModelFilterSet, TenancyFilterSet): queryset=ASN.objects.all(), label='AS (ID)', ) - tag = TagFilter() class Meta: model = Site @@ -225,7 +221,6 @@ class LocationFilterSet(TenancyFilterSet, OrganizationalModelFilterSet): to_field_name='slug', label='Location (slug)', ) - tag = TagFilter() class Meta: model = Location @@ -241,7 +236,6 @@ class LocationFilterSet(TenancyFilterSet, OrganizationalModelFilterSet): class RackRoleFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = RackRole @@ -325,7 +319,6 @@ class RackFilterSet(PrimaryModelFilterSet, TenancyFilterSet): serial = django_filters.CharFilter( lookup_expr='iexact' ) - tag = TagFilter() class Meta: model = Rack @@ -389,7 +382,6 @@ class RackReservationFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='username', label='User (name)', ) - tag = TagFilter() class Meta: model = RackReservation @@ -407,7 +399,6 @@ class RackReservationFilterSet(PrimaryModelFilterSet, TenancyFilterSet): class ManufacturerFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = Manufacturer @@ -461,7 +452,6 @@ class DeviceTypeFilterSet(PrimaryModelFilterSet): method='_device_bays', label='Has device bays', ) - tag = TagFilter() class Meta: model = DeviceType @@ -546,7 +536,6 @@ class ModuleTypeFilterSet(PrimaryModelFilterSet): method='_pass_through_ports', label='Has pass-through ports', ) - tag = TagFilter() class Meta: model = ModuleType @@ -732,7 +721,6 @@ class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeCompo class DeviceRoleFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = DeviceRole @@ -751,7 +739,6 @@ class PlatformFilterSet(OrganizationalModelFilterSet): to_field_name='slug', label='Manufacturer (slug)', ) - tag = TagFilter() class Meta: model = Platform @@ -916,7 +903,6 @@ class DeviceFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConfigContex method='_device_bays', label='Has device bays', ) - tag = TagFilter() class Meta: model = Device @@ -990,7 +976,6 @@ class ModuleFilterSet(PrimaryModelFilterSet): queryset=Device.objects.all(), label='Device (ID)', ) - tag = TagFilter() class Meta: model = Module @@ -1080,7 +1065,6 @@ class DeviceComponentFilterSet(django_filters.FilterSet): to_field_name='name', label='Virtual Chassis', ) - tag = TagFilter() def search(self, queryset, name, value): if not value.strip(): @@ -1202,7 +1186,6 @@ class InterfaceFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet, CableT ) mac_address = MultiValueMACAddressFilter() wwn = MultiValueWWNFilter() - tag = TagFilter() vlan_id = django_filters.CharFilter( method='filter_vlan_id', label='Assigned VLAN' @@ -1377,7 +1360,6 @@ class InventoryItemFilterSet(PrimaryModelFilterSet, DeviceComponentFilterSet): class InventoryItemRoleFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = InventoryItemRole @@ -1447,7 +1429,6 @@ class VirtualChassisFilterSet(PrimaryModelFilterSet): to_field_name='slug', label='Tenant (slug)', ) - tag = TagFilter() class Meta: model = VirtualChassis @@ -1505,7 +1486,6 @@ class CableFilterSet(TenancyFilterSet, PrimaryModelFilterSet): method='filter_device', field_name='device__site__slug' ) - tag = TagFilter() class Meta: model = Cable @@ -1571,7 +1551,6 @@ class PowerPanelFilterSet(PrimaryModelFilterSet): lookup_expr='in', label='Location (ID)', ) - tag = TagFilter() class Meta: model = PowerPanel @@ -1641,7 +1620,6 @@ class PowerFeedFilterSet(PrimaryModelFilterSet, CableTerminationFilterSet, PathE choices=PowerFeedStatusChoices, null_value=None ) - tag = TagFilter() class Meta: model = PowerFeed diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 52e4499c7..aaba09bc6 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -6,7 +6,6 @@ from django.db.models import Q from netaddr.core import AddrFormatError from dcim.models import Device, Interface, Region, Site, SiteGroup -from extras.filters import TagFilter from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import ( @@ -63,7 +62,6 @@ class VRFFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='name', label='Export target (name)', ) - tag = TagFilter() def search(self, queryset, name, value): if not value.strip(): @@ -106,7 +104,6 @@ class RouteTargetFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='rd', label='Export VRF (RD)', ) - tag = TagFilter() def search(self, queryset, name, value): if not value.strip(): @@ -122,7 +119,6 @@ class RouteTargetFilterSet(PrimaryModelFilterSet, TenancyFilterSet): class RIRFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = RIR @@ -152,7 +148,6 @@ class AggregateFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='slug', label='RIR (slug)', ) - tag = TagFilter() class Meta: model = Aggregate @@ -218,7 +213,6 @@ class RoleFilterSet(OrganizationalModelFilterSet): method='search', label='Search', ) - tag = TagFilter() class Meta: model = Role @@ -347,7 +341,6 @@ class PrefixFilterSet(PrimaryModelFilterSet, TenancyFilterSet): choices=PrefixStatusChoices, null_value=None ) - tag = TagFilter() class Meta: model = Prefix @@ -453,7 +446,6 @@ class IPRangeFilterSet(TenancyFilterSet, PrimaryModelFilterSet): choices=IPRangeStatusChoices, null_value=None ) - tag = TagFilter() class Meta: model = IPRange @@ -578,7 +570,6 @@ class IPAddressFilterSet(PrimaryModelFilterSet, TenancyFilterSet): role = django_filters.MultipleChoiceFilter( choices=IPAddressRoleChoices ) - tag = TagFilter() class Meta: model = IPAddress @@ -664,7 +655,6 @@ class FHRPGroupFilterSet(PrimaryModelFilterSet): queryset=IPAddress.objects.all(), method='filter_related_ip' ) - tag = TagFilter() class Meta: model = FHRPGroup @@ -737,7 +727,6 @@ class VLANGroupFilterSet(OrganizationalModelFilterSet): cluster = django_filters.NumberFilter( method='filter_scope' ) - tag = TagFilter() class Meta: model = VLANGroup @@ -832,7 +821,6 @@ class VLANFilterSet(PrimaryModelFilterSet, TenancyFilterSet): queryset=VirtualMachine.objects.all(), method='get_for_virtualmachine' ) - tag = TagFilter() class Meta: model = VLAN @@ -864,7 +852,6 @@ class ServiceTemplateFilterSet(PrimaryModelFilterSet): field_name='ports', lookup_expr='contains' ) - tag = TagFilter() class Meta: model = ServiceTemplate @@ -906,7 +893,6 @@ class ServiceFilterSet(PrimaryModelFilterSet): field_name='ports', lookup_expr='contains' ) - tag = TagFilter() class Meta: model = Service diff --git a/netbox/netbox/filtersets.py b/netbox/netbox/filtersets.py index f42ab064b..3ddf252c7 100644 --- a/netbox/netbox/filtersets.py +++ b/netbox/netbox/filtersets.py @@ -120,6 +120,10 @@ class BaseFilterSet(django_filters.FilterSet): def get_additional_lookups(cls, existing_filter_name, existing_filter): new_filters = {} + # Skip on abstract models + if not cls._meta.model: + return {} + # Skip nonstandard lookup expressions if existing_filter.method is not None or existing_filter.lookup_expr not in ['exact', 'in']: return {} @@ -214,6 +218,7 @@ class ChangeLoggedModelFilterSet(BaseFilterSet): class PrimaryModelFilterSet(ChangeLoggedModelFilterSet): + tag = TagFilter() def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py index c8af89143..36f625507 100644 --- a/netbox/tenancy/filtersets.py +++ b/netbox/tenancy/filtersets.py @@ -1,7 +1,6 @@ import django_filters from django.db.models import Q -from extras.filters import TagFilter from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet from utilities.filters import ContentTypeFilter, TreeNodeMultipleChoiceFilter from .models import * @@ -33,7 +32,6 @@ class TenantGroupFilterSet(OrganizationalModelFilterSet): to_field_name='slug', label='Tenant group (slug)', ) - tag = TagFilter() class Meta: model = TenantGroup @@ -58,7 +56,6 @@ class TenantFilterSet(PrimaryModelFilterSet): to_field_name='slug', label='Tenant group (slug)', ) - tag = TagFilter() class Meta: model = Tenant @@ -119,7 +116,6 @@ class ContactGroupFilterSet(OrganizationalModelFilterSet): to_field_name='slug', label='Contact group (slug)', ) - tag = TagFilter() class Meta: model = ContactGroup @@ -127,7 +123,6 @@ class ContactGroupFilterSet(OrganizationalModelFilterSet): class ContactRoleFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = ContactRole @@ -152,7 +147,6 @@ class ContactFilterSet(PrimaryModelFilterSet): to_field_name='slug', label='Contact group (slug)', ) - tag = TagFilter() class Meta: model = Contact diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index ed2775de2..0fe433bbc 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -2,7 +2,6 @@ import django_filters from django.db.models import Q from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup -from extras.filters import TagFilter from extras.filtersets import LocalConfigContextFilterSet from netbox.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet from tenancy.filtersets import TenancyFilterSet @@ -20,7 +19,6 @@ __all__ = ( class ClusterTypeFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = ClusterType @@ -28,7 +26,6 @@ class ClusterTypeFilterSet(OrganizationalModelFilterSet): class ClusterGroupFilterSet(OrganizationalModelFilterSet): - tag = TagFilter() class Meta: model = ClusterGroup @@ -96,7 +93,6 @@ class ClusterFilterSet(PrimaryModelFilterSet, TenancyFilterSet): to_field_name='slug', label='Cluster type (slug)', ) - tag = TagFilter() class Meta: model = Cluster @@ -217,7 +213,6 @@ class VirtualMachineFilterSet(PrimaryModelFilterSet, TenancyFilterSet, LocalConf method='_has_primary_ip', label='Has a primary IP', ) - tag = TagFilter() class Meta: model = VirtualMachine @@ -278,7 +273,6 @@ class VMInterfaceFilterSet(PrimaryModelFilterSet): mac_address = MultiValueMACAddressFilter( label='MAC address', ) - tag = TagFilter() class Meta: model = VMInterface diff --git a/netbox/wireless/filtersets.py b/netbox/wireless/filtersets.py index 3fb173b1b..b95c18c9d 100644 --- a/netbox/wireless/filtersets.py +++ b/netbox/wireless/filtersets.py @@ -2,7 +2,6 @@ import django_filters from django.db.models import Q from dcim.choices import LinkStatusChoices -from extras.filters import TagFilter from ipam.models import VLAN from netbox.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet from utilities.filters import MultiValueNumberFilter, TreeNodeMultipleChoiceFilter @@ -25,7 +24,6 @@ class WirelessLANGroupFilterSet(OrganizationalModelFilterSet): queryset=WirelessLANGroup.objects.all(), to_field_name='slug' ) - tag = TagFilter() class Meta: model = WirelessLANGroup @@ -57,7 +55,6 @@ class WirelessLANFilterSet(PrimaryModelFilterSet): auth_cipher = django_filters.MultipleChoiceFilter( choices=WirelessAuthCipherChoices ) - tag = TagFilter() class Meta: model = WirelessLAN @@ -89,7 +86,6 @@ class WirelessLinkFilterSet(PrimaryModelFilterSet): auth_cipher = django_filters.MultipleChoiceFilter( choices=WirelessAuthCipherChoices ) - tag = TagFilter() class Meta: model = WirelessLink