Broke out filter and form for re-use

This commit is contained in:
dansheps 2019-05-06 13:43:24 -05:00
parent c274b4a729
commit 898ea00bbf
5 changed files with 34 additions and 18 deletions

View File

@ -2,6 +2,7 @@
## Enhancements ## 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 * [#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 * [#3085](https://github.com/digitalocean/netbox/issues/3085) - Catch all exceptions during export template rendering

View File

@ -6,7 +6,7 @@ from django.db.models import Q
from netaddr import EUI from netaddr import EUI
from netaddr.core import AddrFormatError from netaddr.core import AddrFormatError
from extras.filters import CustomFieldFilterSet from extras.filters import CustomFieldFilterSet, LocalConfigContextFilter
from tenancy.models import Tenant from tenancy.models import Tenant
from utilities.constants import COLOR_CHOICES from utilities.constants import COLOR_CHOICES
from utilities.filters import ( from utilities.filters import (
@ -450,7 +450,7 @@ class PlatformFilter(NameSlugSearchFilterSet):
fields = ['name', 'slug'] fields = ['name', 'slug']
class DeviceFilter(CustomFieldFilterSet): class DeviceFilter(LocalConfigContextFilter, CustomFieldFilterSet):
id__in = NumericInFilter( id__in = NumericInFilter(
field_name='id', field_name='id',
lookup_expr='in' lookup_expr='in'
@ -597,10 +597,6 @@ class DeviceFilter(CustomFieldFilterSet):
method='_pass_through_ports', method='_pass_through_ports',
label='Has 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() tag = TagFilter()
class Meta: class Meta:
@ -655,9 +651,6 @@ class DeviceFilter(CustomFieldFilterSet):
def _interfaces(self, queryset, name, value): def _interfaces(self, queryset, name, value):
return queryset.exclude(interfaces__isnull=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): def _pass_through_ports(self, queryset, name, value):
return queryset.exclude( return queryset.exclude(
frontports__isnull=value, frontports__isnull=value,

View File

@ -10,7 +10,9 @@ from mptt.forms import TreeNodeChoiceField
from taggit.forms import TagField from taggit.forms import TagField
from timezone_field import TimeZoneFormField 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 ipam.models import IPAddress, VLAN, VLANGroup
from tenancy.forms import TenancyForm from tenancy.forms import TenancyForm
from tenancy.models import Tenant 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 model = Device
q = forms.CharField( q = forms.CharField(
required=False, required=False,
@ -1800,13 +1802,6 @@ class DeviceFilterForm(BootstrapMixin, CustomFieldFilterForm):
choices=BOOLEAN_WITH_BLANK_CHOICES 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
)
)
# #

View File

@ -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): class ObjectChangeFilter(django_filters.FilterSet):
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',

View File

@ -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 # Image attachments
# #