From aed25fea3ad5092b92c51c275d72c0de4c06b583 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 12 Nov 2020 10:27:44 -0500 Subject: [PATCH] #259: Add present_in_vrf filters for IPAddress --- netbox/ipam/filters.py | 19 +++++++++++++++++++ netbox/ipam/forms.py | 11 ++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index be00d5383..efdcced1d 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -386,6 +386,17 @@ class IPAddressFilterSet(BaseFilterSet, TenancyFilterSet, CustomFieldFilterSet, to_field_name='rd', label='VRF (RD)', ) + present_in_vrf_id = django_filters.ModelChoiceFilter( + queryset=VRF.objects.all(), + method='filter_present_in_vrf', + label='VRF' + ) + present_in_vrf = django_filters.ModelChoiceFilter( + queryset=VRF.objects.all(), + method='filter_present_in_vrf', + to_field_name='rd', + label='VRF (RD)', + ) device = MultiValueCharFilter( method='filter_device', field_name='name', @@ -476,6 +487,14 @@ class IPAddressFilterSet(BaseFilterSet, TenancyFilterSet, CustomFieldFilterSet, return queryset return queryset.filter(address__net_mask_length=value) + def filter_present_in_vrf(self, queryset, name, vrf): + if vrf is None: + return queryset.none + return queryset.filter( + Q(vrf=vrf) | + Q(vrf__export_targets__in=vrf.import_targets.all()) + ) + def filter_device(self, queryset, name, value): devices = Device.objects.filter(**{'{}__in'.format(name): value}) if not devices.exists(): diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index dac231202..1434002ea 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -998,8 +998,8 @@ class IPAddressAssignForm(BootstrapMixin, forms.Form): class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm): model = IPAddress field_order = [ - 'q', 'parent', 'family', 'mask_length', 'vrf_id', 'status', 'role', 'assigned_to_interface', 'tenant_group', - 'tenant', + 'q', 'parent', 'family', 'mask_length', 'vrf_id', 'present_in_vrf_id', 'status', 'role', + 'assigned_to_interface', 'tenant_group', 'tenant', ] q = forms.CharField( required=False, @@ -1029,9 +1029,14 @@ class IPAddressFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterFo vrf_id = DynamicModelMultipleChoiceField( queryset=VRF.objects.all(), required=False, - label='VRF', + label='Assigned VRF', null_option='Global' ) + present_in_vrf_id = DynamicModelChoiceField( + queryset=VRF.objects.all(), + required=False, + label='Present in VRF' + ) status = forms.MultipleChoiceField( choices=IPAddressStatusChoices, required=False,