From b734599f4001daf2643d15322411299d7f53a79b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 9 Oct 2017 13:59:53 -0400 Subject: [PATCH] Closes #1557: Added filtering for virtual machine interfaces --- netbox/virtualization/api/views.py | 1 + netbox/virtualization/filters.py | 37 +++++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 315e1404e..bae8d5f90 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -46,3 +46,4 @@ class InterfaceViewSet(WritableSerializerMixin, ModelViewSet): queryset = Interface.objects.filter(virtual_machine__isnull=False).select_related('virtual_machine') serializer_class = serializers.InterfaceSerializer write_serializer_class = serializers.WritableInterfaceSerializer + filter_class = filters.InterfaceFilter diff --git a/netbox/virtualization/filters.py b/netbox/virtualization/filters.py index 31a002009..870ac85c6 100644 --- a/netbox/virtualization/filters.py +++ b/netbox/virtualization/filters.py @@ -1,9 +1,12 @@ from __future__ import unicode_literals import django_filters +from netaddr import EUI +from netaddr.core import AddrFormatError + from django.db.models import Q -from dcim.models import DeviceRole, Platform, Site +from dcim.models import DeviceRole, Interface, Platform, Site from extras.filters import CustomFieldFilterSet from tenancy.models import Tenant from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter @@ -126,3 +129,35 @@ class VirtualMachineFilter(CustomFieldFilterSet): Q(name__icontains=value) | Q(comments__icontains=value) ) + + +class InterfaceFilter(django_filters.FilterSet): + virtual_machine_id = django_filters.ModelMultipleChoiceFilter( + name='virtual_machine', + queryset=VirtualMachine.objects.all(), + label='Virtual machine (ID)', + ) + virtual_machine = django_filters.ModelMultipleChoiceFilter( + name='virtual_machine__name', + queryset=VirtualMachine.objects.all(), + to_field_name='name', + label='Virtual machine', + ) + mac_address = django_filters.CharFilter( + method='_mac_address', + label='MAC address', + ) + + class Meta: + model = Interface + fields = ['name', 'enabled', 'mtu'] + + def _mac_address(self, queryset, name, value): + value = value.strip() + if not value: + return queryset + try: + mac = EUI(value.strip()) + return queryset.filter(mac_address=mac) + except AddrFormatError: + return queryset.none()