From bc4997924393dff18fca4adb7bc6da781956b506 Mon Sep 17 00:00:00 2001 From: John Anderson Date: Fri, 17 Aug 2018 18:37:48 -0400 Subject: [PATCH] added rack group search #2254 --- netbox/dcim/filters.py | 13 +++++++++++++ netbox/netbox/forms.py | 1 + netbox/netbox/views.py | 19 ++++++++++++++++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 18a0039e6..c81af4478 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -112,6 +112,10 @@ class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet): class RackGroupFilter(django_filters.FilterSet): + q = django_filters.CharFilter( + method='search', + label='Search', + ) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), label='Site (ID)', @@ -127,6 +131,15 @@ class RackGroupFilter(django_filters.FilterSet): model = RackGroup fields = ['site_id', 'name', 'slug'] + def search(self, queryset, name, value): + if not value.strip(): + return queryset + qs_filter = ( + Q(name__icontains=value) | + Q(slug__icontains=value) + ) + return queryset.filter(qs_filter) + class RackRoleFilter(django_filters.FilterSet): diff --git a/netbox/netbox/forms.py b/netbox/netbox/forms.py index 5611f49f9..434377024 100644 --- a/netbox/netbox/forms.py +++ b/netbox/netbox/forms.py @@ -13,6 +13,7 @@ OBJ_TYPE_CHOICES = ( ('DCIM', ( ('site', 'Sites'), ('rack', 'Racks'), + ('rackgroup', 'Rack Groups'), ('devicetype', 'Device types'), ('device', 'Devices'), ('virtualchassis', 'Virtual Chassis'), diff --git a/netbox/netbox/views.py b/netbox/netbox/views.py index 1e3433016..c6814c068 100644 --- a/netbox/netbox/views.py +++ b/netbox/netbox/views.py @@ -12,9 +12,16 @@ from rest_framework.views import APIView from circuits.filters import CircuitFilter, ProviderFilter from circuits.models import Circuit, Provider from circuits.tables import CircuitTable, ProviderTable -from dcim.filters import DeviceFilter, DeviceTypeFilter, RackFilter, SiteFilter, VirtualChassisFilter -from dcim.models import ConsolePort, Device, DeviceType, InterfaceConnection, PowerPort, Rack, Site, VirtualChassis -from dcim.tables import DeviceDetailTable, DeviceTypeTable, RackTable, SiteTable, VirtualChassisTable +from dcim.filters import ( + DeviceFilter, DeviceTypeFilter, RackFilter, RackGroupFilter, SiteFilter, VirtualChassisFilter +) +from dcim.models import ( + ConsolePort, Device, DeviceType, InterfaceConnection, PowerPort, Rack, RackGroup, Site, + VirtualChassis +) +from dcim.tables import ( + DeviceDetailTable, DeviceTypeTable, RackTable, RackGroupTable, SiteTable, VirtualChassisTable +) from extras.models import ObjectChange, ReportResult, TopologyMap from ipam.filters import AggregateFilter, IPAddressFilter, PrefixFilter, VLANFilter, VRFFilter from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF @@ -58,6 +65,12 @@ SEARCH_TYPES = OrderedDict(( 'table': RackTable, 'url': 'dcim:rack_list', }), + ('rackgroup', { + 'queryset': RackGroup.objects.select_related('site').annotate(rack_count=Count('racks')), + 'filter': RackGroupFilter, + 'table': RackGroupTable, + 'url': 'dcim:rackgroup_list', + }), ('devicetype', { 'queryset': DeviceType.objects.select_related('manufacturer').annotate(instance_count=Count('instances')), 'filter': DeviceTypeFilter,