Skip to content

Commit df5bc85

Browse files
Guibi1pheus
andauthored
Closes #20808: Show occupying Device in Rack Position Selector (#21744)
Add a description field to the rack unit serializer containing the occupying Device, allowing the Rack position dropdown to show Device context while keeping the existing display value unchanged. Co-authored-by: Martin Hauser <mhauser@netboxlabs.com>
1 parent 9b5f29a commit df5bc85

2 files changed

Lines changed: 33 additions & 0 deletions

File tree

netbox/dcim/api/serializers_/rackunits.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ class RackUnitSerializer(serializers.Serializer):
2626
device = DeviceSerializer(nested=True, read_only=True)
2727
occupied = serializers.BooleanField(read_only=True)
2828
display = serializers.SerializerMethodField(read_only=True)
29+
description = serializers.SerializerMethodField(read_only=True)
2930

3031
@extend_schema_field(OpenApiTypes.STR)
3132
def get_display(self, obj):
3233
return obj['name']
34+
35+
@extend_schema_field(OpenApiTypes.STR)
36+
def get_description(self, obj):
37+
return f'{obj["device"]}' if obj['device'] else None

netbox/dcim/tests/test_api.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,34 @@ def test_get_rack_elevation(self):
716716
response = self.client.get(f'{url}?q=U10', **self.header)
717717
self.assertEqual(response.data['count'], 2)
718718

719+
def test_get_rack_elevation_description_is_occupying_device_name(self):
720+
"""
721+
Verify occupied rack units include the occupying device in their description.
722+
"""
723+
rack = Rack.objects.first()
724+
self.add_permissions('dcim.view_rack', 'dcim.view_device')
725+
url = reverse('dcim-api:rack-elevation', kwargs={'pk': rack.pk})
726+
727+
device = create_test_device(
728+
name='Device A',
729+
site=rack.site,
730+
rack=rack,
731+
position=40,
732+
face=DeviceFaceChoices.FACE_FRONT,
733+
)
734+
735+
# Retrieve all units
736+
response = self.client.get(url, **self.header)
737+
self.assertHttpStatus(response, status.HTTP_200_OK)
738+
739+
occupied_unit = next(unit for unit in response.data['results'] if unit['name'] == 'U40')
740+
self.assertEqual(occupied_unit['device']['id'], device.pk)
741+
self.assertEqual(occupied_unit['description'], f'{device}')
742+
743+
unoccupied_unit = next(unit for unit in response.data['results'] if unit['name'] == 'U39')
744+
self.assertEqual(unoccupied_unit['device'], None)
745+
self.assertEqual(unoccupied_unit['description'], None)
746+
719747
def test_get_rack_elevation_svg(self):
720748
"""
721749
GET a single rack elevation in SVG format.

0 commit comments

Comments
 (0)