diff --git a/CHANGELOG.md b/CHANGELOG.md index c51306372..a043e5722 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ v2.6.1 (FUTURE) ## Enhancements +* [#3154](https://github.com/digitalocean/netbox/issues/3154) - Add `virtual_chassis_member` device filter * [#3277](https://github.com/digitalocean/netbox/issues/3277) - Add cable trace buttons for console and power ports * [#3281](https://github.com/digitalocean/netbox/issues/3281) - Hide custom links which render as empty text diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index f1c02e713..6312fd0d5 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -527,6 +527,10 @@ class DeviceFilter(TenancyFilterSet, CustomFieldFilterSet): queryset=VirtualChassis.objects.all(), label='Virtual chassis (ID)', ) + virtual_chassis_member = django_filters.BooleanFilter( + method='_virtual_chassis_member', + label='Is a virtual chassis member' + ) console_ports = django_filters.BooleanFilter( method='_console_ports', label='Has console ports', @@ -590,6 +594,9 @@ class DeviceFilter(TenancyFilterSet, CustomFieldFilterSet): Q(primary_ip6__isnull=False) ) + def _virtual_chassis_member(self, queryset, name, value): + return queryset.exclude(virtual_chassis__isnull=value) + def _console_ports(self, queryset, name, value): return queryset.exclude(consoleports__isnull=value) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 357a8def3..06e1b35b1 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -1750,6 +1750,13 @@ class DeviceFilterForm(BootstrapMixin, TenancyFilterForm, CustomFieldFilterForm) choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + virtual_chassis_member = forms.NullBooleanField( + required=False, + label='Virtual chassis member', + widget=StaticSelect2( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) console_ports = forms.NullBooleanField( required=False, label='Has console ports',