From 05b71564d887b38078d912d2e85901e9c04ccd2a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 22 Mar 2017 09:39:30 -0400 Subject: [PATCH] Closes #981: Allow filtering primary objects by a given set of IDs --- netbox/circuits/filters.py | 4 +++- netbox/dcim/filters.py | 6 +++++- netbox/ipam/filters.py | 8 +++++++- netbox/secrets/filters.py | 2 ++ netbox/tenancy/filters.py | 3 ++- netbox/utilities/filters.py | 11 +++++++++++ 6 files changed, 30 insertions(+), 4 deletions(-) diff --git a/netbox/circuits/filters.py b/netbox/circuits/filters.py index b07e87068..087512028 100644 --- a/netbox/circuits/filters.py +++ b/netbox/circuits/filters.py @@ -5,12 +5,13 @@ 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 NullableModelMultipleChoiceFilter +from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter from .models import Provider, Circuit, CircuitType class ProviderFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -42,6 +43,7 @@ class ProviderFilter(CustomFieldFilterSet, django_filters.FilterSet): class CircuitFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index eca792a12..63624dc30 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -5,7 +5,7 @@ from django.db.models import Q from extras.filters import CustomFieldFilterSet from tenancy.models import Tenant -from utilities.filters import NullableModelMultipleChoiceFilter +from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter from .models import ( ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, IFACE_FF_LAG, Interface, InterfaceConnection, Manufacturer, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackReservation, RackRole, Region, Site, @@ -14,6 +14,7 @@ from .models import ( class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -81,6 +82,7 @@ class RackGroupFilter(django_filters.FilterSet): class RackFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -157,6 +159,7 @@ class RackReservationFilter(django_filters.FilterSet): class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -191,6 +194,7 @@ class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet): class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index 10a18d1b7..3c39a4308 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -7,12 +7,13 @@ from django.db.models import Q from dcim.models import Site, Device, Interface from extras.filters import CustomFieldFilterSet from tenancy.models import Tenant -from utilities.filters import NullableModelMultipleChoiceFilter +from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter from .models import Aggregate, IPAddress, Prefix, RIR, Role, Service, VLAN, VLANGroup, VRF class VRFFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -44,6 +45,7 @@ class VRFFilter(CustomFieldFilterSet, django_filters.FilterSet): class RIRFilter(django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') class Meta: model = RIR @@ -51,6 +53,7 @@ class RIRFilter(django_filters.FilterSet): class AggregateFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -84,6 +87,7 @@ class AggregateFilter(CustomFieldFilterSet, django_filters.FilterSet): class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -182,6 +186,7 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', @@ -283,6 +288,7 @@ class VLANGroupFilter(django_filters.FilterSet): class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/secrets/filters.py b/netbox/secrets/filters.py index 5f59daad4..f2cab9691 100644 --- a/netbox/secrets/filters.py +++ b/netbox/secrets/filters.py @@ -4,9 +4,11 @@ from django.db.models import Q from .models import Secret, SecretRole from dcim.models import Device +from utilities.filters import NumericInFilter class SecretFilter(django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/tenancy/filters.py b/netbox/tenancy/filters.py index ed1721102..b96345980 100644 --- a/netbox/tenancy/filters.py +++ b/netbox/tenancy/filters.py @@ -3,11 +3,12 @@ import django_filters from django.db.models import Q from extras.filters import CustomFieldFilterSet -from utilities.filters import NullableModelMultipleChoiceFilter +from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter from .models import Tenant, TenantGroup class TenantFilter(CustomFieldFilterSet, django_filters.FilterSet): + id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', diff --git a/netbox/utilities/filters.py b/netbox/utilities/filters.py index d1dbf39b8..c352f0f41 100644 --- a/netbox/utilities/filters.py +++ b/netbox/utilities/filters.py @@ -6,6 +6,17 @@ from django.db.models import Q from django.utils.encoding import force_text +# +# Filters +# + +class NumericInFilter(django_filters.BaseInFilter, django_filters.NumberFilter): + """ + Filters for a set of numeric values. Example: id__in=100,200,300 + """ + pass + + class NullableModelMultipleChoiceField(forms.ModelMultipleChoiceField): """ This field operates like a normal ModelMultipleChoiceField except that it allows for one additional choice which is