From 898ea00bbfed9f1540df1e6e480d6720f48a191c Mon Sep 17 00:00:00 2001 From: dansheps Date: Mon, 6 May 2019 13:43:24 -0500 Subject: [PATCH] Broke out filter and form for re-use --- CHANGELOG.md | 1 + netbox/dcim/filters.py | 11 ++--------- netbox/dcim/forms.py | 13 ++++--------- netbox/extras/filters.py | 13 +++++++++++++ netbox/extras/forms.py | 14 ++++++++++++++ 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 262c38c1a..c8c93383e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Enhancements +* [#3028](https://github.com/digitalocean/netbox/issues/3028) - Add filtering for local device config context * [#3150](https://github.com/digitalocean/netbox/issues/3150) - Fix formatting of cable length during cable trace * [#3085](https://github.com/digitalocean/netbox/issues/3085) - Catch all exceptions during export template rendering diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 0db4e5b86..60130890c 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -6,7 +6,7 @@ from django.db.models import Q from netaddr import EUI from netaddr.core import AddrFormatError -from extras.filters import CustomFieldFilterSet +from extras.filters import CustomFieldFilterSet, LocalConfigContextFilter from tenancy.models import Tenant from utilities.constants import COLOR_CHOICES from utilities.filters import ( @@ -450,7 +450,7 @@ class PlatformFilter(NameSlugSearchFilterSet): fields = ['name', 'slug'] -class DeviceFilter(CustomFieldFilterSet): +class DeviceFilter(LocalConfigContextFilter, CustomFieldFilterSet): id__in = NumericInFilter( field_name='id', lookup_expr='in' @@ -597,10 +597,6 @@ class DeviceFilter(CustomFieldFilterSet): method='_pass_through_ports', label='Has pass-through ports', ) - local_context_data = django_filters.BooleanFilter( - method='_local_context_data', - label='Has local config context data', - ) tag = TagFilter() class Meta: @@ -655,9 +651,6 @@ class DeviceFilter(CustomFieldFilterSet): def _interfaces(self, queryset, name, value): return queryset.exclude(interfaces__isnull=value) - def _local_context_data(self, queryset, name, value): - return queryset.exclude(local_context_data__isnull=value) - def _pass_through_ports(self, queryset, name, value): return queryset.exclude( frontports__isnull=value, diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index c0492637d..3d6e7b833 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -10,7 +10,9 @@ from mptt.forms import TreeNodeChoiceField from taggit.forms import TagField from timezone_field import TimeZoneFormField -from extras.forms import AddRemoveTagsForm, CustomFieldForm, CustomFieldBulkEditForm, CustomFieldFilterForm +from extras.forms import ( + AddRemoveTagsForm, CustomFieldForm, CustomFieldBulkEditForm, CustomFieldFilterForm, LocalConfigContextFilterForm +) from ipam.models import IPAddress, VLAN, VLANGroup from tenancy.forms import TenancyForm from tenancy.models import Tenant @@ -1643,7 +1645,7 @@ class DeviceBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditF ] -class DeviceFilterForm(BootstrapMixin, CustomFieldFilterForm): +class DeviceFilterForm(BootstrapMixin, LocalConfigContextFilterForm, CustomFieldFilterForm): model = Device q = forms.CharField( required=False, @@ -1800,13 +1802,6 @@ class DeviceFilterForm(BootstrapMixin, CustomFieldFilterForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) - local_context_data = forms.NullBooleanField( - required=False, - label='Has local config context data', - widget=StaticSelect2( - choices=BOOLEAN_WITH_BLANK_CHOICES - ) - ) # diff --git a/netbox/extras/filters.py b/netbox/extras/filters.py index d5457a5a6..c352a0b54 100644 --- a/netbox/extras/filters.py +++ b/netbox/extras/filters.py @@ -208,6 +208,19 @@ class ConfigContextFilter(django_filters.FilterSet): ) +# +# Filter for Local Config Context Data +# + +class LocalConfigContextFilter(django_filters.FilterSet): + local_context_data = django_filters.BooleanFilter( + method='_local_context_data', + label='Has local config context data', + ) + def _local_context_data(self, queryset, name, value): + return queryset.exclude(local_context_data__isnull=value) + + class ObjectChangeFilter(django_filters.FilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/extras/forms.py b/netbox/extras/forms.py index 54eee0c5c..83575a112 100644 --- a/netbox/extras/forms.py +++ b/netbox/extras/forms.py @@ -329,6 +329,20 @@ class ConfigContextFilterForm(BootstrapMixin, forms.Form): ) +# +# Filter form for local config context data +# + +class LocalConfigContextFilterForm(BootstrapMixin, forms.Form): + local_context_data = forms.NullBooleanField( + required=False, + label='Has local config context data', + widget=StaticSelect2( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) + + # # Image attachments #