mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-26 09:16:10 -06:00
Closes #12518: Add 'asset tag' to rack view
This commit is contained in:
parent
9eeca06115
commit
6756256afb
@ -291,6 +291,10 @@ class RackElevationDetailFilterSerializer(serializers.Serializer):
|
|||||||
required=False,
|
required=False,
|
||||||
default=True
|
default=True
|
||||||
)
|
)
|
||||||
|
use_assettag = serializers.BooleanField(
|
||||||
|
required=False,
|
||||||
|
default=False
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -222,7 +222,8 @@ class RackViewSet(NetBoxModelViewSet):
|
|||||||
legend_width=data['legend_width'],
|
legend_width=data['legend_width'],
|
||||||
include_images=data['include_images'],
|
include_images=data['include_images'],
|
||||||
base_url=request.build_absolute_uri('/'),
|
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')
|
return HttpResponse(drawing.tostring(), content_type='image/svg+xml')
|
||||||
|
|
||||||
|
@ -394,7 +394,8 @@ class Rack(PrimaryModel, WeightMixin):
|
|||||||
margin_width=RACK_ELEVATION_DEFAULT_MARGIN_WIDTH,
|
margin_width=RACK_ELEVATION_DEFAULT_MARGIN_WIDTH,
|
||||||
include_images=True,
|
include_images=True,
|
||||||
base_url=None,
|
base_url=None,
|
||||||
highlight_params=None
|
highlight_params=None,
|
||||||
|
use_assettag=False
|
||||||
):
|
):
|
||||||
"""
|
"""
|
||||||
Return an SVG of the rack elevation
|
Return an SVG of the rack elevation
|
||||||
@ -419,7 +420,8 @@ class Rack(PrimaryModel, WeightMixin):
|
|||||||
user=user,
|
user=user,
|
||||||
include_images=include_images,
|
include_images=include_images,
|
||||||
base_url=base_url,
|
base_url=base_url,
|
||||||
highlight_params=highlight_params
|
highlight_params=highlight_params,
|
||||||
|
use_assettag=use_assettag
|
||||||
)
|
)
|
||||||
|
|
||||||
return elevation.render(face)
|
return elevation.render(face)
|
||||||
|
@ -23,8 +23,10 @@ __all__ = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def get_device_name(device):
|
def get_device_name(device, use_assettag):
|
||||||
if device.virtual_chassis:
|
if use_assettag and device.asset_tag:
|
||||||
|
name = device.asset_tag
|
||||||
|
elif device.virtual_chassis:
|
||||||
name = f'{device.virtual_chassis.name}:{device.vc_position}'
|
name = f'{device.virtual_chassis.name}:{device.vc_position}'
|
||||||
elif device.name:
|
elif device.name:
|
||||||
name = 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
|
: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,
|
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.rack = rack
|
||||||
self.include_images = include_images
|
self.include_images = include_images
|
||||||
self.base_url = base_url.rstrip('/') if base_url is not None else ''
|
self.base_url = base_url.rstrip('/') if base_url is not None else ''
|
||||||
|
self.use_assettag = use_assettag
|
||||||
|
|
||||||
# Set drawing dimensions
|
# Set drawing dimensions
|
||||||
config = get_config()
|
config = get_config()
|
||||||
@ -152,7 +155,8 @@ class RackElevationSVG:
|
|||||||
return x, y
|
return x, y
|
||||||
|
|
||||||
def _draw_device(self, device, coords, size, color=None, image=None):
|
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)
|
description = get_device_description(device)
|
||||||
text_color = f'#{foreground_color(color)}' if color else '#000000'
|
text_color = f'#{foreground_color(color)}' if color else '#000000'
|
||||||
text_coords = (
|
text_coords = (
|
||||||
@ -174,6 +178,7 @@ class RackElevationSVG:
|
|||||||
else:
|
else:
|
||||||
link.add(Rect(coords, size, class_=f'slot blocked{css_extra}'))
|
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(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
|
# Embed device type image if provided
|
||||||
if self.include_images and image:
|
if self.include_images and image:
|
||||||
|
BIN
netbox/project-static/dist/netbox.js
vendored
BIN
netbox/project-static/dist/netbox.js
vendored
Binary file not shown.
BIN
netbox/project-static/dist/netbox.js.map
vendored
BIN
netbox/project-static/dist/netbox.js.map
vendored
Binary file not shown.
@ -16,18 +16,31 @@ function setRackView(
|
|||||||
case 'images-and-labels': {
|
case 'images-and-labels': {
|
||||||
showRackElements('image.device-image', elevation);
|
showRackElements('image.device-image', elevation);
|
||||||
showRackElements('text.device-image-label', elevation);
|
showRackElements('text.device-image-label', elevation);
|
||||||
|
showRackElements('text.label', elevation);
|
||||||
|
hideRackElements('text.asset-tag', elevation);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'images-only': {
|
case 'images-only': {
|
||||||
showRackElements('image.device-image', elevation);
|
showRackElements('image.device-image', elevation);
|
||||||
hideRackElements('text.device-image-label', elevation);
|
hideRackElements('text.device-image-label', elevation);
|
||||||
|
showRackElements('text.label', elevation);
|
||||||
|
hideRackElements('text.asset-tag', elevation);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'labels-only': {
|
case 'labels-only': {
|
||||||
hideRackElements('image.device-image', elevation);
|
hideRackElements('image.device-image', elevation);
|
||||||
hideRackElements('text.device-image-label', elevation);
|
hideRackElements('text.device-image-label', elevation);
|
||||||
|
showRackElements('text.label', elevation);
|
||||||
|
hideRackElements('text.asset-tag', elevation);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'assettags-only': {
|
||||||
|
hideRackElements('image.device-image', elevation);
|
||||||
|
hideRackElements('text.device-image-label', elevation);
|
||||||
|
hideRackElements('text.label', elevation);
|
||||||
|
showRackElements('text.asset-tag', elevation);
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
import { createState } from '../state';
|
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 }>(
|
export const rackImagesState = createState<{ view: RackViewSelection }>(
|
||||||
{ view: 'images-and-labels' },
|
{ view: 'images-and-labels' },
|
||||||
|
@ -173,6 +173,7 @@
|
|||||||
<option value="images-and-labels" selected="selected">Images and Labels</option>
|
<option value="images-and-labels" selected="selected">Images and Labels</option>
|
||||||
<option value="images-only">Images only</option>
|
<option value="images-only">Images only</option>
|
||||||
<option value="labels-only">Labels only</option>
|
<option value="labels-only">Labels only</option>
|
||||||
|
<option value="assettags-only">AssetTags only</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="row" style="margin-bottom: 20px">
|
<div class="row" style="margin-bottom: 20px">
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
<option value="images-and-labels" selected="selected">Images and Labels</option>
|
<option value="images-and-labels" selected="selected">Images and Labels</option>
|
||||||
<option value="images-only">Images only</option>
|
<option value="images-only">Images only</option>
|
||||||
<option value="labels-only">Labels only</option>
|
<option value="labels-only">Labels only</option>
|
||||||
|
<option value="assettags-only">AssetTags only</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn-group btn-group-sm" role="group">
|
<div class="btn-group btn-group-sm" role="group">
|
||||||
|
Loading…
Reference in New Issue
Block a user