From d35ac1347cebd46740188f1b294ac50499f3c1ea Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 29 Apr 2021 16:12:31 -0400 Subject: [PATCH] Move TagFilter to extras --- netbox/circuits/filters.py | 3 ++- netbox/dcim/filters.py | 3 ++- netbox/extras/filters.py | 16 ++++++++++++++++ netbox/ipam/filters.py | 4 ++-- netbox/secrets/filters.py | 2 +- netbox/tenancy/filters.py | 3 ++- netbox/utilities/filters.py | 16 ---------------- netbox/utilities/filtersets.py | 4 ++-- netbox/utilities/tests/test_filters.py | 3 ++- netbox/virtualization/filters.py | 3 ++- 10 files changed, 31 insertions(+), 26 deletions(-) diff --git a/netbox/circuits/filters.py b/netbox/circuits/filters.py index 6ff6bb104..bb778dec7 100644 --- a/netbox/circuits/filters.py +++ b/netbox/circuits/filters.py @@ -3,8 +3,9 @@ from django.db.models import Q from dcim.filters import CableTerminationFilterSet from dcim.models import Region, Site, SiteGroup +from extras.filters import TagFilter from tenancy.filters import TenancyFilterSet -from utilities.filters import TagFilter, TreeNodeMultipleChoiceFilter +from utilities.filters import TreeNodeMultipleChoiceFilter from utilities.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet from .choices import * from .models import * diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index a45900466..3c81da460 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -1,12 +1,13 @@ import django_filters from django.contrib.auth.models import User +from extras.filters import TagFilter from extras.filtersets import LocalConfigContextFilterSet from tenancy.filters import TenancyFilterSet from tenancy.models import Tenant from utilities.choices import ColorChoices from utilities.filters import ( - MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, TagFilter, TreeNodeMultipleChoiceFilter, + MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, TreeNodeMultipleChoiceFilter, ) from utilities.filtersets import ( BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet, diff --git a/netbox/extras/filters.py b/netbox/extras/filters.py index dff12aa91..3757d73f3 100644 --- a/netbox/extras/filters.py +++ b/netbox/extras/filters.py @@ -1,6 +1,7 @@ import django_filters from django.forms import DateField, IntegerField, NullBooleanField +from .models import Tag from .choices import * __all__ = ( @@ -36,3 +37,18 @@ class CustomFieldFilter(django_filters.Filter): if custom_field.type not in EXACT_FILTER_TYPES: if custom_field.filter_logic == CustomFieldFilterLogicChoices.FILTER_LOOSE: self.lookup_expr = 'icontains' + + +class TagFilter(django_filters.ModelMultipleChoiceFilter): + """ + Match on one or more assigned tags. If multiple tags are specified (e.g. ?tag=foo&tag=bar), the queryset is filtered + to objects matching all tags. + """ + def __init__(self, *args, **kwargs): + + kwargs.setdefault('field_name', 'tags__slug') + kwargs.setdefault('to_field_name', 'slug') + kwargs.setdefault('conjoined', True) + kwargs.setdefault('queryset', Tag.objects.all()) + + super().__init__(*args, **kwargs) diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index 4ecea50af..db1b76f31 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -6,10 +6,10 @@ 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 tenancy.filters import TenancyFilterSet from utilities.filters import ( - ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, NumericArrayFilter, TagFilter, - TreeNodeMultipleChoiceFilter, + ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter, ) from utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet from virtualization.models import VirtualMachine, VMInterface diff --git a/netbox/secrets/filters.py b/netbox/secrets/filters.py index 6571c60f9..1149fbd9b 100644 --- a/netbox/secrets/filters.py +++ b/netbox/secrets/filters.py @@ -2,7 +2,7 @@ import django_filters from django.db.models import Q from dcim.models import Device -from utilities.filters import TagFilter +from extras.filters import TagFilter from utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet from virtualization.models import VirtualMachine from .models import Secret, SecretRole diff --git a/netbox/tenancy/filters.py b/netbox/tenancy/filters.py index 9cbaed170..6a428f4b6 100644 --- a/netbox/tenancy/filters.py +++ b/netbox/tenancy/filters.py @@ -1,7 +1,8 @@ import django_filters from django.db.models import Q -from utilities.filters import TagFilter, TreeNodeMultipleChoiceFilter +from extras.filters import TagFilter +from utilities.filters import TreeNodeMultipleChoiceFilter from utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet from .models import Tenant, TenantGroup diff --git a/netbox/utilities/filters.py b/netbox/utilities/filters.py index 97608ed22..ed71afc1b 100644 --- a/netbox/utilities/filters.py +++ b/netbox/utilities/filters.py @@ -4,7 +4,6 @@ from django.conf import settings from django_filters.constants import EMPTY_VALUES from dcim.forms import MACAddressField -from extras.models import Tag def multivalue_field_factory(field_class): @@ -84,21 +83,6 @@ class NullableCharFieldFilter(django_filters.CharFilter): return qs.distinct() if self.distinct else qs -class TagFilter(django_filters.ModelMultipleChoiceFilter): - """ - Match on one or more assigned tags. If multiple tags are specified (e.g. ?tag=foo&tag=bar), the queryset is filtered - to objects matching all tags. - """ - def __init__(self, *args, **kwargs): - - kwargs.setdefault('field_name', 'tags__slug') - kwargs.setdefault('to_field_name', 'slug') - kwargs.setdefault('conjoined', True) - kwargs.setdefault('queryset', Tag.objects.all()) - - super().__init__(*args, **kwargs) - - class NumericArrayFilter(django_filters.NumberFilter): """ Filter based on the presence of an integer within an ArrayField. diff --git a/netbox/utilities/filtersets.py b/netbox/utilities/filtersets.py index c3a2e8443..f738441dd 100644 --- a/netbox/utilities/filtersets.py +++ b/netbox/utilities/filtersets.py @@ -6,7 +6,7 @@ from django_filters.utils import get_model_field, resolve_field from dcim.forms import MACAddressField from extras.choices import CustomFieldFilterLogicChoices -from extras.filters import CustomFieldFilter +from extras.filters import CustomFieldFilter, TagFilter from extras.models import CustomField from utilities.constants import ( FILTER_CHAR_BASED_LOOKUP_MAP, FILTER_NEGATION_LOOKUP_MAP, FILTER_TREENODE_NEGATION_LOOKUP_MAP, @@ -100,7 +100,7 @@ class BaseFilterSet(django_filters.FilterSet): elif isinstance(existing_filter, ( django_filters.ModelChoiceFilter, django_filters.ModelMultipleChoiceFilter, - filters.TagFilter + TagFilter )) or existing_filter.extra.get('choices'): # These filter types support only negation lookup_map = FILTER_NEGATION_LOOKUP_MAP diff --git a/netbox/utilities/tests/test_filters.py b/netbox/utilities/tests/test_filters.py index 6d2826b70..21f020fb4 100644 --- a/netbox/utilities/tests/test_filters.py +++ b/netbox/utilities/tests/test_filters.py @@ -11,10 +11,11 @@ from dcim.filters import DeviceFilterSet, SiteFilterSet from dcim.models import ( Device, DeviceRole, DeviceType, Interface, Manufacturer, Platform, Rack, Region, Site ) +from extras.filters import TagFilter from extras.models import TaggedItem from utilities.filters import ( MACAddressFilter, MultiValueCharFilter, MultiValueDateFilter, MultiValueDateTimeFilter, MultiValueNumberFilter, - MultiValueTimeFilter, TagFilter, TreeNodeMultipleChoiceFilter, + MultiValueTimeFilter, TreeNodeMultipleChoiceFilter, ) from utilities.filtersets import BaseFilterSet diff --git a/netbox/virtualization/filters.py b/netbox/virtualization/filters.py index 187061f5e..6c2e0a48a 100644 --- a/netbox/virtualization/filters.py +++ b/netbox/virtualization/filters.py @@ -2,9 +2,10 @@ 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 tenancy.filters import TenancyFilterSet -from utilities.filters import MultiValueMACAddressFilter, TagFilter, TreeNodeMultipleChoiceFilter +from utilities.filters import MultiValueMACAddressFilter, TreeNodeMultipleChoiceFilter from utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet from .choices import * from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface