diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 3f6d55da7..9001a5146 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -291,6 +291,10 @@ class RackElevationDetailFilterSerializer(serializers.Serializer): required=False, default=True ) + use_assettag = serializers.BooleanField( + required=False, + default=False + ) # diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 0d9fcdc5f..166a2c2bd 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -222,7 +222,8 @@ class RackViewSet(NetBoxModelViewSet): legend_width=data['legend_width'], include_images=data['include_images'], base_url=request.build_absolute_uri('/'), - highlight_params=highlight_params + highlight_params=highlight_params, + use_assettag=data['use_assettag'] ) return HttpResponse(drawing.tostring(), content_type='image/svg+xml') diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index e5412a3ab..00bcc28bf 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -394,7 +394,8 @@ class Rack(PrimaryModel, WeightMixin): margin_width=RACK_ELEVATION_DEFAULT_MARGIN_WIDTH, include_images=True, base_url=None, - highlight_params=None + highlight_params=None, + use_assettag=False ): """ Return an SVG of the rack elevation @@ -419,7 +420,8 @@ class Rack(PrimaryModel, WeightMixin): user=user, include_images=include_images, base_url=base_url, - highlight_params=highlight_params + highlight_params=highlight_params, + use_assettag=use_assettag ) return elevation.render(face) diff --git a/netbox/dcim/svg/racks.py b/netbox/dcim/svg/racks.py index 62878cef9..2ac293083 100644 --- a/netbox/dcim/svg/racks.py +++ b/netbox/dcim/svg/racks.py @@ -23,8 +23,10 @@ __all__ = ( ) -def get_device_name(device): - if device.virtual_chassis: +def get_device_name(device, use_assettag): + if use_assettag and device.asset_tag: + name = device.asset_tag + elif device.virtual_chassis: name = f'{device.virtual_chassis.name}:{device.vc_position}' elif device.name: name = device.name @@ -76,10 +78,11 @@ class RackElevationSVG: :param highlight_params: Iterable of two-tuples which identifies attributes of devices to highlight """ def __init__(self, rack, unit_height=None, unit_width=None, legend_width=None, margin_width=None, user=None, - include_images=True, base_url=None, highlight_params=None): + include_images=True, base_url=None, highlight_params=None, use_assettag=False): self.rack = rack self.include_images = include_images self.base_url = base_url.rstrip('/') if base_url is not None else '' + self.use_assettag = use_assettag # Set drawing dimensions config = get_config() @@ -152,7 +155,8 @@ class RackElevationSVG: return x, y def _draw_device(self, device, coords, size, color=None, image=None): - name = get_device_name(device) + name = get_device_name(device, self.use_assettag) + asset_tag = f"[{device.asset_tag}]" if device.asset_tag else name description = get_device_description(device) text_color = f'#{foreground_color(color)}' if color else '#000000' text_coords = ( @@ -174,6 +178,7 @@ class RackElevationSVG: else: link.add(Rect(coords, size, class_=f'slot blocked{css_extra}')) link.add(Text(name, insert=text_coords, fill=text_color, class_=f'label{css_extra}')) + link.add(Text(asset_tag, insert=text_coords, fill=text_color, class_=f'hidden asset-tag{css_extra}'),) # Embed device type image if provided if self.include_images and image: diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 8caaaa9a0..bd4891eaf 100644 Binary files a/netbox/project-static/dist/netbox.js and b/netbox/project-static/dist/netbox.js differ diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 0201e7bf8..29e7a78b3 100644 Binary files a/netbox/project-static/dist/netbox.js.map and b/netbox/project-static/dist/netbox.js.map differ diff --git a/netbox/project-static/src/racks.ts b/netbox/project-static/src/racks.ts index cae9897fc..73b345972 100644 --- a/netbox/project-static/src/racks.ts +++ b/netbox/project-static/src/racks.ts @@ -16,18 +16,31 @@ function setRackView( case 'images-and-labels': { showRackElements('image.device-image', elevation); showRackElements('text.device-image-label', elevation); + showRackElements('text.label', elevation); + hideRackElements('text.asset-tag', elevation); break; } case 'images-only': { showRackElements('image.device-image', elevation); hideRackElements('text.device-image-label', elevation); + showRackElements('text.label', elevation); + hideRackElements('text.asset-tag', elevation); break; } case 'labels-only': { hideRackElements('image.device-image', elevation); hideRackElements('text.device-image-label', elevation); + showRackElements('text.label', elevation); + hideRackElements('text.asset-tag', elevation); break; } + case 'assettags-only': { + hideRackElements('image.device-image', elevation); + hideRackElements('text.device-image-label', elevation); + hideRackElements('text.label', elevation); + showRackElements('text.asset-tag', elevation); + + } } } diff --git a/netbox/project-static/src/stores/rackImages.ts b/netbox/project-static/src/stores/rackImages.ts index d32833b20..d6103f6e5 100644 --- a/netbox/project-static/src/stores/rackImages.ts +++ b/netbox/project-static/src/stores/rackImages.ts @@ -1,6 +1,10 @@ import { createState } from '../state'; -export type RackViewSelection = 'images-and-labels' | 'images-only' | 'labels-only'; +export type RackViewSelection = + | 'images-and-labels' + | 'images-only' + | 'labels-only' + | 'assettags-only'; export const rackImagesState = createState<{ view: RackViewSelection }>( { view: 'images-and-labels' }, diff --git a/netbox/templates/dcim/rack.html b/netbox/templates/dcim/rack.html index 9cb046b4e..98e1bc394 100644 --- a/netbox/templates/dcim/rack.html +++ b/netbox/templates/dcim/rack.html @@ -173,6 +173,7 @@ +
diff --git a/netbox/templates/dcim/rack_elevation_list.html b/netbox/templates/dcim/rack_elevation_list.html index bd02c9f74..64605d25c 100644 --- a/netbox/templates/dcim/rack_elevation_list.html +++ b/netbox/templates/dcim/rack_elevation_list.html @@ -15,6 +15,7 @@ +