From dfffd1ea943f8c71b8ad8912110d2e3390e5c6d6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 8 May 2019 21:08:35 -0400 Subject: [PATCH] Restore id__in filters to retain backward compatability until v2.7 --- netbox/circuits/filters.py | 14 +++++++--- netbox/dcim/filters.py | 38 +++++++++++++++++++++++---- netbox/ipam/filters.py | 44 ++++++++++++++++++++++++-------- netbox/secrets/filters.py | 8 ++++-- netbox/tenancy/filters.py | 8 ++++-- netbox/utilities/filters.py | 7 +++++ netbox/virtualization/filters.py | 12 +++++++-- 7 files changed, 107 insertions(+), 24 deletions(-) diff --git a/netbox/circuits/filters.py b/netbox/circuits/filters.py index 64ba2a1cb..02e95019a 100644 --- a/netbox/circuits/filters.py +++ b/netbox/circuits/filters.py @@ -4,12 +4,16 @@ from django.db.models import Q from dcim.models import Site from extras.filters import CustomFieldFilterSet 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 .models import Provider, Circuit, CircuitTermination, CircuitType class ProviderFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -29,7 +33,7 @@ class ProviderFilter(CustomFieldFilterSet): class Meta: model = Provider - fields = ['id', 'name', 'slug', 'asn', 'account'] + fields = ['name', 'slug', 'asn', 'account'] def search(self, queryset, name, value): if not value.strip(): @@ -51,6 +55,10 @@ class CircuitTypeFilter(NameSlugSearchFilterSet): class CircuitFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -104,7 +112,7 @@ class CircuitFilter(CustomFieldFilterSet): class Meta: model = Circuit - fields = ['id', 'cid', 'install_date', 'commit_rate'] + fields = ['cid', 'install_date', 'commit_rate'] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index d57e44882..48c38dd30 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -8,7 +8,7 @@ from netaddr.core import AddrFormatError from extras.filters import CustomFieldFilterSet from tenancy.models import Tenant 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 .constants import * from .models import ( @@ -38,6 +38,10 @@ class RegionFilter(NameSlugSearchFilterSet): class SiteFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -122,6 +126,10 @@ class RackRoleFilter(NameSlugSearchFilterSet): class RackFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -192,6 +200,10 @@ class RackFilter(CustomFieldFilterSet): class RackReservationFilter(django_filters.FilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -245,7 +257,7 @@ class RackReservationFilter(django_filters.FilterSet): class Meta: model = RackReservation - fields = ['id', 'created'] + fields = ['created'] def search(self, queryset, name, value): if not value.strip(): @@ -266,6 +278,10 @@ class ManufacturerFilter(NameSlugSearchFilterSet): class DeviceTypeFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -309,7 +325,7 @@ class DeviceTypeFilter(CustomFieldFilterSet): class Meta: model = DeviceType 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): @@ -434,6 +450,10 @@ class PlatformFilter(NameSlugSearchFilterSet): class DeviceFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -1062,6 +1082,10 @@ class InterfaceConnectionFilter(django_filters.FilterSet): class PowerPanelFilter(django_filters.FilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -1084,7 +1108,7 @@ class PowerPanelFilter(django_filters.FilterSet): class Meta: model = PowerPanel - fields = ['id', 'name'] + fields = ['name'] def search(self, queryset, name, value): if not value.strip(): @@ -1096,6 +1120,10 @@ class PowerPanelFilter(django_filters.FilterSet): class PowerFeedFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -1124,7 +1152,7 @@ class PowerFeedFilter(CustomFieldFilterSet): class Meta: 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): if not value.strip(): diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index b4e64262a..5558094eb 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -7,13 +7,17 @@ from netaddr.core import AddrFormatError from dcim.models import Site, Device, Interface from extras.filters import CustomFieldFilterSet from tenancy.models import Tenant -from utilities.filters import NameSlugSearchFilterSet, TagFilter +from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter from virtualization.models import VirtualMachine 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 class VRFFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -30,10 +34,6 @@ class VRFFilter(CustomFieldFilterSet): ) tag = TagFilter() - class Meta: - model = VRF - fields = ['id', 'name', 'rd', 'enforce_unique'] - def search(self, queryset, name, value): if not value.strip(): return queryset @@ -43,15 +43,27 @@ class VRFFilter(CustomFieldFilterSet): Q(description__icontains=value) ) + class Meta: + model = VRF + fields = ['name', 'rd', 'enforce_unique'] + class RIRFilter(NameSlugSearchFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) class Meta: model = RIR - fields = ['id', 'name', 'slug', 'is_private'] + fields = ['name', 'slug', 'is_private'] class AggregateFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -74,7 +86,7 @@ class AggregateFilter(CustomFieldFilterSet): class Meta: model = Aggregate - fields = ['id', 'family', 'date_added'] + fields = ['family', 'date_added'] def search(self, queryset, name, value): if not value.strip(): @@ -109,6 +121,10 @@ class RoleFilter(NameSlugSearchFilterSet): class PrefixFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -189,7 +205,7 @@ class PrefixFilter(CustomFieldFilterSet): class Meta: model = Prefix - fields = ['id', 'family', 'is_pool'] + fields = ['family', 'is_pool'] def search(self, queryset, name, value): if not value.strip(): @@ -252,6 +268,10 @@ class PrefixFilter(CustomFieldFilterSet): class IPAddressFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -324,7 +344,7 @@ class IPAddressFilter(CustomFieldFilterSet): class Meta: model = IPAddress - fields = ['id', 'family', 'dns_name'] + fields = ['family', 'dns_name'] def search(self, queryset, name, value): if not value.strip(): @@ -389,6 +409,10 @@ class VLANGroupFilter(NameSlugSearchFilterSet): class VLANFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -441,7 +465,7 @@ class VLANFilter(CustomFieldFilterSet): class Meta: model = VLAN - fields = ['id', 'vid', 'name'] + fields = ['vid', 'name'] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/secrets/filters.py b/netbox/secrets/filters.py index a06791498..628d716db 100644 --- a/netbox/secrets/filters.py +++ b/netbox/secrets/filters.py @@ -3,7 +3,7 @@ from django.db.models import Q from dcim.models import Device from extras.filters import CustomFieldFilterSet -from utilities.filters import NameSlugSearchFilterSet, TagFilter +from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter from .models import Secret, SecretRole @@ -15,6 +15,10 @@ class SecretRoleFilter(NameSlugSearchFilterSet): class SecretFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -43,7 +47,7 @@ class SecretFilter(CustomFieldFilterSet): class Meta: model = Secret - fields = ['id', 'name'] + fields = ['name'] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/tenancy/filters.py b/netbox/tenancy/filters.py index 52e13425c..acb0fa0cc 100644 --- a/netbox/tenancy/filters.py +++ b/netbox/tenancy/filters.py @@ -2,7 +2,7 @@ import django_filters from django.db.models import Q from extras.filters import CustomFieldFilterSet -from utilities.filters import NameSlugSearchFilterSet, TagFilter +from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter from .models import Tenant, TenantGroup @@ -14,6 +14,10 @@ class TenantGroupFilter(NameSlugSearchFilterSet): class TenantFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -32,7 +36,7 @@ class TenantFilter(CustomFieldFilterSet): class Meta: model = Tenant - fields = ['id', 'name', 'slug'] + fields = ['name', 'slug'] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/utilities/filters.py b/netbox/utilities/filters.py index b5db210de..614c09902 100644 --- a/netbox/utilities/filters.py +++ b/netbox/utilities/filters.py @@ -55,6 +55,13 @@ class TreeNodeMultipleChoiceFilter(django_filters.ModelMultipleChoiceFilter): 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): """ Allow matching on null field values by passing a special string used to signify NULL. diff --git a/netbox/virtualization/filters.py b/netbox/virtualization/filters.py index 69e1493cd..ec6487704 100644 --- a/netbox/virtualization/filters.py +++ b/netbox/virtualization/filters.py @@ -6,7 +6,7 @@ from netaddr.core import AddrFormatError from dcim.models import DeviceRole, Interface, Platform, Region, Site from extras.filters import CustomFieldFilterSet 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 .models import Cluster, ClusterGroup, ClusterType, VirtualMachine @@ -26,6 +26,10 @@ class ClusterGroupFilter(NameSlugSearchFilterSet): class ClusterFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search', @@ -64,7 +68,7 @@ class ClusterFilter(CustomFieldFilterSet): class Meta: model = Cluster - fields = ['id', 'name'] + fields = ['name'] def search(self, queryset, name, value): if not value.strip(): @@ -76,6 +80,10 @@ class ClusterFilter(CustomFieldFilterSet): class VirtualMachineFilter(CustomFieldFilterSet): + id__in = NumericInFilter( + field_name='id', + lookup_expr='in' + ) q = django_filters.CharFilter( method='search', label='Search',