From ededd3f4647cd2b8e60fafeddf3c89d3894eef0c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Sat, 6 Aug 2016 16:02:57 -0400 Subject: [PATCH] Fixes #253: Added ability to search by prefix to IP address filters --- netbox/ipam/filters.py | 14 ++++++++++++++ netbox/ipam/forms.py | 7 ++++++- netbox/utilities/forms.py | 3 ++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index de8a240bb..3a73caf84 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -191,6 +191,10 @@ class IPAddressFilter(django_filters.FilterSet): action='search', label='Search', ) + parent = django_filters.MethodFilter( + action='search_by_parent', + label='Parent prefix', + ) vrf = django_filters.MethodFilter( action='_vrf', label='VRF', @@ -238,6 +242,16 @@ class IPAddressFilter(django_filters.FilterSet): pass return queryset.filter(qs_filter) + def search_by_parent(self, queryset, value): + value = value.strip() + if not value: + return queryset + try: + query = str(IPNetwork(value).cidr) + return queryset.filter(address__net_contained_or_equal=query) + except AddrFormatError: + return queryset.none() + def _vrf(self, queryset, value): if str(value) == '': return queryset diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index 134c2933c..666b2ee81 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -293,7 +293,9 @@ def prefix_role_choices(): class PrefixFilterForm(forms.Form, BootstrapMixin): - parent = forms.CharField(required=False, label='Search Within') + parent = forms.CharField(required=False, label='Search Within', widget=forms.TextInput(attrs={ + 'placeholder': 'Network', + })) vrf = forms.MultipleChoiceField(required=False, choices=prefix_vrf_choices, label='VRF', widget=forms.SelectMultiple(attrs={'size': 6})) tenant = forms.MultipleChoiceField(required=False, choices=tenant_choices, label='Tenant', @@ -444,6 +446,9 @@ def ipaddress_vrf_choices(): class IPAddressFilterForm(forms.Form, BootstrapMixin): + parent = forms.CharField(required=False, label='Search Within', widget=forms.TextInput(attrs={ + 'placeholder': 'Prefix', + })) family = forms.ChoiceField(required=False, choices=ipaddress_family_choices, label='Address Family') vrf = forms.MultipleChoiceField(required=False, choices=ipaddress_vrf_choices, label='VRF', widget=forms.SelectMultiple(attrs={'size': 6})) diff --git a/netbox/utilities/forms.py b/netbox/utilities/forms.py index 836fe633f..979bdd0ad 100644 --- a/netbox/utilities/forms.py +++ b/netbox/utilities/forms.py @@ -231,7 +231,8 @@ class BootstrapMixin(forms.BaseForm): field.widget.attrs['class'] = 'form-control' if field.required: field.widget.attrs['required'] = 'required' - field.widget.attrs['placeholder'] = field.label + if 'placeholder' not in field.widget.attrs: + field.widget.attrs['placeholder'] = field.label class ConfirmationForm(forms.Form, BootstrapMixin):