Closes #1557: Added filtering for virtual machine interfaces

This commit is contained in:
Jeremy Stretch 2017-10-09 13:59:53 -04:00
parent b41b4fc584
commit b734599f40
2 changed files with 37 additions and 1 deletions

View File

@ -46,3 +46,4 @@ class InterfaceViewSet(WritableSerializerMixin, ModelViewSet):
queryset = Interface.objects.filter(virtual_machine__isnull=False).select_related('virtual_machine') queryset = Interface.objects.filter(virtual_machine__isnull=False).select_related('virtual_machine')
serializer_class = serializers.InterfaceSerializer serializer_class = serializers.InterfaceSerializer
write_serializer_class = serializers.WritableInterfaceSerializer write_serializer_class = serializers.WritableInterfaceSerializer
filter_class = filters.InterfaceFilter

View File

@ -1,9 +1,12 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import django_filters import django_filters
from netaddr import EUI
from netaddr.core import AddrFormatError
from django.db.models import Q 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 extras.filters import CustomFieldFilterSet
from tenancy.models import Tenant from tenancy.models import Tenant
from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter from utilities.filters import NullableModelMultipleChoiceFilter, NumericInFilter
@ -126,3 +129,35 @@ class VirtualMachineFilter(CustomFieldFilterSet):
Q(name__icontains=value) | Q(name__icontains=value) |
Q(comments__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()