Browse Source

Extend IP address device filter to match virtual chassis members

Jeremy Stretch 7 years ago
parent
commit
c43487b741
1 changed files with 16 additions and 9 deletions
  1. 16 9
      netbox/ipam/filters.py

+ 16 - 9
netbox/ipam/filters.py

@@ -257,17 +257,16 @@ class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet):
         to_field_name='slug',
         label='Tenant (slug)',
     )
-    device_id = django_filters.ModelMultipleChoiceFilter(
-        name='interface__device',
-        queryset=Device.objects.all(),
+    device = django_filters.CharFilter(
+        method='filter_device',
+        name='name',
+        label='Device',
+    )
+    device_id = django_filters.NumberFilter(
+        method='filter_device',
+        name='pk',
         label='Device (ID)',
     )
-    device = django_filters.ModelMultipleChoiceFilter(
-        name='interface__device__name',
-        queryset=Device.objects.all(),
-        to_field_name='name',
-        label='Device (name)',
-    )
     virtual_machine_id = django_filters.ModelMultipleChoiceFilter(
         name='interface__virtual_machine',
         queryset=VirtualMachine.objects.all(),
@@ -319,6 +318,14 @@ class IPAddressFilter(CustomFieldFilterSet, django_filters.FilterSet):
             return queryset
         return queryset.filter(address__net_mask_length=value)
 
+    def filter_device(self, queryset, name, value):
+        try:
+            device = Device.objects.select_related('device_type').get(**{name: value})
+            vc_interface_ids = [i['id'] for i in device.vc_interfaces.values('id')]
+            return queryset.filter(interface_id__in=vc_interface_ids)
+        except Device.DoesNotExist:
+            return queryset.none()
+
 
 class VLANGroupFilter(django_filters.FilterSet):
     site_id = django_filters.ModelMultipleChoiceFilter(