Restore id__in filters to retain backward compatability until v2.7

This commit is contained in:
Jeremy Stretch 2019-05-08 21:08:35 -04:00
parent ffa34c6133
commit dfffd1ea94
7 changed files with 107 additions and 24 deletions

View File

@ -4,12 +4,16 @@ from django.db.models import Q
from dcim.models import Site from dcim.models import Site
from extras.filters import CustomFieldFilterSet from extras.filters import CustomFieldFilterSet
from tenancy.models import Tenant from tenancy.models import Tenant
from utilities.filters import NameSlugSearchFilterSet, TagFilter from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter
from .constants import CIRCUIT_STATUS_CHOICES from .constants import CIRCUIT_STATUS_CHOICES
from .models import Provider, Circuit, CircuitTermination, CircuitType from .models import Provider, Circuit, CircuitTermination, CircuitType
class ProviderFilter(CustomFieldFilterSet): class ProviderFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -29,7 +33,7 @@ class ProviderFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = Provider model = Provider
fields = ['id', 'name', 'slug', 'asn', 'account'] fields = ['name', 'slug', 'asn', 'account']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -51,6 +55,10 @@ class CircuitTypeFilter(NameSlugSearchFilterSet):
class CircuitFilter(CustomFieldFilterSet): class CircuitFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -104,7 +112,7 @@ class CircuitFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = Circuit model = Circuit
fields = ['id', 'cid', 'install_date', 'commit_rate'] fields = ['cid', 'install_date', 'commit_rate']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -8,7 +8,7 @@ from netaddr.core import AddrFormatError
from extras.filters import CustomFieldFilterSet from extras.filters import CustomFieldFilterSet
from tenancy.models import Tenant from tenancy.models import Tenant
from utilities.constants import COLOR_CHOICES from utilities.constants import COLOR_CHOICES
from utilities.filters import NameSlugSearchFilterSet, TagFilter, TreeNodeMultipleChoiceFilter from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter
from virtualization.models import Cluster from virtualization.models import Cluster
from .constants import * from .constants import *
from .models import ( from .models import (
@ -38,6 +38,10 @@ class RegionFilter(NameSlugSearchFilterSet):
class SiteFilter(CustomFieldFilterSet): class SiteFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -122,6 +126,10 @@ class RackRoleFilter(NameSlugSearchFilterSet):
class RackFilter(CustomFieldFilterSet): class RackFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -192,6 +200,10 @@ class RackFilter(CustomFieldFilterSet):
class RackReservationFilter(django_filters.FilterSet): class RackReservationFilter(django_filters.FilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -245,7 +257,7 @@ class RackReservationFilter(django_filters.FilterSet):
class Meta: class Meta:
model = RackReservation model = RackReservation
fields = ['id', 'created'] fields = ['created']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -266,6 +278,10 @@ class ManufacturerFilter(NameSlugSearchFilterSet):
class DeviceTypeFilter(CustomFieldFilterSet): class DeviceTypeFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -309,7 +325,7 @@ class DeviceTypeFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = DeviceType model = DeviceType
fields = [ fields = [
'id', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role',
] ]
def search(self, queryset, name, value): def search(self, queryset, name, value):
@ -434,6 +450,10 @@ class PlatformFilter(NameSlugSearchFilterSet):
class DeviceFilter(CustomFieldFilterSet): class DeviceFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -1062,6 +1082,10 @@ class InterfaceConnectionFilter(django_filters.FilterSet):
class PowerPanelFilter(django_filters.FilterSet): class PowerPanelFilter(django_filters.FilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -1084,7 +1108,7 @@ class PowerPanelFilter(django_filters.FilterSet):
class Meta: class Meta:
model = PowerPanel model = PowerPanel
fields = ['id', 'name'] fields = ['name']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -1096,6 +1120,10 @@ class PowerPanelFilter(django_filters.FilterSet):
class PowerFeedFilter(CustomFieldFilterSet): class PowerFeedFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -1124,7 +1152,7 @@ class PowerFeedFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = PowerFeed model = PowerFeed
fields = ['id', 'name', 'status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'power_factor'] fields = ['name', 'status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'power_factor']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -7,13 +7,17 @@ from netaddr.core import AddrFormatError
from dcim.models import Site, Device, Interface from dcim.models import Site, Device, Interface
from extras.filters import CustomFieldFilterSet from extras.filters import CustomFieldFilterSet
from tenancy.models import Tenant from tenancy.models import Tenant
from utilities.filters import NameSlugSearchFilterSet, TagFilter from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter
from virtualization.models import VirtualMachine from virtualization.models import VirtualMachine
from .constants import IPADDRESS_ROLE_CHOICES, IPADDRESS_STATUS_CHOICES, PREFIX_STATUS_CHOICES, VLAN_STATUS_CHOICES from .constants import IPADDRESS_ROLE_CHOICES, IPADDRESS_STATUS_CHOICES, PREFIX_STATUS_CHOICES, VLAN_STATUS_CHOICES
from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF
class VRFFilter(CustomFieldFilterSet): class VRFFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -30,10 +34,6 @@ class VRFFilter(CustomFieldFilterSet):
) )
tag = TagFilter() tag = TagFilter()
class Meta:
model = VRF
fields = ['id', 'name', 'rd', 'enforce_unique']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
@ -43,15 +43,27 @@ class VRFFilter(CustomFieldFilterSet):
Q(description__icontains=value) Q(description__icontains=value)
) )
class Meta:
model = VRF
fields = ['name', 'rd', 'enforce_unique']
class RIRFilter(NameSlugSearchFilterSet): class RIRFilter(NameSlugSearchFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
class Meta: class Meta:
model = RIR model = RIR
fields = ['id', 'name', 'slug', 'is_private'] fields = ['name', 'slug', 'is_private']
class AggregateFilter(CustomFieldFilterSet): class AggregateFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -74,7 +86,7 @@ class AggregateFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = Aggregate model = Aggregate
fields = ['id', 'family', 'date_added'] fields = ['family', 'date_added']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -109,6 +121,10 @@ class RoleFilter(NameSlugSearchFilterSet):
class PrefixFilter(CustomFieldFilterSet): class PrefixFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -189,7 +205,7 @@ class PrefixFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = Prefix model = Prefix
fields = ['id', 'family', 'is_pool'] fields = ['family', 'is_pool']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -252,6 +268,10 @@ class PrefixFilter(CustomFieldFilterSet):
class IPAddressFilter(CustomFieldFilterSet): class IPAddressFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -324,7 +344,7 @@ class IPAddressFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = IPAddress model = IPAddress
fields = ['id', 'family', 'dns_name'] fields = ['family', 'dns_name']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -389,6 +409,10 @@ class VLANGroupFilter(NameSlugSearchFilterSet):
class VLANFilter(CustomFieldFilterSet): class VLANFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -441,7 +465,7 @@ class VLANFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = VLAN model = VLAN
fields = ['id', 'vid', 'name'] fields = ['vid', 'name']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -3,7 +3,7 @@ from django.db.models import Q
from dcim.models import Device from dcim.models import Device
from extras.filters import CustomFieldFilterSet from extras.filters import CustomFieldFilterSet
from utilities.filters import NameSlugSearchFilterSet, TagFilter from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter
from .models import Secret, SecretRole from .models import Secret, SecretRole
@ -15,6 +15,10 @@ class SecretRoleFilter(NameSlugSearchFilterSet):
class SecretFilter(CustomFieldFilterSet): class SecretFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -43,7 +47,7 @@ class SecretFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = Secret model = Secret
fields = ['id', 'name'] fields = ['name']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -2,7 +2,7 @@ import django_filters
from django.db.models import Q from django.db.models import Q
from extras.filters import CustomFieldFilterSet from extras.filters import CustomFieldFilterSet
from utilities.filters import NameSlugSearchFilterSet, TagFilter from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter
from .models import Tenant, TenantGroup from .models import Tenant, TenantGroup
@ -14,6 +14,10 @@ class TenantGroupFilter(NameSlugSearchFilterSet):
class TenantFilter(CustomFieldFilterSet): class TenantFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -32,7 +36,7 @@ class TenantFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = Tenant model = Tenant
fields = ['id', 'name', 'slug'] fields = ['name', 'slug']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -55,6 +55,13 @@ class TreeNodeMultipleChoiceFilter(django_filters.ModelMultipleChoiceFilter):
return super().filter(qs, value) return super().filter(qs, value)
class NumericInFilter(django_filters.BaseInFilter, django_filters.NumberFilter):
"""
Filters for a set of numeric values. Example: id__in=100,200,300
"""
pass
class NullableCharFieldFilter(django_filters.CharFilter): class NullableCharFieldFilter(django_filters.CharFilter):
""" """
Allow matching on null field values by passing a special string used to signify NULL. Allow matching on null field values by passing a special string used to signify NULL.

View File

@ -6,7 +6,7 @@ from netaddr.core import AddrFormatError
from dcim.models import DeviceRole, Interface, Platform, Region, Site from dcim.models import DeviceRole, Interface, Platform, Region, Site
from extras.filters import CustomFieldFilterSet from extras.filters import CustomFieldFilterSet
from tenancy.models import Tenant from tenancy.models import Tenant
from utilities.filters import NameSlugSearchFilterSet, TagFilter, TreeNodeMultipleChoiceFilter from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter
from .constants import VM_STATUS_CHOICES from .constants import VM_STATUS_CHOICES
from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
@ -26,6 +26,10 @@ class ClusterGroupFilter(NameSlugSearchFilterSet):
class ClusterFilter(CustomFieldFilterSet): class ClusterFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -64,7 +68,7 @@ class ClusterFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = Cluster model = Cluster
fields = ['id', 'name'] fields = ['name']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -76,6 +80,10 @@ class ClusterFilter(CustomFieldFilterSet):
class VirtualMachineFilter(CustomFieldFilterSet): class VirtualMachineFilter(CustomFieldFilterSet):
id__in = NumericInFilter(
field_name='id',
lookup_expr='in'
)
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',