From 5a75e305b1d5fbc0dd956c6ffee622120aff9ca8 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Fri, 23 Aug 2024 17:24:54 -0400 Subject: [PATCH] Add device_status as filtering option (and configurable column) for InventoryItemTable --- netbox/dcim/filtersets.py | 6 +++++- netbox/dcim/forms/filtersets.py | 7 ++++++- netbox/dcim/models/device_components.py | 3 +++ netbox/dcim/tables/devices.py | 4 ++++ 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 6d386f3cf..e5fd6c929 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1795,6 +1795,10 @@ class InventoryItemFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): to_field_name='slug', label=_('Role (slug)'), ) + device_status = django_filters.MultipleChoiceFilter( + choices=DeviceStatusChoices, + field_name='device__status', + ) component_type = ContentTypeFilter() component_id = MultiValueNumberFilter() serial = MultiValueCharFilter( @@ -1803,7 +1807,7 @@ class InventoryItemFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): class Meta: model = InventoryItem - fields = ('id', 'name', 'label', 'part_id', 'asset_tag', 'description', 'discovered') + fields = ('id', 'name', 'label', 'part_id', 'asset_tag', 'description', 'discovered', 'device_status') def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 97f9eb422..144382e03 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -1434,7 +1434,7 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): name=_('Attributes') ), FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), - FieldSet('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id', name=_('Device')), + FieldSet('device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', name=_('Device')), ) role_id = DynamicModelMultipleChoiceField( queryset=InventoryItemRole.objects.all(), @@ -1461,6 +1461,11 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + device_status = forms.MultipleChoiceField( + choices=DeviceStatusChoices, + required=False, + label=_('Device Status'), + ) tag = TagFilterField(model) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 9438b741f..bd8fbe8ba 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1265,6 +1265,9 @@ class InventoryItem(MPTTModel, ComponentModel, TrackingModelMixin): def get_absolute_url(self): return reverse('dcim:inventoryitem', kwargs={'pk': self.pk}) + def get_device_status_color(self): + return self.device.get_status_color() + def clean(self): super().clean() diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index d6435ed4b..5ccc61dce 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -927,6 +927,10 @@ class InventoryItemTable(DeviceComponentTable): tags = columns.TagColumn( url_name='dcim:inventoryitem_list' ) + device_status = columns.ChoiceFieldColumn( + accessor=tables.A('device__status'), + verbose_name=_('Device Status'), + ) cable = None # Override DeviceComponentTable class Meta(NetBoxTable.Meta):