From 87e5687d0372a50da72b6ad1ae4ce7d2a48d682d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 19 Jun 2017 16:10:18 -0400 Subject: [PATCH] Closes #1203: Implemented query filters for all models --- netbox/circuits/api/views.py | 1 + netbox/circuits/filters.py | 42 +++++-- netbox/dcim/api/views.py | 5 + netbox/dcim/filters.py | 227 ++++++++++++++++++++++------------- netbox/ipam/api/views.py | 19 +-- netbox/ipam/filters.py | 33 ++--- netbox/secrets/api/views.py | 1 + netbox/secrets/filters.py | 9 +- netbox/tenancy/api/views.py | 5 +- netbox/tenancy/filters.py | 8 +- 10 files changed, 223 insertions(+), 127 deletions(-) diff --git a/netbox/circuits/api/views.py b/netbox/circuits/api/views.py index d14080531..685fa8f9e 100644 --- a/netbox/circuits/api/views.py +++ b/netbox/circuits/api/views.py @@ -43,6 +43,7 @@ class ProviderViewSet(WritableSerializerMixin, CustomFieldModelViewSet): class CircuitTypeViewSet(ModelViewSet): queryset = CircuitType.objects.all() serializer_class = serializers.CircuitTypeSerializer + filter_class = filters.CircuitTypeFilter # diff --git a/netbox/circuits/filters.py b/netbox/circuits/filters.py index 6e9e1f443..8a1b01a89 100644 --- a/netbox/circuits/filters.py +++ b/netbox/circuits/filters.py @@ -31,7 +31,7 @@ class ProviderFilter(CustomFieldFilterSet, django_filters.FilterSet): class Meta: model = Provider - fields = ['name', 'account', 'asn'] + fields = ['name', 'slug', 'asn', 'account'] def search(self, queryset, name, value): if not value.strip(): @@ -39,10 +39,19 @@ class ProviderFilter(CustomFieldFilterSet, django_filters.FilterSet): return queryset.filter( Q(name__icontains=value) | Q(account__icontains=value) | + Q(noc_contact__icontains=value) | + Q(admin_contact__icontains=value) | Q(comments__icontains=value) ) +class CircuitTypeFilter(django_filters.FilterSet): + + class Meta: + model = CircuitType + fields = ['name', 'slug'] + + class CircuitFilter(CustomFieldFilterSet, django_filters.FilterSet): id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( @@ -50,7 +59,6 @@ class CircuitFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Search', ) provider_id = django_filters.ModelMultipleChoiceFilter( - name='provider', queryset=Provider.objects.all(), label='Provider (ID)', ) @@ -61,7 +69,6 @@ class CircuitFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Provider (slug)', ) type_id = django_filters.ModelMultipleChoiceFilter( - name='type', queryset=CircuitType.objects.all(), label='Circuit type (ID)', ) @@ -72,7 +79,6 @@ class CircuitFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Circuit type (slug)', ) tenant_id = NullableModelMultipleChoiceFilter( - name='tenant', queryset=Tenant.objects.all(), label='Tenant (ID)', ) @@ -96,7 +102,7 @@ class CircuitFilter(CustomFieldFilterSet, django_filters.FilterSet): class Meta: model = Circuit - fields = ['install_date'] + fields = ['cid', 'install_date', 'commit_rate'] def search(self, queryset, name, value): if not value.strip(): @@ -111,12 +117,34 @@ class CircuitFilter(CustomFieldFilterSet, django_filters.FilterSet): class CircuitTerminationFilter(django_filters.FilterSet): + q = django_filters.CharFilter( + method='search', + label='Search', + ) circuit_id = django_filters.ModelMultipleChoiceFilter( - name='circuit', queryset=Circuit.objects.all(), label='Circuit', ) + site_id = django_filters.ModelMultipleChoiceFilter( + queryset=Site.objects.all(), + label='Site (ID)', + ) + site = django_filters.ModelMultipleChoiceFilter( + name='site__slug', + queryset=Site.objects.all(), + to_field_name='slug', + label='Site (slug)', + ) class Meta: model = CircuitTermination - fields = ['term_side', 'site'] + fields = ['term_side', 'port_speed', 'upstream_speed', 'xconnect_id'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(circuit__cid__icontains=value) | + Q(xconnect_id__icontains=value) | + Q(pp_info__icontains=value) + ).distinct() diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 116aaa77c..8c888e60f 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -32,6 +32,7 @@ class RegionViewSet(WritableSerializerMixin, ModelViewSet): queryset = Region.objects.all() serializer_class = serializers.RegionSerializer write_serializer_class = serializers.WritableRegionSerializer + filter_class = filters.RegionFilter # @@ -73,6 +74,7 @@ class RackGroupViewSet(WritableSerializerMixin, ModelViewSet): class RackRoleViewSet(ModelViewSet): queryset = RackRole.objects.all() serializer_class = serializers.RackRoleSerializer + filter_class = filters.RackRoleFilter # @@ -128,6 +130,7 @@ class RackReservationViewSet(WritableSerializerMixin, ModelViewSet): class ManufacturerViewSet(ModelViewSet): queryset = Manufacturer.objects.all() serializer_class = serializers.ManufacturerSerializer + filter_class = filters.ManufacturerFilter # @@ -194,6 +197,7 @@ class DeviceBayTemplateViewSet(WritableSerializerMixin, ModelViewSet): class DeviceRoleViewSet(ModelViewSet): queryset = DeviceRole.objects.all() serializer_class = serializers.DeviceRoleSerializer + filter_class = filters.DeviceRoleFilter # @@ -203,6 +207,7 @@ class DeviceRoleViewSet(ModelViewSet): class PlatformViewSet(ModelViewSet): queryset = Platform.objects.all() serializer_class = serializers.PlatformSerializer + filter_class = filters.PlatformFilter # diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 66913f182..cdb5519b7 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -3,6 +3,7 @@ from __future__ import unicode_literals import django_filters from netaddr.core import AddrFormatError +from django.contrib.auth.models import User from django.db.models import Q from extras.filters import CustomFieldFilterSet @@ -17,6 +18,22 @@ from .models import ( ) +class RegionFilter(django_filters.FilterSet): + parent_id = NullableModelMultipleChoiceFilter( + queryset=Region.objects.all(), + label='Parent region (ID)', + ) + parent = NullableModelMultipleChoiceFilter( + queryset=Region.objects.all(), + to_field_name='slug', + label='Parent region (slug)', + ) + + class Meta: + model = Region + fields = ['name', 'slug'] + + class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet): id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( @@ -24,23 +41,19 @@ class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Search', ) region_id = NullableModelMultipleChoiceFilter( - name='region', queryset=Region.objects.all(), label='Region (ID)', ) region = NullableModelMultipleChoiceFilter( - name='region', queryset=Region.objects.all(), to_field_name='slug', label='Region (slug)', ) tenant_id = NullableModelMultipleChoiceFilter( - name='tenant', queryset=Tenant.objects.all(), label='Tenant (ID)', ) tenant = NullableModelMultipleChoiceFilter( - name='tenant', queryset=Tenant.objects.all(), to_field_name='slug', label='Tenant (slug)', @@ -48,7 +61,7 @@ class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet): class Meta: model = Site - fields = ['q', 'name', 'facility', 'asn'] + fields = ['q', 'name', 'slug', 'facility', 'asn', 'contact_name', 'contact_phone', 'contact_email'] def search(self, queryset, name, value): if not value.strip(): @@ -58,6 +71,9 @@ class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet): Q(facility__icontains=value) | Q(physical_address__icontains=value) | Q(shipping_address__icontains=value) | + Q(contact_name__icontains=value) | + Q(contact_phone__icontains=value) | + Q(contact_email__icontains=value) | Q(comments__icontains=value) ) try: @@ -69,7 +85,6 @@ class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet): class RackGroupFilter(django_filters.FilterSet): site_id = django_filters.ModelMultipleChoiceFilter( - name='site', queryset=Site.objects.all(), label='Site (ID)', ) @@ -82,7 +97,14 @@ class RackGroupFilter(django_filters.FilterSet): class Meta: model = RackGroup - fields = ['name'] + fields = ['site_id', 'name', 'slug'] + + +class RackRoleFilter(django_filters.FilterSet): + + class Meta: + model = RackRole + fields = ['name', 'slug', 'color'] class RackFilter(CustomFieldFilterSet, django_filters.FilterSet): @@ -92,7 +114,6 @@ class RackFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Search', ) site_id = django_filters.ModelMultipleChoiceFilter( - name='site', queryset=Site.objects.all(), label='Site (ID)', ) @@ -103,7 +124,6 @@ class RackFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Site (slug)', ) group_id = NullableModelMultipleChoiceFilter( - name='group', queryset=RackGroup.objects.all(), label='Group (ID)', ) @@ -114,7 +134,6 @@ class RackFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Group', ) tenant_id = NullableModelMultipleChoiceFilter( - name='tenant', queryset=Tenant.objects.all(), label='Tenant (ID)', ) @@ -125,7 +144,6 @@ class RackFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Tenant (slug)', ) role_id = NullableModelMultipleChoiceFilter( - name='role', queryset=RackRole.objects.all(), label='Role (ID)', ) @@ -138,7 +156,7 @@ class RackFilter(CustomFieldFilterSet, django_filters.FilterSet): class Meta: model = Rack - fields = ['u_height'] + fields = ['facility_id', 'type', 'width', 'u_height', 'desc_units'] def search(self, queryset, name, value): if not value.strip(): @@ -156,6 +174,10 @@ class RackReservationFilter(django_filters.FilterSet): method='search', label='Search', ) + rack_id = django_filters.ModelMultipleChoiceFilter( + queryset=Rack.objects.all(), + label='Rack (ID)', + ) site_id = django_filters.ModelMultipleChoiceFilter( name='rack__site', queryset=Site.objects.all(), @@ -178,15 +200,20 @@ class RackReservationFilter(django_filters.FilterSet): to_field_name='slug', label='Group', ) - rack_id = django_filters.ModelMultipleChoiceFilter( - name='rack', - queryset=Rack.objects.all(), - label='Rack (ID)', + user_id = django_filters.ModelMultipleChoiceFilter( + queryset=User.objects.all(), + label='User (ID)', + ) + user = django_filters.ModelMultipleChoiceFilter( + name='user', + queryset=User.objects.all(), + to_field_name = 'username', + label='User (name)', ) class Meta: model = RackReservation - fields = ['rack', 'user'] + fields = ['created'] def search(self, queryset, name, value): if not value.strip(): @@ -199,6 +226,13 @@ class RackReservationFilter(django_filters.FilterSet): ) +class ManufacturerFilter(django_filters.FilterSet): + + class Meta: + model = Manufacturer + fields = ['name', 'slug'] + + class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet): id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( @@ -206,7 +240,6 @@ class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Search', ) manufacturer_id = django_filters.ModelMultipleChoiceFilter( - name='manufacturer', queryset=Manufacturer.objects.all(), label='Manufacturer (ID)', ) @@ -220,7 +253,8 @@ class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet): class Meta: model = DeviceType fields = [ - 'model', 'part_number', 'u_height', 'is_console_server', 'is_pdu', 'is_network_device', 'subdevice_role', + 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu', + 'is_network_device', 'subdevice_role', ] def search(self, queryset, name, value): @@ -236,16 +270,9 @@ class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet): class DeviceTypeComponentFilterSet(django_filters.FilterSet): devicetype_id = django_filters.ModelMultipleChoiceFilter( - name='device_type', queryset=DeviceType.objects.all(), label='Device type (ID)', ) - devicetype = django_filters.ModelMultipleChoiceFilter( - name='device_type', - queryset=DeviceType.objects.all(), - to_field_name='name', - label='Device type (name)', - ) class ConsolePortTemplateFilter(DeviceTypeComponentFilterSet): @@ -280,7 +307,7 @@ class InterfaceTemplateFilter(DeviceTypeComponentFilterSet): class Meta: model = InterfaceTemplate - fields = ['name', 'form_factor'] + fields = ['name', 'form_factor', 'mgmt_only'] class DeviceBayTemplateFilter(DeviceTypeComponentFilterSet): @@ -290,18 +317,73 @@ class DeviceBayTemplateFilter(DeviceTypeComponentFilterSet): fields = ['name'] +class DeviceRoleFilter(django_filters.FilterSet): + + class Meta: + model = DeviceRole + fields = ['name', 'slug', 'color'] + + +class PlatformFilter(django_filters.FilterSet): + + class Meta: + model = Platform + fields = ['name', 'slug'] + + class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet): id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( method='search', label='Search', ) - mac_address = django_filters.CharFilter( - method='_mac_address', - label='MAC address', + manufacturer_id = django_filters.ModelMultipleChoiceFilter( + name='device_type__manufacturer', + queryset=Manufacturer.objects.all(), + label='Manufacturer (ID)', + ) + manufacturer = django_filters.ModelMultipleChoiceFilter( + name='device_type__manufacturer__slug', + queryset=Manufacturer.objects.all(), + to_field_name='slug', + label='Manufacturer (slug)', + ) + device_type_id = django_filters.ModelMultipleChoiceFilter( + queryset=DeviceType.objects.all(), + label='Device type (ID)', + ) + role_id = django_filters.ModelMultipleChoiceFilter( + name='device_role_id', + queryset=DeviceRole.objects.all(), + label='Role (ID)', + ) + role = django_filters.ModelMultipleChoiceFilter( + name='device_role__slug', + queryset=DeviceRole.objects.all(), + to_field_name='slug', + label='Role (slug)', + ) + tenant_id = NullableModelMultipleChoiceFilter( + queryset=Tenant.objects.all(), + label='Tenant (ID)', + ) + tenant = NullableModelMultipleChoiceFilter( + name='tenant', + queryset=Tenant.objects.all(), + to_field_name='slug', + label='Tenant (slug)', + ) + platform_id = NullableModelMultipleChoiceFilter( + queryset=Platform.objects.all(), + label='Platform (ID)', + ) + platform = NullableModelMultipleChoiceFilter( + name='platform', + queryset=Platform.objects.all(), + to_field_name='slug', + label='Platform (slug)', ) site_id = django_filters.ModelMultipleChoiceFilter( - name='site', queryset=Site.objects.all(), label='Site (ID)', ) @@ -321,60 +403,18 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet): queryset=Rack.objects.all(), label='Rack (ID)', ) - role_id = django_filters.ModelMultipleChoiceFilter( - name='device_role', - queryset=DeviceRole.objects.all(), - label='Role (ID)', - ) - role = django_filters.ModelMultipleChoiceFilter( - name='device_role__slug', - queryset=DeviceRole.objects.all(), - to_field_name='slug', - label='Role (slug)', - ) - tenant_id = NullableModelMultipleChoiceFilter( - name='tenant', - queryset=Tenant.objects.all(), - label='Tenant (ID)', - ) - tenant = NullableModelMultipleChoiceFilter( - name='tenant', - queryset=Tenant.objects.all(), - to_field_name='slug', - label='Tenant (slug)', - ) - device_type_id = django_filters.ModelMultipleChoiceFilter( - name='device_type', - queryset=DeviceType.objects.all(), - label='Device type (ID)', - ) - manufacturer_id = django_filters.ModelMultipleChoiceFilter( - name='device_type__manufacturer', - queryset=Manufacturer.objects.all(), - label='Manufacturer (ID)', - ) - manufacturer = django_filters.ModelMultipleChoiceFilter( - name='device_type__manufacturer__slug', - queryset=Manufacturer.objects.all(), - to_field_name='slug', - label='Manufacturer (slug)', - ) model = django_filters.ModelMultipleChoiceFilter( name='device_type__slug', queryset=DeviceType.objects.all(), to_field_name='slug', label='Device model (slug)', ) - platform_id = NullableModelMultipleChoiceFilter( - name='platform', - queryset=Platform.objects.all(), - label='Platform (ID)', + status = django_filters.MultipleChoiceFilter( + choices=STATUS_CHOICES ) - platform = NullableModelMultipleChoiceFilter( - name='platform', - queryset=Platform.objects.all(), - to_field_name='slug', - label='Platform (slug)', + is_full_depth = django_filters.BooleanFilter( + name='device_type__is_full_depth', + label='Is full depth', ) is_console_server = django_filters.BooleanFilter( name='device_type__is_console_server', @@ -388,13 +428,14 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet): name='device_type__is_network_device', label='Is a network device', ) + mac_address = django_filters.CharFilter( + method='_mac_address', + label='MAC address', + ) has_primary_ip = django_filters.BooleanFilter( method='_has_primary_ip', label='Has a primary IP', ) - status = django_filters.MultipleChoiceFilter( - choices=STATUS_CHOICES - ) class Meta: model = Device @@ -435,12 +476,10 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet): class DeviceComponentFilterSet(django_filters.FilterSet): device_id = django_filters.ModelChoiceFilter( - name='device', queryset=Device.objects.all(), label='Device (ID)', ) device = django_filters.ModelChoiceFilter( - name='device__name', queryset=Device.objects.all(), to_field_name='name', label='Device (name)', @@ -476,6 +515,10 @@ class PowerOutletFilter(DeviceComponentFilterSet): class InterfaceFilter(django_filters.FilterSet): + """ + Not using DeviceComponentFilterSet for Interfaces because we need to glean the ordering logic from the parent + Device's DeviceType. + """ device = django_filters.CharFilter( method='filter_device', name='name', @@ -502,7 +545,7 @@ class InterfaceFilter(django_filters.FilterSet): class Meta: model = Interface - fields = ['name', 'form_factor'] + fields = ['name', 'form_factor', 'mgmt_only'] def filter_device(self, queryset, name, value): try: @@ -539,10 +582,24 @@ class DeviceBayFilter(DeviceComponentFilterSet): class InventoryItemFilter(DeviceComponentFilterSet): + parent_id = NullableModelMultipleChoiceFilter( + queryset=InventoryItem.objects.all(), + label='Parent inventory item (ID)', + ) + manufacturer_id = django_filters.ModelMultipleChoiceFilter( + queryset=Manufacturer.objects.all(), + label='Manufacturer (ID)', + ) + manufacturer = django_filters.ModelMultipleChoiceFilter( + name='manufacturer__slug', + queryset=Manufacturer.objects.all(), + to_field_name='slug', + label='Manufacturer (slug)', + ) class Meta: model = InventoryItem - fields = ['name'] + fields = ['name', 'part_id', 'serial', 'discovered'] class ConsoleConnectionFilter(django_filters.FilterSet): diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index 87c1996a1..74d26dca1 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -20,15 +20,6 @@ class VRFViewSet(WritableSerializerMixin, CustomFieldModelViewSet): filter_class = filters.VRFFilter -# -# Roles -# - -class RoleViewSet(ModelViewSet): - queryset = Role.objects.all() - serializer_class = serializers.RoleSerializer - - # # RIRs # @@ -50,6 +41,16 @@ class AggregateViewSet(WritableSerializerMixin, CustomFieldModelViewSet): filter_class = filters.AggregateFilter +# +# Roles +# + +class RoleViewSet(ModelViewSet): + queryset = Role.objects.all() + serializer_class = serializers.RoleSerializer + filter_class = filters.RoleFilter + + # # Prefixes # diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index a4532edb4..045ca1df4 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -23,7 +23,6 @@ class VRFFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Search', ) tenant_id = NullableModelMultipleChoiceFilter( - name='tenant', queryset=Tenant.objects.all(), label='Tenant (ID)', ) @@ -45,7 +44,7 @@ class VRFFilter(CustomFieldFilterSet, django_filters.FilterSet): class Meta: model = VRF - fields = ['name', 'rd'] + fields = ['name', 'rd', 'enforce_unique'] class RIRFilter(django_filters.FilterSet): @@ -53,7 +52,7 @@ class RIRFilter(django_filters.FilterSet): class Meta: model = RIR - fields = ['is_private'] + fields = ['name', 'slug', 'is_private'] class AggregateFilter(CustomFieldFilterSet, django_filters.FilterSet): @@ -63,7 +62,6 @@ class AggregateFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Search', ) rir_id = django_filters.ModelMultipleChoiceFilter( - name='rir', queryset=RIR.objects.all(), label='RIR (ID)', ) @@ -90,6 +88,13 @@ class AggregateFilter(CustomFieldFilterSet, django_filters.FilterSet): return queryset.filter(qs_filter) +class RoleFilter(django_filters.FilterSet): + + class Meta: + model = Role + fields = ['name', 'slug'] + + class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( @@ -105,7 +110,6 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Mask length', ) vrf_id = NullableModelMultipleChoiceFilter( - name='vrf_id', queryset=VRF.objects.all(), label='VRF', ) @@ -116,7 +120,6 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): label='VRF (RD)', ) tenant_id = NullableModelMultipleChoiceFilter( - name='tenant', queryset=Tenant.objects.all(), label='Tenant (ID)', ) @@ -127,7 +130,6 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Tenant (slug)', ) site_id = NullableModelMultipleChoiceFilter( - name='site', queryset=Site.objects.all(), label='Site (ID)', ) @@ -138,7 +140,6 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Site (slug)', ) vlan_id = NullableModelMultipleChoiceFilter( - name='vlan', queryset=VLAN.objects.all(), label='VLAN (ID)', ) @@ -147,7 +148,6 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): label='VLAN number (1-4095)', ) role_id = NullableModelMultipleChoiceFilter( - name='role', queryset=Role.objects.all(), label='Role (ID)', ) @@ -163,7 +163,7 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): class Meta: model = Prefix - fields = ['family'] + fields = ['family', 'is_pool'] def search(self, queryset, name, value): if not value.strip(): @@ -207,7 +207,6 @@ class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Mask length', ) vrf_id = NullableModelMultipleChoiceFilter( - name='vrf_id', queryset=VRF.objects.all(), label='VRF', ) @@ -218,7 +217,6 @@ class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet): label='VRF (RD)', ) tenant_id = NullableModelMultipleChoiceFilter( - name='tenant', queryset=Tenant.objects.all(), label='Tenant (ID)', ) @@ -240,7 +238,6 @@ class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Device (name)', ) interface_id = django_filters.ModelMultipleChoiceFilter( - name='interface', queryset=Interface.objects.all(), label='Interface (ID)', ) @@ -284,7 +281,6 @@ class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet): class VLANGroupFilter(django_filters.FilterSet): site_id = NullableModelMultipleChoiceFilter( - name='site', queryset=Site.objects.all(), label='Site (ID)', ) @@ -297,7 +293,7 @@ class VLANGroupFilter(django_filters.FilterSet): class Meta: model = VLANGroup - fields = ['name'] + fields = ['name', 'slug'] class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet): @@ -307,7 +303,6 @@ class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Search', ) site_id = NullableModelMultipleChoiceFilter( - name='site', queryset=Site.objects.all(), label='Site (ID)', ) @@ -318,7 +313,6 @@ class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Site (slug)', ) group_id = NullableModelMultipleChoiceFilter( - name='group', queryset=VLANGroup.objects.all(), label='Group (ID)', ) @@ -329,7 +323,6 @@ class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Group', ) tenant_id = NullableModelMultipleChoiceFilter( - name='tenant', queryset=Tenant.objects.all(), label='Tenant (ID)', ) @@ -340,7 +333,6 @@ class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Tenant (slug)', ) role_id = NullableModelMultipleChoiceFilter( - name='role', queryset=Role.objects.all(), label='Role (ID)', ) @@ -356,7 +348,7 @@ class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet): class Meta: model = VLAN - fields = ['name', 'vid'] + fields = ['vid', 'name'] def search(self, queryset, name, value): if not value.strip(): @@ -371,7 +363,6 @@ class VLANFilter(CustomFieldFilterSet, django_filters.FilterSet): class ServiceFilter(django_filters.FilterSet): device_id = django_filters.ModelMultipleChoiceFilter( - name='device', queryset=Device.objects.all(), label='Device (ID)', ) diff --git a/netbox/secrets/api/views.py b/netbox/secrets/api/views.py index edc165aa0..52a77b87c 100644 --- a/netbox/secrets/api/views.py +++ b/netbox/secrets/api/views.py @@ -30,6 +30,7 @@ class SecretRoleViewSet(ModelViewSet): queryset = SecretRole.objects.all() serializer_class = serializers.SecretRoleSerializer permission_classes = [IsAuthenticated] + filter_class = filters.SecretRoleFilter # diff --git a/netbox/secrets/filters.py b/netbox/secrets/filters.py index 49cc03c17..eb40e8770 100644 --- a/netbox/secrets/filters.py +++ b/netbox/secrets/filters.py @@ -9,6 +9,13 @@ from dcim.models import Device from utilities.filters import NumericInFilter +class SecretRoleFilter(django_filters.FilterSet): + + class Meta: + model = SecretRole + fields = ['name', 'slug'] + + class SecretFilter(django_filters.FilterSet): id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( @@ -16,7 +23,6 @@ class SecretFilter(django_filters.FilterSet): label='Search', ) role_id = django_filters.ModelMultipleChoiceFilter( - name='role', queryset=SecretRole.objects.all(), label='Role (ID)', ) @@ -27,7 +33,6 @@ class SecretFilter(django_filters.FilterSet): label='Role (slug)', ) device_id = django_filters.ModelMultipleChoiceFilter( - name='device', queryset=Device.objects.all(), label='Device (ID)', ) diff --git a/netbox/tenancy/api/views.py b/netbox/tenancy/api/views.py index e5105f338..3c930bf73 100644 --- a/netbox/tenancy/api/views.py +++ b/netbox/tenancy/api/views.py @@ -3,8 +3,8 @@ from __future__ import unicode_literals from rest_framework.viewsets import ModelViewSet from extras.api.views import CustomFieldModelViewSet +from tenancy import filters from tenancy.models import Tenant, TenantGroup -from tenancy.filters import TenantFilter from utilities.api import WritableSerializerMixin from . import serializers @@ -16,6 +16,7 @@ from . import serializers class TenantGroupViewSet(ModelViewSet): queryset = TenantGroup.objects.all() serializer_class = serializers.TenantGroupSerializer + filter_class = filters.TenantGroupFilter # @@ -26,4 +27,4 @@ class TenantViewSet(WritableSerializerMixin, CustomFieldModelViewSet): queryset = Tenant.objects.select_related('group') serializer_class = serializers.TenantSerializer write_serializer_class = serializers.WritableTenantSerializer - filter_class = TenantFilter + filter_class = filters.TenantFilter diff --git a/netbox/tenancy/filters.py b/netbox/tenancy/filters.py index 4ded4f0c4..630e936e4 100644 --- a/netbox/tenancy/filters.py +++ b/netbox/tenancy/filters.py @@ -9,6 +9,13 @@ from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter from .models import Tenant, TenantGroup +class TenantGroupFilter(django_filters.FilterSet): + + class Meta: + model = TenantGroup + fields = ['name', 'slug'] + + class TenantFilter(CustomFieldFilterSet, django_filters.FilterSet): id__in = NumericInFilter(name='id', lookup_expr='in') q = django_filters.CharFilter( @@ -16,7 +23,6 @@ class TenantFilter(CustomFieldFilterSet, django_filters.FilterSet): label='Search', ) group_id = NullableModelMultipleChoiceFilter( - name='group', queryset=TenantGroup.objects.all(), label='Group (ID)', )