|
|
@@ -7,7 +7,7 @@ from netaddr.core import AddrFormatError
|
|
|
from dcim.models import DeviceRole, Interface, Platform, Region, Site
|
|
|
from extras.filters import CustomFieldFilterSet
|
|
|
from tenancy.models import Tenant
|
|
|
-from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter
|
|
|
+from utilities.filters import NameSlugSearchFilterSet, NumericInFilter, TagFilter, TreeNodeMultipleChoiceFilter
|
|
|
from .constants import VM_STATUS_CHOICES
|
|
|
from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine
|
|
|
|
|
|
@@ -119,14 +119,15 @@ class VirtualMachineFilter(CustomFieldFilterSet):
|
|
|
queryset=Cluster.objects.all(),
|
|
|
label='Cluster (ID)',
|
|
|
)
|
|
|
- region_id = django_filters.NumberFilter(
|
|
|
- method='filter_region',
|
|
|
- field_name='pk',
|
|
|
+ region_id = TreeNodeMultipleChoiceFilter(
|
|
|
+ queryset=Region.objects.all(),
|
|
|
+ field_name='cluster__site__region__in',
|
|
|
label='Region (ID)',
|
|
|
)
|
|
|
- region = django_filters.CharFilter(
|
|
|
- method='filter_region',
|
|
|
- field_name='slug',
|
|
|
+ region = TreeNodeMultipleChoiceFilter(
|
|
|
+ queryset=Region.objects.all(),
|
|
|
+ field_name='cluster__site__region__in',
|
|
|
+ to_field_name='slug',
|
|
|
label='Region (slug)',
|
|
|
)
|
|
|
site_id = django_filters.ModelMultipleChoiceFilter(
|
|
|
@@ -184,16 +185,6 @@ class VirtualMachineFilter(CustomFieldFilterSet):
|
|
|
Q(comments__icontains=value)
|
|
|
)
|
|
|
|
|
|
- def filter_region(self, queryset, name, value):
|
|
|
- try:
|
|
|
- region = Region.objects.get(**{name: value})
|
|
|
- except ObjectDoesNotExist:
|
|
|
- return queryset.none()
|
|
|
- return queryset.filter(
|
|
|
- Q(cluster__site__region=region) |
|
|
|
- Q(cluster__site__region__in=region.get_descendants())
|
|
|
- )
|
|
|
-
|
|
|
|
|
|
class InterfaceFilter(django_filters.FilterSet):
|
|
|
q = django_filters.CharFilter(
|