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:
@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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):
|
||||||
|
Reference in New Issue
Block a user