|
|
@@ -5,7 +5,7 @@ from django.db.models import Q
|
|
|
|
|
|
from extras.filters import CustomFieldFilterSet
|
|
|
from tenancy.models import Tenant
|
|
|
-from utilities.filters import NullableModelMultipleChoiceFilter
|
|
|
+from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter
|
|
|
from .models import (
|
|
|
ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, IFACE_FF_LAG, Interface, InterfaceConnection,
|
|
|
Manufacturer, Platform, PowerOutlet, PowerPort, Rack, RackGroup, RackReservation, RackRole, Region, Site,
|
|
|
@@ -14,6 +14,7 @@ from .models import (
|
|
|
|
|
|
|
|
|
class SiteFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
|
+ id__in = NumericInFilter(name='id', lookup_expr='in')
|
|
|
q = django_filters.CharFilter(
|
|
|
method='search',
|
|
|
label='Search',
|
|
|
@@ -81,6 +82,7 @@ class RackGroupFilter(django_filters.FilterSet):
|
|
|
|
|
|
|
|
|
class RackFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
|
+ id__in = NumericInFilter(name='id', lookup_expr='in')
|
|
|
q = django_filters.CharFilter(
|
|
|
method='search',
|
|
|
label='Search',
|
|
|
@@ -157,6 +159,7 @@ class RackReservationFilter(django_filters.FilterSet):
|
|
|
|
|
|
|
|
|
class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
|
+ id__in = NumericInFilter(name='id', lookup_expr='in')
|
|
|
q = django_filters.CharFilter(
|
|
|
method='search',
|
|
|
label='Search',
|
|
|
@@ -191,6 +194,7 @@ class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
|
|
|
|
|
|
|
class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
|
+ id__in = NumericInFilter(name='id', lookup_expr='in')
|
|
|
q = django_filters.CharFilter(
|
|
|
method='search',
|
|
|
label='Search',
|
|
|
@@ -405,6 +409,10 @@ class InterfaceFilter(django_filters.FilterSet):
|
|
|
method='filter_type',
|
|
|
label='Interface type',
|
|
|
)
|
|
|
+ mac_address = django_filters.CharFilter(
|
|
|
+ method='_mac_address',
|
|
|
+ label='MAC address',
|
|
|
+ )
|
|
|
|
|
|
class Meta:
|
|
|
model = Interface
|
|
|
@@ -420,48 +428,73 @@ class InterfaceFilter(django_filters.FilterSet):
|
|
|
return queryset.filter(form_factor=IFACE_FF_LAG)
|
|
|
return queryset
|
|
|
|
|
|
+ def _mac_address(self, queryset, name, value):
|
|
|
+ value = value.strip()
|
|
|
+ if not value:
|
|
|
+ return queryset
|
|
|
+ try:
|
|
|
+ return queryset.filter(mac_address=value)
|
|
|
+ except AddrFormatError:
|
|
|
+ return queryset.none()
|
|
|
+
|
|
|
|
|
|
class ConsoleConnectionFilter(django_filters.FilterSet):
|
|
|
site = django_filters.CharFilter(
|
|
|
method='filter_site',
|
|
|
label='Site (slug)',
|
|
|
)
|
|
|
-
|
|
|
- class Meta:
|
|
|
- model = ConsoleServerPort
|
|
|
- fields = []
|
|
|
+ device = django_filters.CharFilter(
|
|
|
+ method='filter_device',
|
|
|
+ label='Device',
|
|
|
+ )
|
|
|
|
|
|
def filter_site(self, queryset, name, value):
|
|
|
if not value.strip():
|
|
|
return queryset
|
|
|
return queryset.filter(cs_port__device__site__slug=value)
|
|
|
|
|
|
+ def filter_device(self, queryset, name, value):
|
|
|
+ if not value.strip():
|
|
|
+ return queryset
|
|
|
+ return queryset.filter(
|
|
|
+ Q(device__name__icontains=value) |
|
|
|
+ Q(cs_port__device__name__icontains=value)
|
|
|
+ )
|
|
|
+
|
|
|
|
|
|
class PowerConnectionFilter(django_filters.FilterSet):
|
|
|
site = django_filters.CharFilter(
|
|
|
method='filter_site',
|
|
|
label='Site (slug)',
|
|
|
)
|
|
|
-
|
|
|
- class Meta:
|
|
|
- model = PowerOutlet
|
|
|
- fields = []
|
|
|
+ device = django_filters.CharFilter(
|
|
|
+ method='filter_device',
|
|
|
+ label='Device',
|
|
|
+ )
|
|
|
|
|
|
def filter_site(self, queryset, name, value):
|
|
|
if not value.strip():
|
|
|
return queryset
|
|
|
return queryset.filter(power_outlet__device__site__slug=value)
|
|
|
|
|
|
+ def filter_device(self, queryset, name, value):
|
|
|
+ if not value.strip():
|
|
|
+ return queryset
|
|
|
+ return queryset.filter(
|
|
|
+ Q(device__name__icontains=value) |
|
|
|
+ Q(power_outlet__device__name__icontains=value)
|
|
|
+ )
|
|
|
+
|
|
|
|
|
|
class InterfaceConnectionFilter(django_filters.FilterSet):
|
|
|
site = django_filters.CharFilter(
|
|
|
method='filter_site',
|
|
|
label='Site (slug)',
|
|
|
)
|
|
|
-
|
|
|
- class Meta:
|
|
|
- model = InterfaceConnection
|
|
|
- fields = []
|
|
|
+ device = django_filters.CharFilter(
|
|
|
+ method='filter_device',
|
|
|
+ label='Device',
|
|
|
+ )
|
|
|
|
|
|
def filter_site(self, queryset, name, value):
|
|
|
if not value.strip():
|
|
|
@@ -470,3 +503,11 @@ class InterfaceConnectionFilter(django_filters.FilterSet):
|
|
|
Q(interface_a__device__site__slug=value) |
|
|
|
Q(interface_b__device__site__slug=value)
|
|
|
)
|
|
|
+
|
|
|
+ def filter_device(self, queryset, name, value):
|
|
|
+ if not value.strip():
|
|
|
+ return queryset
|
|
|
+ return queryset.filter(
|
|
|
+ Q(interface_a__device__name__icontains=value) |
|
|
|
+ Q(interface_b__device__name__icontains=value)
|
|
|
+ )
|