1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

cleanup component filters and UI filter forms for device and device type - #2583

This commit is contained in:
John Anderson
2018-11-15 00:42:01 -05:00
parent 3c0181ef35
commit fd9b2f2fda
4 changed files with 113 additions and 90 deletions

View File

@ -299,7 +299,7 @@ class ManufacturerFilter(django_filters.FilterSet):
fields = ['name', 'slug'] fields = ['name', 'slug']
class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet): class DeviceTypeFilter(CustomFieldFilterSet):
id__in = NumericInFilter( id__in = NumericInFilter(
field_name='id', field_name='id',
lookup_expr='in' lookup_expr='in'
@ -318,27 +318,27 @@ class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet):
to_field_name='slug', to_field_name='slug',
label='Manufacturer (slug)', label='Manufacturer (slug)',
) )
console_ports = django_filters.CharFilter( console_ports = django_filters.BooleanFilter(
method='_console_ports', method='_console_ports',
label='Has console ports', label='Has console ports',
) )
console_server_ports = django_filters.CharFilter( console_server_ports = django_filters.BooleanFilter(
method='_console_server_ports', method='_console_server_ports',
label='Has console server ports', label='Has console server ports',
) )
power_ports = django_filters.CharFilter( power_ports = django_filters.BooleanFilter(
method='_power_ports', method='_power_ports',
label='Has power ports', label='Has power ports',
) )
power_outlets = django_filters.CharFilter( power_outlets = django_filters.BooleanFilter(
method='_power_outlets', method='_power_outlets',
label='Has power outlets', label='Has power outlets',
) )
interfaces = django_filters.CharFilter( interfaces = django_filters.BooleanFilter(
method='_interfaces', method='_interfaces',
label='Has interfaces', label='Has interfaces',
) )
pass_through_ports = django_filters.CharFilter( pass_through_ports = django_filters.BooleanFilter(
method='_pass_through_ports', method='_pass_through_ports',
label='Has pass-through ports', label='Has pass-through ports',
) )
@ -361,30 +361,24 @@ class DeviceTypeFilter(CustomFieldFilterSet, django_filters.FilterSet):
) )
def _console_ports(self, queryset, name, value): def _console_ports(self, queryset, name, value):
value = value.strip() return queryset.exclude(consoleport_templates__isnull=value)
return queryset.exclude(consoleport_templates__isnull=bool(value))
def _console_server_ports(self, queryset, name, value): def _console_server_ports(self, queryset, name, value):
value = value.strip() return queryset.exclude(consoleserverport_templates__isnull=value)
return queryset.exclude(consoleserverport_templates__isnull=bool(value))
def _power_ports(self, queryset, name, value): def _power_ports(self, queryset, name, value):
value = value.strip() return queryset.exclude(powerport_templates__isnull=value)
return queryset.exclude(powerport_templates__isnull=bool(value))
def _power_outlets(self, queryset, name, value): def _power_outlets(self, queryset, name, value):
value = value.strip() return queryset.exclude(poweroutlet_templates__isnull=value)
return queryset.exclude(poweroutlet_templates__isnull=bool(value))
def _interfaces(self, queryset, name, value): def _interfaces(self, queryset, name, value):
value = value.strip() return queryset.exclude(interface_templates__isnull=value)
return queryset.exclude(interface_templates__isnull=bool(value))
def _pass_through_ports(self, queryset, name, value): def _pass_through_ports(self, queryset, name, value):
value = value.strip()
return queryset.exclude( return queryset.exclude(
frontport_templates__isnull=bool(value), frontport_templates__isnull=value,
rearport_templates__isnull=bool(value) rearport_templates__isnull=value
) )
@ -477,7 +471,7 @@ class PlatformFilter(django_filters.FilterSet):
fields = ['name', 'slug'] fields = ['name', 'slug']
class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet): class DeviceFilter(CustomFieldFilterSet):
id__in = NumericInFilter( id__in = NumericInFilter(
field_name='id', field_name='id',
lookup_expr='in' lookup_expr='in'
@ -582,30 +576,6 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
field_name='device_type__is_full_depth', field_name='device_type__is_full_depth',
label='Is full depth', label='Is full depth',
) )
console_ports = django_filters.CharFilter(
method='_console_ports',
label='Has console ports',
)
console_server_ports = django_filters.CharFilter(
method='_console_server_ports',
label='Has console server ports',
)
power_ports = django_filters.CharFilter(
method='_power_ports',
label='Has power ports',
)
power_outlets = django_filters.CharFilter(
method='_power_outlets',
label='Has power outlets',
)
interfaces = django_filters.CharFilter(
method='_interfaces',
label='Has interfaces',
)
pass_through_ports = django_filters.CharFilter(
method='_pass_through_ports',
label='Has pass-through ports',
)
mac_address = django_filters.CharFilter( mac_address = django_filters.CharFilter(
method='_mac_address', method='_mac_address',
label='MAC address', label='MAC address',
@ -619,6 +589,30 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
queryset=VirtualChassis.objects.all(), queryset=VirtualChassis.objects.all(),
label='Virtual chassis (ID)', label='Virtual chassis (ID)',
) )
console_ports = django_filters.BooleanFilter(
method='_console_ports',
label='Has console ports',
)
console_server_ports = django_filters.BooleanFilter(
method='_console_server_ports',
label='Has console server ports',
)
power_ports = django_filters.BooleanFilter(
method='_power_ports',
label='Has power ports',
)
power_outlets = django_filters.BooleanFilter(
method='_power_outlets',
label='Has power outlets',
)
interfaces = django_filters.BooleanFilter(
method='_interfaces',
label='Has interfaces',
)
pass_through_ports = django_filters.BooleanFilter(
method='_pass_through_ports',
label='Has pass-through ports',
)
tag = TagFilter() tag = TagFilter()
class Meta: class Meta:
@ -669,30 +663,24 @@ class DeviceFilter(CustomFieldFilterSet, django_filters.FilterSet):
) )
def _console_ports(self, queryset, name, value): def _console_ports(self, queryset, name, value):
value = value.strip() return queryset.exclude(consoleports__isnull=value)
return queryset.exclude(consoleports__isnull=bool(value))
def _console_server_ports(self, queryset, name, value): def _console_server_ports(self, queryset, name, value):
value = value.strip() return queryset.exclude(consoleserverports__isnull=value)
return queryset.exclude(consoleserverports__isnull=bool(value))
def _power_ports(self, queryset, name, value): def _power_ports(self, queryset, name, value):
value = value.strip() return queryset.exclude(powerports__isnull=value)
return queryset.exclude(powerports__isnull=bool(value))
def _power_outlets(self, queryset, name, value): def _power_outlets(self, queryset, name, value):
value = value.strip() return queryset.exclude(poweroutlets_isnull=value)
return queryset.exclude(poweroutlets__isnull=bool(value))
def _interfaces(self, queryset, name, value): def _interfaces(self, queryset, name, value):
value = value.strip() return queryset.exclude(interfaces__isnull=value)
return queryset.exclude(interfaces__isnull=bool(value))
def _pass_through_ports(self, queryset, name, value): def _pass_through_ports(self, queryset, name, value):
value = value.strip()
return queryset.exclude( return queryset.exclude(
frontports__isnull=bool(value), frontports__isnull=value,
rearports__isnull=bool(value) rearports__isnull=value
) )

