Move TagFilter to extras

This commit is contained in:
jeremystretch 2021-04-29 16:12:31 -04:00
parent c4e88fd11a
commit d35ac1347c
10 changed files with 31 additions and 26 deletions

View File

@ -3,8 +3,9 @@ from django.db.models import Q
from dcim.filters import CableTerminationFilterSet from dcim.filters import CableTerminationFilterSet
from dcim.models import Region, Site, SiteGroup from dcim.models import Region, Site, SiteGroup
from extras.filters import TagFilter
from tenancy.filters import TenancyFilterSet from tenancy.filters import TenancyFilterSet
from utilities.filters import TagFilter, TreeNodeMultipleChoiceFilter from utilities.filters import TreeNodeMultipleChoiceFilter
from utilities.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet from utilities.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet
from .choices import * from .choices import *
from .models import * from .models import *

View File

@ -1,12 +1,13 @@
import django_filters import django_filters
from django.contrib.auth.models import User from django.contrib.auth.models import User
from extras.filters import TagFilter
from extras.filtersets import LocalConfigContextFilterSet from extras.filtersets import LocalConfigContextFilterSet
from tenancy.filters import TenancyFilterSet from tenancy.filters import TenancyFilterSet
from tenancy.models import Tenant from tenancy.models import Tenant
from utilities.choices import ColorChoices from utilities.choices import ColorChoices
from utilities.filters import ( from utilities.filters import (
MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, TagFilter, TreeNodeMultipleChoiceFilter, MultiValueCharFilter, MultiValueMACAddressFilter, MultiValueNumberFilter, TreeNodeMultipleChoiceFilter,
) )
from utilities.filtersets import ( from utilities.filtersets import (
BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet, BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, PrimaryModelFilterSet,

View File

@ -1,6 +1,7 @@
import django_filters import django_filters
from django.forms import DateField, IntegerField, NullBooleanField from django.forms import DateField, IntegerField, NullBooleanField
from .models import Tag
from .choices import * from .choices import *
__all__ = ( __all__ = (
@ -36,3 +37,18 @@ class CustomFieldFilter(django_filters.Filter):
if custom_field.type not in EXACT_FILTER_TYPES: if custom_field.type not in EXACT_FILTER_TYPES:
if custom_field.filter_logic == CustomFieldFilterLogicChoices.FILTER_LOOSE: if custom_field.filter_logic == CustomFieldFilterLogicChoices.FILTER_LOOSE:
self.lookup_expr = 'icontains' 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)

View File

@ -6,10 +6,10 @@ from django.db.models import Q
from netaddr.core import AddrFormatError from netaddr.core import AddrFormatError
from dcim.models import Device, Interface, Region, Site, SiteGroup from dcim.models import Device, Interface, Region, Site, SiteGroup
from extras.filters import TagFilter
from tenancy.filters import TenancyFilterSet from tenancy.filters import TenancyFilterSet
from utilities.filters import ( from utilities.filters import (
ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, NumericArrayFilter, TagFilter, ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter,
TreeNodeMultipleChoiceFilter,
) )
from utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet from utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet
from virtualization.models import VirtualMachine, VMInterface from virtualization.models import VirtualMachine, VMInterface

View File

@ -2,7 +2,7 @@ import django_filters
from django.db.models import Q from django.db.models import Q
from dcim.models import Device from dcim.models import Device
from utilities.filters import TagFilter from extras.filters import TagFilter
from utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet from utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet
from virtualization.models import VirtualMachine from virtualization.models import VirtualMachine
from .models import Secret, SecretRole from .models import Secret, SecretRole

View File

@ -1,7 +1,8 @@
import django_filters import django_filters
from django.db.models import Q 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 utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet
from .models import Tenant, TenantGroup from .models import Tenant, TenantGroup

View File

@ -4,7 +4,6 @@ from django.conf import settings
from django_filters.constants import EMPTY_VALUES from django_filters.constants import EMPTY_VALUES
from dcim.forms import MACAddressField from dcim.forms import MACAddressField
from extras.models import Tag
def multivalue_field_factory(field_class): def multivalue_field_factory(field_class):
@ -84,21 +83,6 @@ class NullableCharFieldFilter(django_filters.CharFilter):
return qs.distinct() if self.distinct else qs 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): class NumericArrayFilter(django_filters.NumberFilter):
""" """
Filter based on the presence of an integer within an ArrayField. Filter based on the presence of an integer within an ArrayField.

View File

@ -6,7 +6,7 @@ from django_filters.utils import get_model_field, resolve_field
from dcim.forms import MACAddressField from dcim.forms import MACAddressField
from extras.choices import CustomFieldFilterLogicChoices from extras.choices import CustomFieldFilterLogicChoices
from extras.filters import CustomFieldFilter from extras.filters import CustomFieldFilter, TagFilter
from extras.models import CustomField from extras.models import CustomField
from utilities.constants import ( from utilities.constants import (
FILTER_CHAR_BASED_LOOKUP_MAP, FILTER_NEGATION_LOOKUP_MAP, FILTER_TREENODE_NEGATION_LOOKUP_MAP, 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, ( elif isinstance(existing_filter, (
django_filters.ModelChoiceFilter, django_filters.ModelChoiceFilter,
django_filters.ModelMultipleChoiceFilter, django_filters.ModelMultipleChoiceFilter,
filters.TagFilter TagFilter
)) or existing_filter.extra.get('choices'): )) or existing_filter.extra.get('choices'):
# These filter types support only negation # These filter types support only negation
lookup_map = FILTER_NEGATION_LOOKUP_MAP lookup_map = FILTER_NEGATION_LOOKUP_MAP

View File

@ -11,10 +11,11 @@ from dcim.filters import DeviceFilterSet, SiteFilterSet
from dcim.models import ( from dcim.models import (
Device, DeviceRole, DeviceType, Interface, Manufacturer, Platform, Rack, Region, Site Device, DeviceRole, DeviceType, Interface, Manufacturer, Platform, Rack, Region, Site
) )
from extras.filters import TagFilter
from extras.models import TaggedItem from extras.models import TaggedItem
from utilities.filters import ( from utilities.filters import (
MACAddressFilter, MultiValueCharFilter, MultiValueDateFilter, MultiValueDateTimeFilter, MultiValueNumberFilter, MACAddressFilter, MultiValueCharFilter, MultiValueDateFilter, MultiValueDateTimeFilter, MultiValueNumberFilter,
MultiValueTimeFilter, TagFilter, TreeNodeMultipleChoiceFilter, MultiValueTimeFilter, TreeNodeMultipleChoiceFilter,
) )
from utilities.filtersets import BaseFilterSet from utilities.filtersets import BaseFilterSet

View File

@ -2,9 +2,10 @@ import django_filters
from django.db.models import Q from django.db.models import Q
from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup from dcim.models import DeviceRole, Platform, Region, Site, SiteGroup
from extras.filters import TagFilter
from extras.filtersets import LocalConfigContextFilterSet from extras.filtersets import LocalConfigContextFilterSet
from tenancy.filters import TenancyFilterSet 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 utilities.filtersets import OrganizationalModelFilterSet, PrimaryModelFilterSet
from .choices import * from .choices import *
from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface