From 5a75e305b1d5fbc0dd956c6ffee622120aff9ca8 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Fri, 23 Aug 2024 17:24:54 -0400 Subject: [PATCH 1/4] 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 6d386f3cf47..e5fd6c929d9 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 97f9eb422ea..144382e0349 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 9438b741f58..bd8fbe8bac5 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1265,6 +1265,9 @@ class Meta: 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 d6435ed4bf6..5ccc61dce8c 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): From cd7c7f4143eb87f0d6133b9cd4adb9e67400f4e5 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Mon, 26 Aug 2024 21:21:55 -0400 Subject: [PATCH 2/4] Add device_status to common superclasses for Device Components, and refactor ChoiceFieldColumn to support a "color" callable allowing get_FOO_color behavior to be overridden --- netbox/dcim/filtersets.py | 23 +++++----- netbox/dcim/forms/filtersets.py | 57 ++++++++++++++++++------- netbox/dcim/models/device_components.py | 3 -- netbox/dcim/tables/devices.py | 9 ++-- netbox/netbox/tables/columns.py | 19 ++++++--- 5 files changed, 73 insertions(+), 38 deletions(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index e5fd6c929d9..0b0f3bd47c0 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1411,6 +1411,10 @@ class DeviceComponentFilterSet(django_filters.FilterSet): to_field_name='name', label=_('Virtual Chassis'), ) + device_status = django_filters.MultipleChoiceFilter( + choices=DeviceStatusChoices, + field_name='device__status', + ) def search(self, queryset, name, value): if not value.strip(): @@ -1479,7 +1483,7 @@ class ConsolePortFilterSet( class Meta: model = ConsolePort - fields = ('id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end') + fields = ('id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end', 'device_status') class ConsoleServerPortFilterSet( @@ -1495,7 +1499,7 @@ class ConsoleServerPortFilterSet( class Meta: model = ConsoleServerPort - fields = ('id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end') + fields = ('id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end', 'device_status') class PowerPortFilterSet( @@ -1513,6 +1517,7 @@ class Meta: model = PowerPort fields = ( 'id', 'name', 'label', 'maximum_draw', 'allocated_draw', 'description', 'mark_connected', 'cable_end', + 'device_status', ) @@ -1538,7 +1543,7 @@ class PowerOutletFilterSet( class Meta: model = PowerOutlet fields = ( - 'id', 'name', 'label', 'feed_leg', 'description', 'mark_connected', 'cable_end', + 'id', 'name', 'label', 'feed_leg', 'description', 'mark_connected', 'cable_end', 'device_status', ) @@ -1683,7 +1688,7 @@ class Meta: fields = ( 'id', 'name', 'label', 'type', 'enabled', 'mtu', 'mgmt_only', 'poe_mode', 'poe_type', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', - 'cable_id', 'cable_end', + 'cable_id', 'cable_end', 'device_status', ) def filter_virtual_chassis_member(self, queryset, name, value): @@ -1721,6 +1726,7 @@ class Meta: model = FrontPort fields = ( 'id', 'name', 'label', 'type', 'color', 'rear_port_position', 'description', 'mark_connected', 'cable_end', + 'device_status', ) @@ -1738,6 +1744,7 @@ class Meta: model = RearPort fields = ( 'id', 'name', 'label', 'type', 'color', 'positions', 'description', 'mark_connected', 'cable_end', + 'device_status', ) @@ -1750,7 +1757,7 @@ class ModuleBayFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): class Meta: model = ModuleBay - fields = ('id', 'name', 'label', 'position', 'description') + fields = ('id', 'name', 'label', 'position', 'description', 'device_status',) class DeviceBayFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): @@ -1767,7 +1774,7 @@ class DeviceBayFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): class Meta: model = DeviceBay - fields = ('id', 'name', 'label', 'description') + fields = ('id', 'name', 'label', 'description', 'device_status') class InventoryItemFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): @@ -1795,10 +1802,6 @@ 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( diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 144382e0349..dfe5a12fa4e 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -129,6 +129,11 @@ class DeviceComponentFilterForm(NetBoxModelFilterSetForm): }, label=_('Device') ) + device_status = forms.MultipleChoiceField( + choices=DeviceStatusChoices, + required=False, + label=_('Device Status'), + ) class RegionFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm): @@ -1173,7 +1178,9 @@ class ConsolePortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): FieldSet('q', 'filter_id', 'tag'), FieldSet('name', 'label', 'type', 'speed', 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') + ), FieldSet('cabled', 'connected', 'occupied', name=_('Connection')), ) type = forms.MultipleChoiceField( @@ -1195,7 +1202,10 @@ class ConsoleServerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterF FieldSet('q', 'filter_id', 'tag'), FieldSet('name', 'label', 'type', 'speed', 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') + ), FieldSet('cabled', 'connected', 'occupied', name=_('Connection')), ) type = forms.MultipleChoiceField( @@ -1217,7 +1227,9 @@ class PowerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): FieldSet('q', 'filter_id', 'tag'), FieldSet('name', 'label', 'type', 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') + ), FieldSet('cabled', 'connected', 'occupied', name=_('Connection')), ) type = forms.MultipleChoiceField( @@ -1234,7 +1246,10 @@ class PowerOutletFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): FieldSet('q', 'filter_id', 'tag'), FieldSet('name', 'label', 'type', 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') + ), FieldSet('cabled', 'connected', 'occupied', name=_('Connection')), ) type = forms.MultipleChoiceField( @@ -1254,7 +1269,10 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): FieldSet('poe_mode', 'poe_type', name=_('PoE')), FieldSet('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power', name=_('Wireless')), 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', 'vdc_id', name=_('Device')), + FieldSet( + 'device_type_id', 'device_role_id', 'device_id', 'device_status', 'virtual_chassis_id', 'vdc_id', + name=_('Device') + ), FieldSet('cabled', 'connected', 'occupied', name=_('Connection')), ) selector_fields = ('filter_id', 'q', 'device_id') @@ -1362,7 +1380,9 @@ class FrontPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): FieldSet('q', 'filter_id', 'tag'), FieldSet('name', 'label', 'type', 'color', 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') + ), FieldSet('cabled', 'occupied', name=_('Cable')), ) model = FrontPort @@ -1384,7 +1404,10 @@ class RearPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): FieldSet('q', 'filter_id', 'tag'), FieldSet('name', 'label', 'type', 'color', 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') + ), FieldSet('cabled', 'occupied', name=_('Cable')), ) type = forms.MultipleChoiceField( @@ -1405,7 +1428,10 @@ class ModuleBayFilterForm(DeviceComponentFilterForm): FieldSet('q', 'filter_id', 'tag'), FieldSet('name', 'label', 'position', 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') + ), ) tag = TagFilterField(model) position = forms.CharField( @@ -1420,7 +1446,10 @@ class DeviceBayFilterForm(DeviceComponentFilterForm): FieldSet('q', 'filter_id', 'tag'), FieldSet('name', 'label', 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') + ), ) tag = TagFilterField(model) @@ -1434,7 +1463,10 @@ 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', 'device_status', '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,11 +1493,6 @@ 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 bd8fbe8bac5..9438b741f58 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1265,9 +1265,6 @@ class Meta: 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 5ccc61dce8c..4156a5a0a74 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -290,6 +290,11 @@ class DeviceComponentTable(NetBoxTable): linkify=True, order_by=('_name',) ) + device_status = columns.ChoiceFieldColumn( + accessor=tables.A('device__status'), + verbose_name=_('Device Status'), + color=lambda x: x.device.get_status_color(), + ) class Meta(NetBoxTable.Meta): order_by = ('device', 'name') @@ -927,10 +932,6 @@ 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): diff --git a/netbox/netbox/tables/columns.py b/netbox/netbox/tables/columns.py index 32eaf35156c..479efa8644b 100644 --- a/netbox/netbox/tables/columns.py +++ b/netbox/netbox/tables/columns.py @@ -330,19 +330,26 @@ def render(self, record, table, **kwargs): class ChoiceFieldColumn(tables.Column): """ Render a model's static ChoiceField with its value from `get_FOO_display()` as a colored badge. Background color is - set by the instance's get_FOO_color() method, if defined. + set by the instance's get_FOO_color() method, if defined, or can be overridden by a "color" callable. """ DEFAULT_BG_COLOR = 'secondary' + def __init__(self, *args, color=None, **kwargs): + super().__init__(*args, **kwargs) + self.color = color + def render(self, record, bound_column, value): if value in self.empty_values: return self.default - # Determine the background color to use (try calling object.get_FOO_color()) - try: - bg_color = getattr(record, f'get_{bound_column.name}_color')() or self.DEFAULT_BG_COLOR - except AttributeError: - bg_color = self.DEFAULT_BG_COLOR + # Determine the background color to use (use "color" callable if given, else try calling object.get_FOO_color()) + if self.color: + bg_color = self.color(record) + else: + try: + bg_color = getattr(record, f'get_{bound_column.name}_color')() or self.DEFAULT_BG_COLOR + except AttributeError: + bg_color = self.DEFAULT_BG_COLOR return mark_safe(f'{value}') From fb2d8e8e8efdb44f3be7ae6ca8dd7a047903f1ca Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Wed, 28 Aug 2024 16:05:37 -0400 Subject: [PATCH 3/4] Remove unnecessary 'device_status' in fields --- netbox/dcim/filtersets.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 0b0f3bd47c0..a69924753fa 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1483,7 +1483,7 @@ class ConsolePortFilterSet( class Meta: model = ConsolePort - fields = ('id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end', 'device_status') + fields = ('id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end') class ConsoleServerPortFilterSet( @@ -1499,7 +1499,7 @@ class ConsoleServerPortFilterSet( class Meta: model = ConsoleServerPort - fields = ('id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end', 'device_status') + fields = ('id', 'name', 'label', 'speed', 'description', 'mark_connected', 'cable_end') class PowerPortFilterSet( @@ -1517,7 +1517,6 @@ class Meta: model = PowerPort fields = ( 'id', 'name', 'label', 'maximum_draw', 'allocated_draw', 'description', 'mark_connected', 'cable_end', - 'device_status', ) @@ -1543,7 +1542,7 @@ class PowerOutletFilterSet( class Meta: model = PowerOutlet fields = ( - 'id', 'name', 'label', 'feed_leg', 'description', 'mark_connected', 'cable_end', 'device_status', + 'id', 'name', 'label', 'feed_leg', 'description', 'mark_connected', 'cable_end', ) @@ -1688,7 +1687,7 @@ class Meta: fields = ( 'id', 'name', 'label', 'type', 'enabled', 'mtu', 'mgmt_only', 'poe_mode', 'poe_type', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', - 'cable_id', 'cable_end', 'device_status', + 'cable_id', 'cable_end', ) def filter_virtual_chassis_member(self, queryset, name, value): @@ -1726,7 +1725,6 @@ class Meta: model = FrontPort fields = ( 'id', 'name', 'label', 'type', 'color', 'rear_port_position', 'description', 'mark_connected', 'cable_end', - 'device_status', ) @@ -1744,7 +1742,6 @@ class Meta: model = RearPort fields = ( 'id', 'name', 'label', 'type', 'color', 'positions', 'description', 'mark_connected', 'cable_end', - 'device_status', ) @@ -1757,7 +1754,7 @@ class ModuleBayFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): class Meta: model = ModuleBay - fields = ('id', 'name', 'label', 'position', 'description', 'device_status',) + fields = ('id', 'name', 'label', 'position', 'description') class DeviceBayFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): @@ -1774,7 +1771,7 @@ class DeviceBayFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): class Meta: model = DeviceBay - fields = ('id', 'name', 'label', 'description', 'device_status') + fields = ('id', 'name', 'label', 'description') class InventoryItemFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): @@ -1810,7 +1807,7 @@ class InventoryItemFilterSet(DeviceComponentFilterSet, NetBoxModelFilterSet): class Meta: model = InventoryItem - fields = ('id', 'name', 'label', 'part_id', 'asset_tag', 'description', 'discovered', 'device_status') + fields = ('id', 'name', 'label', 'part_id', 'asset_tag', 'description', 'discovered') def search(self, queryset, name, value): if not value.strip(): From 2846807ca49693c50eb8794ac6bc92cd38dc15b4 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Wed, 28 Aug 2024 17:25:57 -0400 Subject: [PATCH 4/4] Add unit tests for device_status --- netbox/dcim/tests/test_filtersets.py | 81 ++++++++++++++++------------ 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index b78092234f3..557bec45264 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -39,6 +39,12 @@ def test_device_role(self): params = {'device_role': [role[0].slug, role[1].slug]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_device_status(self): + params = {'device_status': ['active']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'device_status': ['offline', 'active']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + class DeviceComponentTemplateFilterSetTests: @@ -2588,10 +2594,10 @@ def setUpTestData(cls): Rack.objects.bulk_create(racks) devices = ( - Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]), - Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]), - Device(name=None, device_type=device_types[0], role=roles[0], site=sites[3]), # For cable connections + Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), + Device(name=None, device_type=device_types[0], role=roles[0], site=sites[3], status='planned'), # For cable connections ) Device.objects.bulk_create(devices) @@ -2768,10 +2774,10 @@ def setUpTestData(cls): Rack.objects.bulk_create(racks) devices = ( - Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]), - Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]), - Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]), # For cable connections + Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), + Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='planned'), # For cable connections ) Device.objects.bulk_create(devices) @@ -2948,10 +2954,10 @@ def setUpTestData(cls): Rack.objects.bulk_create(racks) devices = ( - Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]), - Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]), - Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]), # For cable connections + Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), + Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='planned'), # For cable connections ) Device.objects.bulk_create(devices) @@ -3136,10 +3142,10 @@ def setUpTestData(cls): Rack.objects.bulk_create(racks) devices = ( - Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]), - Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]), - Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]), # For cable connections + Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), + Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='planned'), # For cable connections ) Device.objects.bulk_create(devices) @@ -3334,7 +3340,8 @@ def setUpTestData(cls): rack=racks[0], virtual_chassis=virtual_chassis, vc_position=1, - vc_priority=1 + vc_priority=1, + status='active', ), Device( name='Device 1B', @@ -3345,7 +3352,8 @@ def setUpTestData(cls): rack=racks[2], virtual_chassis=virtual_chassis, vc_position=2, - vc_priority=1 + vc_priority=1, + status='active', ), Device( name='Device 2', @@ -3353,7 +3361,8 @@ def setUpTestData(cls): role=roles[1], site=sites[1], location=locations[1], - rack=racks[1] + rack=racks[1], + status='offline', ), Device( name='Device 3', @@ -3361,14 +3370,16 @@ def setUpTestData(cls): role=roles[2], site=sites[2], location=locations[2], - rack=racks[2] + rack=racks[2], + status='planned', ), # For cable connections Device( name=None, device_type=device_types[2], role=roles[2], - site=sites[3] + site=sites[3], + status='planned', ), ) Device.objects.bulk_create(devices) @@ -3814,10 +3825,10 @@ def setUpTestData(cls): Rack.objects.bulk_create(racks) devices = ( - Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]), - Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]), - Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]), # For cable connections + Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), + Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='planned'), # For cable connections ) Device.objects.bulk_create(devices) @@ -4003,10 +4014,10 @@ def setUpTestData(cls): Rack.objects.bulk_create(racks) devices = ( - Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]), - Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]), - Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3]), # For cable connections + Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), + Device(name=None, device_type=device_types[2], role=roles[2], site=sites[3], status='planned'), # For cable connections ) Device.objects.bulk_create(devices) @@ -4184,9 +4195,9 @@ def setUpTestData(cls): Rack.objects.bulk_create(racks) devices = ( - Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]), - Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]), + Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), ) Device.objects.bulk_create(devices) @@ -4313,9 +4324,9 @@ def setUpTestData(cls): Rack.objects.bulk_create(racks) devices = ( - Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0]), - Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1]), - Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2]), + Device(name='Device 1', device_type=device_types[0], role=roles[0], site=sites[0], location=locations[0], rack=racks[0], status='active'), + Device(name='Device 2', device_type=device_types[1], role=roles[1], site=sites[1], location=locations[1], rack=racks[1], status='active'), + Device(name='Device 3', device_type=device_types[2], role=roles[2], site=sites[2], location=locations[2], rack=racks[2], status='offline'), ) Device.objects.bulk_create(devices)