Closes #12518: Add 'asset tag' to rack view

This commit is contained in:
Pieter Lambrecht 2023-05-12 11:51:01 +02:00
parent 9eeca06115
commit 6756256afb
10 changed files with 39 additions and 8 deletions

View File

@ -291,6 +291,10 @@ class RackElevationDetailFilterSerializer(serializers.Serializer):
required=False,
default=True
)
use_assettag = serializers.BooleanField(
required=False,
default=False
)
#

View File

@ -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')

View File

@ -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)

View File

@ -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:

Binary file not shown.

Binary file not shown.

View File

@ -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);
}
}
}

View File

@ -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' },

View File

@ -173,6 +173,7 @@
<option value="images-and-labels" selected="selected">Images and Labels</option>
<option value="images-only">Images only</option>
<option value="labels-only">Labels only</option>
<option value="assettags-only">AssetTags only</option>
</select>
</div>
<div class="row" style="margin-bottom: 20px">

View File

@ -15,6 +15,7 @@
<option value="images-and-labels" selected="selected">Images and Labels</option>
<option value="images-only">Images only</option>
<option value="labels-only">Labels only</option>
<option value="assettags-only">AssetTags only</option>
</select>
</div>
<div class="btn-group btn-group-sm" role="group">