From 6756256afbccb42708d5b86885d9a0100e2018d6 Mon Sep 17 00:00:00 2001 From: Pieter Lambrecht Date: Fri, 12 May 2023 11:51:01 +0200 Subject: [PATCH] Closes #12518: Add 'asset tag' to rack view --- netbox/dcim/api/serializers.py | 4 ++++ netbox/dcim/api/views.py | 3 ++- netbox/dcim/models/racks.py | 6 ++++-- netbox/dcim/svg/racks.py | 13 +++++++++---- netbox/project-static/dist/netbox.js | Bin 438912 -> 439169 bytes netbox/project-static/dist/netbox.js.map | Bin 402467 -> 402655 bytes netbox/project-static/src/racks.ts | 13 +++++++++++++ .../project-static/src/stores/rackImages.ts | 6 +++++- netbox/templates/dcim/rack.html | 1 + .../templates/dcim/rack_elevation_list.html | 1 + 10 files changed, 39 insertions(+), 8 deletions(-) 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 8caaaa9a06b98ae6307412f09c4e3e29af0efc04..bd4891eafa00be2e600ad11c7555c84f19bbcf0b 100644 GIT binary patch delta 19159 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 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 @@ +