diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 4ab1c8f1a..0d5455aa0 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -684,11 +684,46 @@ class InventoryItemFilter(DeviceComponentFilterSet): class VirtualChassisFilter(django_filters.FilterSet): + q = django_filters.CharFilter( + method='search', + label='Search', + ) + site_id = django_filters.ModelMultipleChoiceFilter( + name='master__site', + queryset=Site.objects.all(), + label='Site (ID)', + ) + site = django_filters.ModelMultipleChoiceFilter( + name='master__site__slug', + queryset=Site.objects.all(), + to_field_name='slug', + label='Site name (slug)', + ) + tenant_id = django_filters.ModelMultipleChoiceFilter( + name='master__tenant', + queryset=Tenant.objects.all(), + label='Tenant (ID)', + ) + tenant = django_filters.ModelMultipleChoiceFilter( + name='master__tenant__slug', + queryset=Tenant.objects.all(), + to_field_name='slug', + label='Tenant (slug)', + ) class Meta: model = VirtualChassis fields = ['domain'] + def search(self, queryset, name, value): + if not value.strip(): + return queryset + qs_filter = ( + Q(master__name__icontains=value) | + Q(domain__icontains=value) + ) + return queryset.filter(qs_filter) + class ConsoleConnectionFilter(django_filters.FilterSet): site = django_filters.CharFilter( diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 9c195caa3..d5065c75a 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -2368,3 +2368,17 @@ class VCMemberSelectForm(BootstrapMixin, ChainedFieldsMixin, forms.Form): if device.virtual_chassis is not None: raise forms.ValidationError("Device {} is already assigned to a virtual chassis.".format(device)) return device + + +class VirtualChassisFilterForm(BootstrapMixin, CustomFieldFilterForm): + model = VirtualChassis + q = forms.CharField(required=False, label='Search') + site = FilterChoiceField( + queryset=Site.objects.all(), + to_field_name='slug', + ) + tenant = FilterChoiceField( + queryset=Tenant.objects.all(), + to_field_name='slug', + null_label='-- None --', + ) diff --git a/netbox/dcim/migrations/0055_virtualchassis_ordering.py b/netbox/dcim/migrations/0055_virtualchassis_ordering.py new file mode 100644 index 000000000..51cda0ff6 --- /dev/null +++ b/netbox/dcim/migrations/0055_virtualchassis_ordering.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.9 on 2018-02-21 14:41 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0054_site_status_timezone_description'), + ] + + operations = [ + migrations.AlterModelOptions( + name='virtualchassis', + options={'ordering': ['master'], 'verbose_name_plural': 'virtual chassis'}, + ), + migrations.AlterField( + model_name='virtualchassis', + name='master', + field=models.OneToOneField(on_delete=django.db.models.deletion.PROTECT, related_name='vc_master_for', to='dcim.Device'), + ), + ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 7a315c5b9..cfae0d6d2 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -1645,6 +1645,10 @@ class VirtualChassis(models.Model): blank=True ) + class Meta: + ordering = ['master'] + verbose_name_plural = 'virtual chassis' + def __str__(self): return str(self.master) if hasattr(self, 'master') else 'New Virtual Chassis' diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index a4d18a8b7..02c87c122 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2069,6 +2069,8 @@ class InventoryItemBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class VirtualChassisListView(ObjectListView): queryset = VirtualChassis.objects.annotate(member_count=Count('members')) table = tables.VirtualChassisTable + filter = filters.VirtualChassisFilter + filter_form = forms.VirtualChassisFilterForm template_name = 'dcim/virtualchassis_list.html' diff --git a/netbox/templates/dcim/virtualchassis_list.html b/netbox/templates/dcim/virtualchassis_list.html index f6fe1045c..e8d4f3366 100644 --- a/netbox/templates/dcim/virtualchassis_list.html +++ b/netbox/templates/dcim/virtualchassis_list.html @@ -4,8 +4,11 @@ {% block content %}

{% block title %}Virtual Chassis{% endblock %}

-
+
{% include 'utilities/obj_table.html' %}
+
+ {% include 'inc/search_panel.html' %} +
{% endblock %} diff --git a/netbox/templates/inc/nav_menu.html b/netbox/templates/inc/nav_menu.html index 1857afcc2..a85647993 100644 --- a/netbox/templates/inc/nav_menu.html +++ b/netbox/templates/inc/nav_menu.html @@ -104,7 +104,7 @@ -