Remove NullableCharFieldFilter; add missing filter fields

This commit is contained in:
Jeremy Stretch 2019-05-07 13:55:48 -04:00
parent 3d616baf75
commit 205adeb2e9
7 changed files with 60 additions and 49 deletions

View File

@ -47,7 +47,7 @@ class CircuitTypeFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = CircuitType model = CircuitType
fields = ['name', 'slug'] fields = ['id', 'name', 'slug']
class CircuitFilter(CustomFieldFilterSet): class CircuitFilter(CustomFieldFilterSet):

View File

@ -8,9 +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 ( from utilities.filters import NameSlugSearchFilterSet, TagFilter, TreeNodeMultipleChoiceFilter
NameSlugSearchFilterSet, NullableCharFieldFilter, TagFilter, TreeNodeMultipleChoiceFilter
)
from virtualization.models import Cluster from virtualization.models import Cluster
from .constants import * from .constants import *
from .models import ( from .models import (
@ -36,7 +34,7 @@ class RegionFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = Region model = Region
fields = ['name', 'slug'] fields = ['id', 'name', 'slug']
class SiteFilter(CustomFieldFilterSet): class SiteFilter(CustomFieldFilterSet):
@ -73,7 +71,10 @@ class SiteFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = Site model = Site
fields = ['id', 'name', 'slug', 'facility', 'asn', 'contact_name', 'contact_phone', 'contact_email'] fields = [
'id', 'name', 'slug', 'facility', 'asn', 'latitude', 'longitude', 'contact_name', 'contact_phone',
'contact_email',
]
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -110,14 +111,14 @@ class RackGroupFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = RackGroup model = RackGroup
fields = ['site_id', 'name', 'slug'] fields = ['id', 'name', 'slug']
class RackRoleFilter(NameSlugSearchFilterSet): class RackRoleFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = RackRole model = RackRole
fields = ['name', 'slug', 'color'] fields = ['id', 'name', 'slug', 'color']
class RackFilter(CustomFieldFilterSet): class RackFilter(CustomFieldFilterSet):
@ -125,7 +126,6 @@ class RackFilter(CustomFieldFilterSet):
method='search', method='search',
label='Search', label='Search',
) )
facility_id = NullableCharFieldFilter()
site_id = django_filters.ModelMultipleChoiceFilter( site_id = django_filters.ModelMultipleChoiceFilter(
queryset=Site.objects.all(), queryset=Site.objects.all(),
label='Site (ID)', label='Site (ID)',
@ -170,14 +170,13 @@ class RackFilter(CustomFieldFilterSet):
to_field_name='slug', to_field_name='slug',
label='Role (slug)', label='Role (slug)',
) )
asset_tag = NullableCharFieldFilter()
tag = TagFilter() tag = TagFilter()
class Meta: class Meta:
model = Rack model = Rack
fields = [ fields = [
'id', 'name', 'serial', 'asset_tag', 'type', 'width', 'u_height', 'desc_units', 'outer_width', 'id', 'name', 'facility_id', 'serial', 'asset_tag', 'type', 'width', 'u_height', 'desc_units',
'outer_depth', 'outer_unit', 'outer_width', 'outer_depth', 'outer_unit',
] ]
def search(self, queryset, name, value): def search(self, queryset, name, value):
@ -263,7 +262,7 @@ class ManufacturerFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = Manufacturer model = Manufacturer
fields = ['name', 'slug'] fields = ['id', 'name', 'slug']
class DeviceTypeFilter(CustomFieldFilterSet): class DeviceTypeFilter(CustomFieldFilterSet):
@ -357,63 +356,63 @@ class ConsolePortTemplateFilter(DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = ConsolePortTemplate model = ConsolePortTemplate
fields = ['name'] fields = ['id', 'name']
class ConsoleServerPortTemplateFilter(DeviceTypeComponentFilterSet): class ConsoleServerPortTemplateFilter(DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = ConsoleServerPortTemplate model = ConsoleServerPortTemplate
fields = ['name'] fields = ['id', 'name']
class PowerPortTemplateFilter(DeviceTypeComponentFilterSet): class PowerPortTemplateFilter(DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = PowerPortTemplate model = PowerPortTemplate
fields = ['name'] fields = ['id', 'name', 'maximum_draw', 'allocated_draw']
class PowerOutletTemplateFilter(DeviceTypeComponentFilterSet): class PowerOutletTemplateFilter(DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = PowerOutletTemplate model = PowerOutletTemplate
fields = ['name'] fields = ['id', 'name', 'feed_leg']
class InterfaceTemplateFilter(DeviceTypeComponentFilterSet): class InterfaceTemplateFilter(DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = InterfaceTemplate model = InterfaceTemplate
fields = ['name', 'type', 'mgmt_only'] fields = ['id', 'name', 'type', 'mgmt_only']
class FrontPortTemplateFilter(DeviceTypeComponentFilterSet): class FrontPortTemplateFilter(DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = FrontPortTemplate model = FrontPortTemplate
fields = ['name', 'type'] fields = ['id', 'name', 'type']
class RearPortTemplateFilter(DeviceTypeComponentFilterSet): class RearPortTemplateFilter(DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = RearPortTemplate model = RearPortTemplate
fields = ['name', 'type'] fields = ['id', 'name', 'type', 'positions']
class DeviceBayTemplateFilter(DeviceTypeComponentFilterSet): class DeviceBayTemplateFilter(DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = DeviceBayTemplate model = DeviceBayTemplate
fields = ['name'] fields = ['id', 'name']
class DeviceRoleFilter(NameSlugSearchFilterSet): class DeviceRoleFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = DeviceRole model = DeviceRole
fields = ['name', 'slug', 'color', 'vm_role'] fields = ['id', 'name', 'slug', 'color', 'vm_role']
class PlatformFilter(NameSlugSearchFilterSet): class PlatformFilter(NameSlugSearchFilterSet):
@ -431,7 +430,7 @@ class PlatformFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = Platform model = Platform
fields = ['name', 'slug'] fields = ['id', 'name', 'slug', 'napalm_driver']
class DeviceFilter(CustomFieldFilterSet): class DeviceFilter(CustomFieldFilterSet):
@ -485,8 +484,6 @@ class DeviceFilter(CustomFieldFilterSet):
to_field_name='slug', to_field_name='slug',
label='Platform (slug)', label='Platform (slug)',
) )
name = NullableCharFieldFilter()
asset_tag = NullableCharFieldFilter()
region_id = TreeNodeMultipleChoiceFilter( region_id = TreeNodeMultipleChoiceFilter(
queryset=Region.objects.all(), queryset=Region.objects.all(),
field_name='site__region__in', field_name='site__region__in',
@ -581,7 +578,7 @@ class DeviceFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = Device model = Device
fields = ['id', 'serial', 'face'] fields = ['id', 'name', 'serial', 'asset_tag', 'face', 'vc_position', 'vc_priority']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -672,7 +669,7 @@ class ConsolePortFilter(DeviceComponentFilterSet):
class Meta: class Meta:
model = ConsolePort model = ConsolePort
fields = ['name', 'description', 'connection_status'] fields = ['id', 'name', 'description', 'connection_status']
class ConsoleServerPortFilter(DeviceComponentFilterSet): class ConsoleServerPortFilter(DeviceComponentFilterSet):
@ -684,7 +681,7 @@ class ConsoleServerPortFilter(DeviceComponentFilterSet):
class Meta: class Meta:
model = ConsoleServerPort model = ConsoleServerPort
fields = ['name', 'description', 'connection_status'] fields = ['id', 'name', 'description', 'connection_status']
class PowerPortFilter(DeviceComponentFilterSet): class PowerPortFilter(DeviceComponentFilterSet):
@ -696,7 +693,7 @@ class PowerPortFilter(DeviceComponentFilterSet):
class Meta: class Meta:
model = PowerPort model = PowerPort
fields = ['name', 'description', 'connection_status'] fields = ['id', 'name', 'maximum_draw', 'allocated_draw', 'description', 'connection_status']
class PowerOutletFilter(DeviceComponentFilterSet): class PowerOutletFilter(DeviceComponentFilterSet):
@ -708,7 +705,7 @@ class PowerOutletFilter(DeviceComponentFilterSet):
class Meta: class Meta:
model = PowerOutlet model = PowerOutlet
fields = ['name', 'description', 'connection_status'] fields = ['id', 'name', 'feed_leg', 'description', 'connection_status']
class InterfaceFilter(django_filters.FilterSet): class InterfaceFilter(django_filters.FilterSet):
@ -763,7 +760,7 @@ class InterfaceFilter(django_filters.FilterSet):
class Meta: class Meta:
model = Interface model = Interface
fields = ['name', 'connection_status', 'type', 'enabled', 'mtu', 'mgmt_only', 'description'] fields = ['id', 'name', 'connection_status', 'type', 'enabled', 'mtu', 'mgmt_only', 'mode', 'description']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -827,7 +824,7 @@ class FrontPortFilter(DeviceComponentFilterSet):
class Meta: class Meta:
model = FrontPort model = FrontPort
fields = ['name', 'type', 'description'] fields = ['id', 'name', 'type', 'description']
class RearPortFilter(DeviceComponentFilterSet): class RearPortFilter(DeviceComponentFilterSet):
@ -839,14 +836,14 @@ class RearPortFilter(DeviceComponentFilterSet):
class Meta: class Meta:
model = RearPort model = RearPort
fields = ['name', 'type', 'description'] fields = ['id', 'name', 'type', 'positions', 'description']
class DeviceBayFilter(DeviceComponentFilterSet): class DeviceBayFilter(DeviceComponentFilterSet):
class Meta: class Meta:
model = DeviceBay model = DeviceBay
fields = ['name', 'description'] fields = ['id', 'name', 'description']
class InventoryItemFilter(DeviceComponentFilterSet): class InventoryItemFilter(DeviceComponentFilterSet):
@ -877,11 +874,10 @@ class InventoryItemFilter(DeviceComponentFilterSet):
to_field_name='slug', to_field_name='slug',
label='Manufacturer (slug)', label='Manufacturer (slug)',
) )
asset_tag = NullableCharFieldFilter()
class Meta: class Meta:
model = InventoryItem model = InventoryItem
fields = ['name', 'part_id', 'serial', 'asset_tag', 'discovered'] fields = ['id', 'name', 'part_id', 'serial', 'asset_tag', 'discovered']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -927,7 +923,7 @@ class VirtualChassisFilter(django_filters.FilterSet):
class Meta: class Meta:
model = VirtualChassis model = VirtualChassis
fields = ['domain'] fields = ['id', 'domain']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -947,6 +943,9 @@ class CableFilter(django_filters.FilterSet):
type = django_filters.MultipleChoiceFilter( type = django_filters.MultipleChoiceFilter(
choices=CABLE_TYPE_CHOICES choices=CABLE_TYPE_CHOICES
) )
status = django_filters.MultipleChoiceFilter(
choices=CONNECTION_STATUS_CHOICES
)
color = django_filters.MultipleChoiceFilter( color = django_filters.MultipleChoiceFilter(
choices=COLOR_CHOICES choices=COLOR_CHOICES
) )
@ -961,7 +960,7 @@ class CableFilter(django_filters.FilterSet):
class Meta: class Meta:
model = Cable model = Cable
fields = ['type', 'status', 'color', 'length', 'length_unit'] fields = ['id', 'label', 'length', 'length_unit']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -56,6 +56,10 @@ class AggregateFilter(CustomFieldFilterSet):
method='search', method='search',
label='Search', label='Search',
) )
prefix = django_filters.CharFilter(
method='filter_prefix',
label='Prefix',
)
rir_id = django_filters.ModelMultipleChoiceFilter( rir_id = django_filters.ModelMultipleChoiceFilter(
queryset=RIR.objects.all(), queryset=RIR.objects.all(),
label='RIR (ID)', label='RIR (ID)',
@ -83,6 +87,15 @@ class AggregateFilter(CustomFieldFilterSet):
pass pass
return queryset.filter(qs_filter) return queryset.filter(qs_filter)
def filter_prefix(self, queryset, name, value):
if not value.strip():
return queryset
try:
query = str(netaddr.IPNetwork(value).cidr)
return queryset.filter(prefix=query)
except ValidationError:
return queryset.none()
class RoleFilter(NameSlugSearchFilterSet): class RoleFilter(NameSlugSearchFilterSet):
q = django_filters.CharFilter( q = django_filters.CharFilter(
@ -92,7 +105,7 @@ class RoleFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = Role model = Role
fields = ['name', 'slug'] fields = ['id', 'name', 'slug']
class PrefixFilter(CustomFieldFilterSet): class PrefixFilter(CustomFieldFilterSet):
@ -372,7 +385,7 @@ class VLANGroupFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = VLANGroup model = VLANGroup
fields = ['name', 'slug'] fields = ['id', 'name', 'slug']
class VLANFilter(CustomFieldFilterSet): class VLANFilter(CustomFieldFilterSet):
@ -470,7 +483,7 @@ class ServiceFilter(django_filters.FilterSet):
class Meta: class Meta:
model = Service model = Service
fields = ['name', 'protocol', 'port'] fields = ['id', 'name', 'protocol', 'port']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():

View File

@ -11,7 +11,7 @@ class SecretRoleFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = SecretRole model = SecretRole
fields = ['name', 'slug'] fields = ['id', 'name', 'slug']
class SecretFilter(CustomFieldFilterSet): class SecretFilter(CustomFieldFilterSet):

View File

@ -10,7 +10,7 @@ class TenantGroupFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = TenantGroup model = TenantGroup
fields = ['name', 'slug'] fields = ['id', 'name', 'slug']
class TenantFilter(CustomFieldFilterSet): class TenantFilter(CustomFieldFilterSet):

View File

@ -1,5 +1,4 @@
import django_filters import django_filters
from django.core.exceptions import ObjectDoesNotExist
from django.db.models import Q from django.db.models import Q
from netaddr import EUI from netaddr import EUI
from netaddr.core import AddrFormatError from netaddr.core import AddrFormatError
@ -16,14 +15,14 @@ class ClusterTypeFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = ClusterType model = ClusterType
fields = ['name', 'slug'] fields = ['id', 'name', 'slug']
class ClusterGroupFilter(NameSlugSearchFilterSet): class ClusterGroupFilter(NameSlugSearchFilterSet):
class Meta: class Meta:
model = ClusterGroup model = ClusterGroup
fields = ['name', 'slug'] fields = ['id', 'name', 'slug']
class ClusterFilter(CustomFieldFilterSet): class ClusterFilter(CustomFieldFilterSet):
@ -167,7 +166,7 @@ class VirtualMachineFilter(CustomFieldFilterSet):
class Meta: class Meta:
model = VirtualMachine model = VirtualMachine
fields = ['id', 'name', 'cluster'] fields = ['id', 'name', 'cluster', 'vcpus', 'memory', 'disk']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
@ -201,7 +200,7 @@ class InterfaceFilter(django_filters.FilterSet):
class Meta: class Meta:
model = Interface model = Interface
fields = ['name', 'enabled', 'mtu'] fields = ['id', 'name', 'enabled', 'mtu']
def _mac_address(self, queryset, name, value): def _mac_address(self, queryset, name, value):
value = value.strip() value = value.strip()

View File

@ -464,7 +464,7 @@ class VirtualMachineTest(APITestCase):
def test_config_context_included_by_default_in_list_view(self): def test_config_context_included_by_default_in_list_view(self):
url = reverse('virtualization-api:virtualmachine-list') url = reverse('virtualization-api:virtualmachine-list')
url = '{}?id__in={}'.format(url, self.virtualmachine_with_context_data.pk) url = '{}?id={}'.format(url, self.virtualmachine_with_context_data.pk)
response = self.client.get(url, **self.header) response = self.client.get(url, **self.header)
self.assertEqual(response.data['results'][0].get('config_context', {}).get('A'), 1) self.assertEqual(response.data['results'][0].get('config_context', {}).get('A'), 1)