John Anderson 7 лет назад
Родитель
Сommit
bc49979243
3 измененных файлов с 30 добавлено и 3 удалено
  1. 13 0
      netbox/dcim/filters.py
  2. 1 0
      netbox/netbox/forms.py
  3. 16 3
      netbox/netbox/views.py

+ 13 - 0
netbox/dcim/filters.py

@@ -112,6 +112,10 @@ class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet):
 
 
 
 
 class RackGroupFilter(django_filters.FilterSet):
 class RackGroupFilter(django_filters.FilterSet):
+    q = django_filters.CharFilter(
+        method='search',
+        label='Search',
+    )
     site_id = django_filters.ModelMultipleChoiceFilter(
     site_id = django_filters.ModelMultipleChoiceFilter(
         queryset=Site.objects.all(),
         queryset=Site.objects.all(),
         label='Site (ID)',
         label='Site (ID)',
@@ -127,6 +131,15 @@ class RackGroupFilter(django_filters.FilterSet):
         model = RackGroup
         model = RackGroup
         fields = ['site_id', 'name', 'slug']
         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):
 class RackRoleFilter(django_filters.FilterSet):
 
 

+ 1 - 0
netbox/netbox/forms.py

@@ -13,6 +13,7 @@ OBJ_TYPE_CHOICES = (
     ('DCIM', (
     ('DCIM', (
         ('site', 'Sites'),
         ('site', 'Sites'),
         ('rack', 'Racks'),
         ('rack', 'Racks'),
+        ('rackgroup', 'Rack Groups'),
         ('devicetype', 'Device types'),
         ('devicetype', 'Device types'),
         ('device', 'Devices'),
         ('device', 'Devices'),
         ('virtualchassis', 'Virtual Chassis'),
         ('virtualchassis', 'Virtual Chassis'),

+ 16 - 3
netbox/netbox/views.py

@@ -12,9 +12,16 @@ from rest_framework.views import APIView
 from circuits.filters import CircuitFilter, ProviderFilter
 from circuits.filters import CircuitFilter, ProviderFilter
 from circuits.models import Circuit, Provider
 from circuits.models import Circuit, Provider
 from circuits.tables import CircuitTable, ProviderTable
 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 extras.models import ObjectChange, ReportResult, TopologyMap
 from ipam.filters import AggregateFilter, IPAddressFilter, PrefixFilter, VLANFilter, VRFFilter
 from ipam.filters import AggregateFilter, IPAddressFilter, PrefixFilter, VLANFilter, VRFFilter
 from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF
 from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF
@@ -58,6 +65,12 @@ SEARCH_TYPES = OrderedDict((
         'table': RackTable,
         'table': RackTable,
         'url': 'dcim:rack_list',
         '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', {
     ('devicetype', {
         'queryset': DeviceType.objects.select_related('manufacturer').annotate(instance_count=Count('instances')),
         'queryset': DeviceType.objects.select_related('manufacturer').annotate(instance_count=Count('instances')),
         'filter': DeviceTypeFilter,
         'filter': DeviceTypeFilter,