|
@@ -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
|
|
@@ -11,11 +12,28 @@ from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter
|
|
|
from .models import (
|
|
|
ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
|
|
|
DeviceBayTemplate, DeviceRole, DeviceType, STATUS_CHOICES, IFACE_FF_LAG, Interface, InterfaceConnection,
|
|
|
- InterfaceTemplate, Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort,
|
|
|
- PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, Region, Site, VIRTUAL_IFACE_TYPES,
|
|
|
+ InterfaceTemplate, Manufacturer, InventoryItem, NONCONNECTABLE_IFACE_TYPES, Platform, PowerOutlet,
|
|
|
+ PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RackReservation, RackRole, Region, Site,
|
|
|
+ VIRTUAL_IFACE_TYPES, WIRELESS_IFACE_TYPES,
|
|
|
)
|
|
|
|
|
|
|
|
|
+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(
|
|
@@ -23,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)',
|
|
@@ -47,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():
|
|
@@ -57,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:
|
|
@@ -68,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)',
|
|
|
)
|
|
@@ -81,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):
|
|
@@ -91,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)',
|
|
|
)
|
|
@@ -102,7 +124,6 @@ class RackFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
|
label='Site (slug)',
|
|
|
)
|
|
|
group_id = NullableModelMultipleChoiceFilter(
|
|
|
- name='group',
|
|
|
queryset=RackGroup.objects.all(),
|
|
|
label='Group (ID)',
|
|
|
)
|
|
@@ -113,7 +134,6 @@ class RackFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
|
label='Group',
|
|
|
)
|
|
|
tenant_id = NullableModelMultipleChoiceFilter(
|
|
|
- name='tenant',
|
|
|
queryset=Tenant.objects.all(),
|
|
|
label='Tenant (ID)',
|
|
|
)
|
|
@@ -124,7 +144,6 @@ class RackFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
|
label='Tenant (slug)',
|
|
|
)
|
|
|
role_id = NullableModelMultipleChoiceFilter(
|
|
|
- name='role',
|
|
|
queryset=RackRole.objects.all(),
|
|
|
label='Role (ID)',
|
|
|
)
|
|
@@ -137,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():
|
|
@@ -155,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(),
|
|
@@ -177,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():
|
|
@@ -198,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(
|
|
@@ -205,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)',
|
|
|
)
|
|
@@ -219,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):
|
|
@@ -235,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):
|
|
@@ -279,7 +307,7 @@ class InterfaceTemplateFilter(DeviceTypeComponentFilterSet):
|
|
|
|
|
|
class Meta:
|
|
|
model = InterfaceTemplate
|
|
|
- fields = ['name', 'form_factor']
|
|
|
+ fields = ['name', 'form_factor', 'mgmt_only']
|
|
|
|
|
|
|
|
|
class DeviceBayTemplateFilter(DeviceTypeComponentFilterSet):
|
|
@@ -289,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)',
|
|
|
)
|
|
@@ -332,7 +364,6 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
|
label='Role (slug)',
|
|
|
)
|
|
|
tenant_id = NullableModelMultipleChoiceFilter(
|
|
|
- name='tenant',
|
|
|
queryset=Tenant.objects.all(),
|
|
|
label='Tenant (ID)',
|
|
|
)
|
|
@@ -342,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',
|
|
@@ -364,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',
|
|
@@ -387,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
|
|
@@ -433,13 +475,11 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
|
|
|
|
|
|
|
|
|
class DeviceComponentFilterSet(django_filters.FilterSet):
|
|
|
- device_id = django_filters.ModelMultipleChoiceFilter(
|
|
|
- name='device',
|
|
|
+ device_id = django_filters.ModelChoiceFilter(
|
|
|
queryset=Device.objects.all(),
|
|
|
label='Device (ID)',
|
|
|
)
|
|
|
- device = django_filters.ModelMultipleChoiceFilter(
|
|
|
- name='device__name',
|
|
|
+ device = django_filters.ModelChoiceFilter(
|
|
|
queryset=Device.objects.all(),
|
|
|
to_field_name='name',
|
|
|
label='Device (name)',
|
|
@@ -474,7 +514,21 @@ class PowerOutletFilter(DeviceComponentFilterSet):
|
|
|
fields = ['name']
|
|
|
|
|
|
|
|
|
-class InterfaceFilter(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',
|
|
|
+ label='Device',
|
|
|
+ )
|
|
|
+ device_id = django_filters.NumberFilter(
|
|
|
+ method='filter_device',
|
|
|
+ name='pk',
|
|
|
+ label='Device (ID)',
|
|
|
+ )
|
|
|
type = django_filters.CharFilter(
|
|
|
method='filter_type',
|
|
|
label='Interface type',
|
|
@@ -491,17 +545,24 @@ class InterfaceFilter(DeviceComponentFilterSet):
|
|
|
|
|
|
class Meta:
|
|
|
model = Interface
|
|
|
- fields = ['name', 'form_factor']
|
|
|
+ fields = ['name', 'form_factor', 'enabled', 'mtu', 'mgmt_only']
|
|
|
+
|
|
|
+ def filter_device(self, queryset, name, value):
|
|
|
+ try:
|
|
|
+ device = Device.objects.select_related('device_type').get(**{name: value})
|
|
|
+ ordering = device.device_type.interface_ordering
|
|
|
+ return queryset.filter(device=device).order_naturally(ordering)
|
|
|
+ except Device.DoesNotExist:
|
|
|
+ return queryset.none()
|
|
|
|
|
|
def filter_type(self, queryset, name, value):
|
|
|
value = value.strip().lower()
|
|
|
- if value == 'physical':
|
|
|
- return queryset.exclude(form_factor__in=VIRTUAL_IFACE_TYPES)
|
|
|
- elif value == 'virtual':
|
|
|
- return queryset.filter(form_factor__in=VIRTUAL_IFACE_TYPES)
|
|
|
- elif value == 'lag':
|
|
|
- return queryset.filter(form_factor=IFACE_FF_LAG)
|
|
|
- return queryset
|
|
|
+ return {
|
|
|
+ 'physical': queryset.exclude(form_factor__in=NONCONNECTABLE_IFACE_TYPES),
|
|
|
+ 'virtual': queryset.filter(form_factor__in=VIRTUAL_IFACE_TYPES),
|
|
|
+ 'wireless': queryset.filter(form_factor__in=WIRELESS_IFACE_TYPES),
|
|
|
+ 'lag': queryset.filter(form_factor=IFACE_FF_LAG),
|
|
|
+ }.get(value, queryset.none())
|
|
|
|
|
|
def _mac_address(self, queryset, name, value):
|
|
|
value = value.strip()
|
|
@@ -521,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', 'asset_tag', 'discovered']
|
|
|
|
|
|
|
|
|
class ConsoleConnectionFilter(django_filters.FilterSet):
|