diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index 23a7bdfa5..3c1fe06dd 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -102,9 +102,18 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): method='search', label='Search', ) + # TODO: Deprecate in v2.3.0 parent = django_filters.CharFilter( - method='search_by_parent', - label='Parent prefix', + method='search_within_include', + label='Parent prefix (deprecated)', + ) + within = django_filters.CharFilter( + method='search_within', + label='Within prefix', + ) + within_include = django_filters.CharFilter( + method='search_within_include', + label='Within and including prefix', ) mask_length = django_filters.NumberFilter( method='filter_mask_length', @@ -177,7 +186,17 @@ class PrefixFilter(CustomFieldFilterSet, django_filters.FilterSet): pass return queryset.filter(qs_filter) - def search_by_parent(self, queryset, name, value): + def search_within(self, queryset, name, value): + value = value.strip() + if not value: + return queryset + try: + query = str(IPNetwork(value).cidr) + return queryset.filter(prefix__net_contained=query) + except (AddrFormatError, ValueError): + return queryset.none() + + def search_within_include(self, queryset, name, value): value = value.strip() if not value: return queryset diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index 5ed405c8d..839324702 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -362,7 +362,7 @@ def prefix_status_choices(): class PrefixFilterForm(BootstrapMixin, CustomFieldFilterForm): model = Prefix q = forms.CharField(required=False, label='Search') - parent = forms.CharField(required=False, label='Parent prefix', widget=forms.TextInput(attrs={ + within_include = forms.CharField(required=False, label='Search within', widget=forms.TextInput(attrs={ 'placeholder': 'Prefix', })) family = forms.ChoiceField(required=False, choices=IP_FAMILY_CHOICES, label='Address family')