Browse Source

Closes #1203: Implemented query filters for all models

Jeremy Stretch 7 years ago
parent
commit
87e5687d03

+ 1 - 0
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
 
 
 #

+ 35 - 7
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()

+ 5 - 0
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
 
 
 #

+ 135 - 78
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,39 +317,43 @@ 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',
-    )
-    site_id = django_filters.ModelMultipleChoiceFilter(
-        name='site',
-        queryset=Site.objects.all(),
-        label='Site (ID)',
+    manufacturer_id = django_filters.ModelMultipleChoiceFilter(
+        name='device_type__manufacturer',
+        queryset=Manufacturer.objects.all(),
+        label='Manufacturer (ID)',
     )
-    site = django_filters.ModelMultipleChoiceFilter(
-        name='site__slug',
-        queryset=Site.objects.all(),
+    manufacturer = django_filters.ModelMultipleChoiceFilter(
+        name='device_type__manufacturer__slug',
+        queryset=Manufacturer.objects.all(),
         to_field_name='slug',
-        label='Site name (slug)',
-    )
-    rack_group_id = django_filters.ModelMultipleChoiceFilter(
-        name='rack__group',
-        queryset=RackGroup.objects.all(),
-        label='Rack group (ID)',
+        label='Manufacturer (slug)',
     )
-    rack_id = NullableModelMultipleChoiceFilter(
-        name='rack',
-        queryset=Rack.objects.all(),
-        label='Rack (ID)',
+    device_type_id = django_filters.ModelMultipleChoiceFilter(
+        queryset=DeviceType.objects.all(),
+        label='Device type (ID)',
     )
     role_id = django_filters.ModelMultipleChoiceFilter(
-        name='device_role',
+        name='device_role_id',
         queryset=DeviceRole.objects.all(),
         label='Role (ID)',
     )
@@ -333,7 +364,6 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
         label='Role (slug)',
     )
     tenant_id = NullableModelMultipleChoiceFilter(
-        name='tenant',
         queryset=Tenant.objects.all(),
         label='Tenant (ID)',
     )
@@ -343,21 +373,35 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
         to_field_name='slug',
         label='Tenant (slug)',
     )
-    device_type_id = django_filters.ModelMultipleChoiceFilter(
-        name='device_type',
-        queryset=DeviceType.objects.all(),
-        label='Device type (ID)',
+    platform_id = NullableModelMultipleChoiceFilter(
+        queryset=Platform.objects.all(),
+        label='Platform (ID)',
     )
-    manufacturer_id = django_filters.ModelMultipleChoiceFilter(
-        name='device_type__manufacturer',
-        queryset=Manufacturer.objects.all(),
-        label='Manufacturer (ID)',
+    platform = NullableModelMultipleChoiceFilter(
+        name='platform',
+        queryset=Platform.objects.all(),
+        to_field_name='slug',
+        label='Platform (slug)',
     )
-    manufacturer = django_filters.ModelMultipleChoiceFilter(
-        name='device_type__manufacturer__slug',
-        queryset=Manufacturer.objects.all(),
+    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='Manufacturer (slug)',
+        label='Site name (slug)',
+    )
+    rack_group_id = django_filters.ModelMultipleChoiceFilter(
+        name='rack__group',
+        queryset=RackGroup.objects.all(),
+        label='Rack group (ID)',
+    )
+    rack_id = NullableModelMultipleChoiceFilter(
+        name='rack',
+        queryset=Rack.objects.all(),
+        label='Rack (ID)',
     )
     model = django_filters.ModelMultipleChoiceFilter(
         name='device_type__slug',
@@ -365,16 +409,12 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
         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):

+ 10 - 9
netbox/ipam/api/views.py

@@ -21,15 +21,6 @@ class VRFViewSet(WritableSerializerMixin, CustomFieldModelViewSet):
 
 
 #
-# Roles
-#
-
-class RoleViewSet(ModelViewSet):
-    queryset = Role.objects.all()
-    serializer_class = serializers.RoleSerializer
-
-
-#
 # RIRs
 #
 
@@ -51,6 +42,16 @@ class AggregateViewSet(WritableSerializerMixin, CustomFieldModelViewSet):
 
 
 #
+# Roles
+#
+
+class RoleViewSet(ModelViewSet):
+    queryset = Role.objects.all()
+    serializer_class = serializers.RoleSerializer
+    filter_class = filters.RoleFilter
+
+
+#
 # Prefixes
 #
 

+ 12 - 21
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)',
     )

+ 1 - 0
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
 
 
 #

+ 7 - 2
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)',
     )

+ 3 - 2
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

+ 7 - 1
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)',
     )