diff --git a/netbox/dcim/ui/panels.py b/netbox/dcim/ui/panels.py index c7aa36a23..6ffd2e3d4 100644 --- a/netbox/dcim/ui/panels.py +++ b/netbox/dcim/ui/panels.py @@ -3,6 +3,19 @@ from django.utils.translation import gettext_lazy as _ from netbox.ui import attrs, components +class SitePanel(components.ObjectPanel): + region = attrs.NestedObjectAttr('region', label=_('Region'), linkify=True) + group = attrs.NestedObjectAttr('group', label=_('Group'), linkify=True) + status = attrs.ChoiceAttr('status', label=_('Status')) + tenant = attrs.ObjectAttr('tenant', label=_('Tenant'), linkify=True, grouped_by='group') + facility = attrs.TextAttr('facility', label=_('Facility')) + description = attrs.TextAttr('description', label=_('Description')) + timezone = attrs.TimezoneAttr('time_zone', label=_('Timezone')) + physical_address = attrs.AddressAttr('physical_address', label=_('Physical address'), map_url=True) + shipping_address = attrs.AddressAttr('shipping_address', label=_('Shipping address'), map_url=True) + gps_coordinates = attrs.GPSCoordinatesAttr() + + class LocationPanel(components.NestedGroupObjectPanel): site = attrs.ObjectAttr('site', label=_('Site'), linkify=True, grouped_by='group') status = attrs.ChoiceAttr('status', label=_('Status')) @@ -10,6 +23,23 @@ class LocationPanel(components.NestedGroupObjectPanel): facility = attrs.TextAttr('facility', label=_('Facility')) +class RackPanel(components.ObjectPanel): + region = attrs.NestedObjectAttr('site.region', label=_('Region'), linkify=True) + site = attrs.ObjectAttr('site', label=_('Site'), linkify=True, grouped_by='group') + location = attrs.NestedObjectAttr('location', label=_('Location'), linkify=True) + facility = attrs.TextAttr('facility', label=_('Facility')) + tenant = attrs.ObjectAttr('tenant', label=_('Tenant'), linkify=True, grouped_by='group') + status = attrs.ChoiceAttr('status', label=_('Status')) + rack_type = attrs.ObjectAttr('rack_type', label=_('Rack type'), linkify=True, grouped_by='manufacturer') + role = attrs.ObjectAttr('role', label=_('Role'), linkify=True) + description = attrs.TextAttr('description', label=_('Description')) + serial = attrs.TextAttr('serial', label=_('Serial number'), style='font-monospace', copy_button=True) + asset_tag = attrs.TextAttr('asset_tag', label=_('Asset tag'), style='font-monospace', copy_button=True) + airflow = attrs.ChoiceAttr('airflow', label=_('Airflow')) + space_utilization = attrs.UtilizationAttr('get_utilization', label=_('Space utilization')) + power_utilization = attrs.UtilizationAttr('get_power_utilization', label=_('Power utilization')) + + class DevicePanel(components.ObjectPanel): region = attrs.NestedObjectAttr('site.region', label=_('Region'), linkify=True) site = attrs.ObjectAttr('site', label=_('Site'), linkify=True, grouped_by='group') @@ -50,16 +80,3 @@ class DeviceManagementPanel(components.ObjectPanel): label=_('Out-of-band IP'), template_name='dcim/device/attrs/ipaddress.html', ) - - -class SitePanel(components.ObjectPanel): - region = attrs.NestedObjectAttr('region', label=_('Region'), linkify=True) - group = attrs.NestedObjectAttr('group', label=_('Group'), linkify=True) - status = attrs.ChoiceAttr('status', label=_('Status')) - tenant = attrs.ObjectAttr('tenant', label=_('Tenant'), linkify=True, grouped_by='group') - facility = attrs.TextAttr('facility', label=_('Facility')) - description = attrs.TextAttr('description', label=_('Description')) - timezone = attrs.TimezoneAttr('time_zone', label=_('Timezone')) - physical_address = attrs.AddressAttr('physical_address', label=_('Physical address'), map_url=True) - shipping_address = attrs.AddressAttr('shipping_address', label=_('Shipping address'), map_url=True) - gps_coordinates = attrs.GPSCoordinatesAttr() diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index eb0e42ee1..f59d8babd 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -868,6 +868,7 @@ class RackView(GetRelatedModelsMixin, generic.ObjectView): ]) return { + 'rack_panel': panels.RackPanel(instance, _('Rack')), 'related_models': self.get_related_models( request, instance, diff --git a/netbox/netbox/ui/attrs.py b/netbox/netbox/ui/attrs.py index 679cc5d66..293cfa29e 100644 --- a/netbox/netbox/ui/attrs.py +++ b/netbox/netbox/ui/attrs.py @@ -210,3 +210,15 @@ class TemplatedAttr(Attr): 'value': value, } ) + + +class UtilizationAttr(Attr): + template_name = 'components/attrs/utilization.html' + + def render(self, obj, context=None): + context = context or {} + value = self._resolve_attr(obj, self.accessor) + return render_to_string(self.template_name, { + **context, + 'value': value, + }) diff --git a/netbox/templates/components/attrs/utilization.html b/netbox/templates/components/attrs/utilization.html new file mode 100644 index 000000000..6e1db73f1 --- /dev/null +++ b/netbox/templates/components/attrs/utilization.html @@ -0,0 +1,2 @@ +{% load helpers %} +{% utilization_graph value %} diff --git a/netbox/templates/dcim/rack.html b/netbox/templates/dcim/rack.html index eec4d63a5..e0f60eb50 100644 --- a/netbox/templates/dcim/rack.html +++ b/netbox/templates/dcim/rack.html @@ -120,6 +120,7 @@ {% plugin_left_page object %}
+ {{ rack_panel }}