diff --git a/netbox/dcim/filters.py b/netbox/dcim/filters.py index 0ac50bf14..e629880ba 100644 --- a/netbox/dcim/filters.py +++ b/netbox/dcim/filters.py @@ -148,6 +148,10 @@ class DeviceFilter(django_filters.FilterSet): to_field_name='slug', label='Platform (slug)', ) + status = django_filters.BooleanFilter( + name='status', + label='Status', + ) is_console_server = django_filters.BooleanFilter( name='device_type__is_console_server', label='Is a console server', @@ -164,7 +168,7 @@ class DeviceFilter(django_filters.FilterSet): class Meta: model = Device fields = ['q', 'name', 'site_id', 'site', 'rack_id', 'role_id', 'role', 'device_type_id', 'manufacturer_id', - 'manufacturer', 'model', 'platform_id', 'platform', 'is_console_server', 'is_pdu', + 'manufacturer', 'model', 'platform_id', 'platform', 'status', 'is_console_server', 'is_pdu', 'is_network_device'] def search(self, queryset, value): diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 37868a8f4..c5243d904 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -13,10 +13,10 @@ from .models import Site, Rack, RackGroup, Device, Manufacturer, DeviceType, Dev CONNECTION_STATUS_PLANNED, CONNECTION_STATUS_CONNECTED, IFACE_FF_VIRTUAL, STATUS_CHOICES -BULK_STATUS_CHOICES = [ +FORM_STATUS_CHOICES = [ ['', '---------'], ] -BULK_STATUS_CHOICES += STATUS_CHOICES +FORM_STATUS_CHOICES += STATUS_CHOICES DEVICE_BY_PK_RE = '{\d+\}' @@ -411,7 +411,7 @@ class DeviceBulkEditForm(forms.Form, BootstrapMixin): device_role = forms.ModelChoiceField(queryset=DeviceRole.objects.all(), required=False, label='Role') platform = forms.ModelChoiceField(queryset=Platform.objects.all(), required=False, label='Platform') platform_delete = forms.BooleanField(required=False, label='Set platform to "none"') - status = forms.ChoiceField(choices=BULK_STATUS_CHOICES, required=False, initial='', label='Status') + status = forms.ChoiceField(choices=FORM_STATUS_CHOICES, required=False, initial='', label='Status') serial = forms.CharField(max_length=50, required=False, label='Serial Number') ro_snmp = forms.CharField(max_length=50, required=False, label='SNMP (RO)') @@ -448,6 +448,7 @@ class DeviceFilterForm(forms.Form, BootstrapMixin): device_type_id = forms.MultipleChoiceField(required=False, choices=device_type_choices, label='Type', widget=forms.SelectMultiple(attrs={'size': 8})) platform = forms.MultipleChoiceField(required=False, choices=device_platform_choices) + status = forms.NullBooleanField(required=False, widget=forms.Select(choices=FORM_STATUS_CHOICES)) # diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 1901089fc..dffe3e221 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -12,6 +12,10 @@ RACKGROUP_EDIT_LINK = """ Edit """ +STATUS_ICON = """ + +""" + # # Sites @@ -220,13 +224,12 @@ class InterfaceTemplateBulkDeleteTable(InterfaceTemplateTable): fields = ('pk', 'name') - - # # Devices # class DeviceTable(tables.Table): + status = tables.TemplateColumn(template_code=STATUS_ICON, verbose_name='') name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name') site = tables.Column(accessor=Accessor('rack.site'), verbose_name='Site') rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack') @@ -236,7 +239,7 @@ class DeviceTable(tables.Table): class Meta: model = Device - fields = ('name', 'site', 'rack', 'device_role', 'device_type', 'primary_ip') + fields = ('name', 'status', 'site', 'rack', 'device_role', 'device_type', 'primary_ip') empty_text = "No devices were found." attrs = { 'class': 'table table-hover', @@ -248,7 +251,7 @@ class DeviceBulkEditTable(DeviceTable): class Meta(DeviceTable.Meta): model = None # django_tables2 bugfix - fields = ('pk', 'name', 'site', 'rack', 'device_role', 'device_type', 'primary_ip') + fields = ('pk', 'name', 'status', 'site', 'rack', 'device_role', 'device_type', 'primary_ip') class DeviceImportTable(tables.Table):