View File

@ -19,7 +19,7 @@ from utilities.forms import (
BulkEditNullBooleanSelect, ChainedFieldsMixin, ChainedModelChoiceField, ColorSelect, CommentField, ComponentForm, BulkEditNullBooleanSelect, ChainedFieldsMixin, ChainedModelChoiceField, ColorSelect, CommentField, ComponentForm,
ConfirmationForm, ContentTypeSelect, CSVChoiceField, ExpandableNameField, FilterChoiceField, ConfirmationForm, ContentTypeSelect, CSVChoiceField, ExpandableNameField, FilterChoiceField,
FilterTreeNodeMultipleChoiceField, FlexibleModelChoiceField, JSONField, Livesearch, SelectWithPK, SmallTextarea, FilterTreeNodeMultipleChoiceField, FlexibleModelChoiceField, JSONField, Livesearch, SelectWithPK, SmallTextarea,
SlugField, COLOR_CHOICES, SlugField, BOOLEAN_WITH_BLANK_CHOICES, COLOR_CHOICES,
) )
from virtualization.models import Cluster from virtualization.models import Cluster
@ -650,35 +650,41 @@ class DeviceTypeFilterForm(BootstrapMixin, CustomFieldFilterForm):
queryset=Manufacturer.objects.annotate(filter_count=Count('device_types')), queryset=Manufacturer.objects.annotate(filter_count=Count('device_types')),
to_field_name='slug' to_field_name='slug'
) )
console_ports = forms.BooleanField(
required=False,
label='Has console ports'
)
console_server_ports = forms.BooleanField(
required=False,
label='Has console server ports'
)
power_ports = forms.BooleanField(
required=False,
label='Has power ports'
)
power_outlets = forms.BooleanField(
required=False,
label='Has power outlets'
)
interfaces = forms.BooleanField(
required=False,
label='Has interfaces'
)
pass_through_ports = forms.BooleanField(
required=False,
label='Has pass-through ports'
)
subdevice_role = forms.NullBooleanField( subdevice_role = forms.NullBooleanField(
required=False, required=False,
label='Subdevice role', label='Subdevice role',
widget=forms.Select(choices=add_blank_choice(SUBDEVICE_ROLE_CHOICES)) widget=forms.Select(choices=add_blank_choice(SUBDEVICE_ROLE_CHOICES))
) )
console_ports = forms.NullBooleanField(
required=False,
label='Has console ports',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
console_server_ports = forms.NullBooleanField(
required=False,
label='Has console server ports',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
power_ports = forms.NullBooleanField(
required=False,
label='Has power ports',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
power_outlets = forms.NullBooleanField(
required=False,
label='Has power outlets',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
interfaces = forms.NullBooleanField(
required=False,
label='Has interfaces',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
pass_through_ports = forms.NullBooleanField(
required=False,
label='Has pass-through ports',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
# #
@ -1316,11 +1322,37 @@ class DeviceFilterForm(BootstrapMixin, CustomFieldFilterForm):
has_primary_ip = forms.NullBooleanField( has_primary_ip = forms.NullBooleanField(
required=False, required=False,
label='Has a primary IP', label='Has a primary IP',
widget=forms.Select(choices=[ widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
('', '---------'), )
('True', 'Yes'), console_ports = forms.NullBooleanField(
('False', 'No'), required=False,
]) label='Has console ports',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
console_server_ports = forms.NullBooleanField(
required=False,
label='Has console server ports',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
power_ports = forms.NullBooleanField(
required=False,
label='Has power ports',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
power_outlets = forms.NullBooleanField(
required=False,
label='Has power outlets',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
interfaces = forms.NullBooleanField(
required=False,
label='Has interfaces',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
)
pass_through_ports = forms.NullBooleanField(
required=False,
label='Has pass-through ports',
widget=forms.Select(choices=BOOLEAN_WITH_BLANK_CHOICES)
) )

View File

@ -110,9 +110,7 @@ $(document).ready(function() {
var conditional = attr.name.split("data-url-conditional-append-")[1].split("__"); var conditional = attr.name.split("data-url-conditional-append-")[1].split("__");
var field = $("#id_" + conditional[0]); var field = $("#id_" + conditional[0]);
var field_value = conditional[1]; var field_value = conditional[1];
console.log($('option:selected', field).attr('api-value'));
if ($('option:selected', field).attr('api-value') === field_value){ if ($('option:selected', field).attr('api-value') === field_value){
console.log(attr.value);
rendered_url = rendered_url + attr.value; rendered_url = rendered_url + attr.value;
} }
} }

View File

@ -42,6 +42,11 @@ NUMERIC_EXPANSION_PATTERN = r'\[((?:\d+[?:,-])+\d+)\]'
ALPHANUMERIC_EXPANSION_PATTERN = r'\[((?:[a-zA-Z0-9]+[?:,-])+[a-zA-Z0-9]+)\]' ALPHANUMERIC_EXPANSION_PATTERN = r'\[((?:[a-zA-Z0-9]+[?:,-])+[a-zA-Z0-9]+)\]'
IP4_EXPANSION_PATTERN = r'\[((?:[0-9]{1,3}[?:,-])+[0-9]{1,3})\]' IP4_EXPANSION_PATTERN = r'\[((?:[0-9]{1,3}[?:,-])+[0-9]{1,3})\]'
IP6_EXPANSION_PATTERN = r'\[((?:[0-9a-f]{1,4}[?:,-])+[0-9a-f]{1,4})\]' IP6_EXPANSION_PATTERN = r'\[((?:[0-9a-f]{1,4}[?:,-])+[0-9a-f]{1,4})\]'
BOOLEAN_WITH_BLANK_CHOICES = (
('', '---------'),
('True', 'Yes'),
('False', 'No'),
)
def parse_numeric_range(string, base=10): def parse_numeric_range(string, base=10):