Add InterfaceListFilter, add device as CharField instead of ModelChoiceField, and add the filter to InterfaceListView

This commit is contained in:
Joseph Kennedy 2017-08-17 22:10:45 -04:00
parent 421779cb56
commit bb7fc02654
3 changed files with 53 additions and 1 deletions

View File

@ -577,6 +577,57 @@ class InterfaceFilter(django_filters.FilterSet):
return queryset.none()
class InterfaceListFilter(django_filters.FilterSet):
device_id = django_filters.NumberFilter(
method='filter_device',
name='pk',
label='Device (ID)',
)
type = django_filters.CharFilter(
method='filter_type',
label='Interface type',
)
lag_id = django_filters.ModelMultipleChoiceFilter(
name='lag',
queryset=Interface.objects.all(),
label='LAG interface (ID)',
)
mac_address = django_filters.CharFilter(
method='_mac_address',
label='MAC address',
)
class Meta:
model = Interface
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()
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()
if not value:
return queryset
try:
return queryset.filter(mac_address=value)
except AddrFormatError:
return queryset.none()
class DeviceBayFilter(DeviceComponentFilterSet):
class Meta:

View File

@ -1574,6 +1574,7 @@ class InterfaceFilterForm(BootstrapMixin, forms.Form):
class InterfaceListFilterForm(BootstrapMixin, forms.Form):
site = forms.ModelChoiceField(required=False, queryset=Site.objects.all(), to_field_name='slug')
#device = forms.ModelChoiceField(required=False, queryset=Device.objects.all(), to_field_name='slug')
device = forms.CharField(required=False, label='Device name')
enabled = forms.ChoiceField(choices=add_blank_choice(IFACE_ENABLED_CHOICES), required=False)
role = FilterChoiceField(
queryset=DeviceRole.objects.annotate(filter_count=Count('devices')),

View File

@ -1557,7 +1557,7 @@ class InterfaceBulkImportView(PermissionRequiredMixin, BulkImportView):
class InterfaceListView(ObjectListView):
queryset = Interface.objects.all()
filter = filters.InterfaceFilter
filter = filters.InterfaceListFilter
filter_form = forms.InterfaceListFilterForm
table = tables.InterfaceListTable
template_name = 'dcim/interface_list.html'