2020-11-13 15:00:12 -05:00
{% extends 'dcim/device/base.html' %}
{% load render_table from django_tables2 %}
{% load buttons %}
{% load static %}
{% load helpers %}
{% load plugins %}
2023-07-29 03:30:25 +07:00
{% load i18n %}
2020-11-13 15:00:12 -05:00
{% block content %}
2021-07-21 11:20:35 -04:00
< div class = "row" >
2022-10-03 10:55:05 -07:00
< div class = "col col-12 col-xl-6" >
2021-07-21 11:20:35 -04:00
< div class = "card" >
2023-07-29 03:30:25 +07:00
< h5 class = "card-header" > {% trans "Device" %}< / h5 >
2021-07-21 11:20:35 -04:00
< div class = "card-body" >
< table class = "table table-hover attr-table" >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Region" %}< / th >
2021-07-21 11:20:35 -04:00
< td >
{% if object.site.region %}
{% for region in object.site.region.get_ancestors %}
2022-03-22 14:51:20 -04:00
{{ region|linkify }} /
2021-07-21 11:20:35 -04:00
{% endfor %}
2022-03-22 14:51:20 -04:00
{{ object.site.region|linkify }}
2021-07-21 11:20:35 -04:00
{% else %}
2022-06-15 22:33:21 +02:00
{{ ''|placeholder }}
2021-07-21 11:20:35 -04:00
{% endif %}
< / td >
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Site" %}< / th >
2022-03-22 14:51:20 -04:00
< td > {{ object.site|linkify }}< / td >
2021-07-21 11:20:35 -04:00
< / tr >
2022-02-07 10:37:11 -05:00
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Location" %}< / th >
2021-07-21 11:20:35 -04:00
< td >
{% if object.location %}
{% for location in object.location.get_ancestors %}
2022-03-22 14:51:20 -04:00
{{ location|linkify }} /
2021-07-21 11:20:35 -04:00
{% endfor %}
2022-03-22 14:51:20 -04:00
{{ object.location|linkify }}
2021-07-21 11:20:35 -04:00
{% else %}
2022-06-15 22:33:21 +02:00
{{ ''|placeholder }}
2021-07-21 11:20:35 -04:00
{% endif %}
< / td >
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Rack" %}< / th >
2022-09-01 09:53:48 -04:00
< td class = "position-relative" >
2021-07-21 11:20:35 -04:00
{% if object.rack %}
2022-07-11 12:58:24 -04:00
{{ object.rack|linkify }}
2022-09-01 09:53:48 -04:00
< div class = "position-absolute top-50 end-0 translate-middle-y noprint" >
2023-07-29 03:30:25 +07:00
< a href = "{{ object.rack.get_absolute_url }}?device={{ object.pk }}" class = "btn btn-primary btn-sm" title = "{% trans " Highlight device " % } " >
2022-06-24 11:04:38 -04:00
< i class = "mdi mdi-view-day-outline" > < / i >
< / a >
< / div >
2021-07-21 11:20:35 -04:00
{% else %}
2022-06-15 22:33:21 +02:00
{{ ''|placeholder }}
2021-07-21 11:20:35 -04:00
{% endif %}
< / td >
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Position" %}< / th >
2021-07-21 11:20:35 -04:00
< td >
{% if object.parent_bay %}
{% with object.parent_bay.device as parent %}
2022-03-22 14:51:20 -04:00
{{ parent|linkify }} / {{ object.parent_bay }}
2021-07-21 11:20:35 -04:00
{% if parent.position %}
2022-09-27 17:24:19 +02:00
(U{{ parent.position|floatformat }} / {{ parent.get_face_display }})
2021-04-21 13:20:09 -07:00
{% endif %}
2021-07-21 11:20:35 -04:00
{% endwith %}
{% elif object.rack and object.position %}
2022-09-07 14:09:17 -04:00
< span > U{{ object.position|floatformat }} / {{ object.get_face_display }}< / span >
2021-07-21 11:20:35 -04:00
{% elif object.rack and object.device_type.u_height %}
2023-07-29 03:30:25 +07:00
< span class = "badge bg-warning" > {% trans "Not racked" %}< / span >
2021-07-21 11:20:35 -04:00
{% else %}
2022-06-15 22:33:21 +02:00
{{ ''|placeholder }}
2021-07-21 11:20:35 -04:00
{% endif %}
< / td >
< / tr >
2023-06-14 11:18:50 -07:00
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "GPS Coordinates" %}< / th >
2023-06-14 11:18:50 -07:00
< td class = "position-relative" >
{% if object.latitude and object.longitude %}
{% if config.MAPS_URL %}
< div class = "position-absolute top-50 end-0 translate-middle-y noprint" >
< a href = "{{ config.MAPS_URL }}{{ object.latitude }},{{ object.longitude }}" target = "_blank" class = "btn btn-primary btn-sm" >
2023-07-29 03:30:25 +07:00
< i class = "mdi mdi-map-marker" > < / i > {% trans "Map It" %}
2023-06-14 11:18:50 -07:00
< / a >
< / div >
{% endif %}
< span > {{ object.latitude }}, {{ object.longitude }}< / span >
{% else %}
{{ ''|placeholder }}
{% endif %}
< / td >
< / tr >
2021-07-21 11:20:35 -04:00
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Tenant" %}< / th >
2021-07-21 11:20:35 -04:00
< td >
2022-03-22 15:29:05 -04:00
{% if object.tenant.group %}
{{ object.tenant.group|linkify }} /
2020-11-13 15:00:12 -05:00
{% endif %}
2022-03-22 15:29:05 -04:00
{{ object.tenant|linkify|placeholder }}
2021-07-21 11:20:35 -04:00
< / td >
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Device Type" %}< / th >
2021-07-21 11:20:35 -04:00
< td >
2022-09-27 17:24:19 +02:00
{{ object.device_type|linkify:"get_full_name" }} ({{ object.device_type.u_height|floatformat }}U)
2021-07-21 11:20:35 -04:00
< / td >
< / tr >
2021-10-14 16:04:42 -04:00
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Description" %}< / th >
2022-11-04 08:28:09 -04:00
< td > {{ object.description|placeholder }}< / td >
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Airflow" %}< / th >
2021-10-14 16:04:42 -04:00
< td >
{{ object.get_airflow_display|placeholder }}
< / td >
< / tr >
2021-07-21 11:20:35 -04:00
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Serial Number" %}< / th >
2021-09-09 16:05:46 -04:00
< td class = "font-monospace" > {{ object.serial|placeholder }}< / td >
2021-07-21 11:20:35 -04:00
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Asset Tag" %}< / th >
2021-09-09 16:05:46 -04:00
< td class = "font-monospace" > {{ object.asset_tag|placeholder }}< / td >
2021-07-21 11:20:35 -04:00
< / tr >
2023-02-17 08:33:08 -05:00
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Config Template" %}< / th >
2023-02-17 08:33:08 -05:00
< td > {{ object.config_template|linkify|placeholder }}< / td >
< / tr >
2021-07-21 11:20:35 -04:00
< / table >
< / div >
< / div >
{% if vc_members %}
< div class = "card" >
< h5 class = "card-header" >
2023-07-29 03:30:25 +07:00
{% trans "Virtual Chassis" %}
2021-07-21 11:20:35 -04:00
< / h5 >
< div class = "card-body" >
< table class = "table table-hover attr-table" >
< tr >
2023-07-29 03:30:25 +07:00
< th > {% trans "Device" %}< / th >
< th > {% trans "Position" %}< / th >
< th > {% trans "Master" %}< / th >
< th > {% trans "Priority" %}< / th >
2021-07-21 11:20:35 -04:00
< / tr >
{% for vc_member in vc_members %}
< tr { % if vc_member = = object % } class = "info" { % endif % } >
< td >
2022-03-22 14:51:20 -04:00
{{ vc_member|linkify }}
2021-07-21 11:20:35 -04:00
< / td >
2021-08-23 16:47:08 -04:00
< td >
2022-02-05 15:10:03 +01:00
{% badge vc_member.vc_position show_empty=True %}
2021-08-23 16:47:08 -04:00
< / td >
< td >
{% if object.virtual_chassis.master == vc_member %}< i class = "mdi mdi-check-bold" > < / i > {% endif %}
< / td >
< td >
2023-03-24 08:14:24 -07:00
{{ vc_member.vc_priority|placeholder }}
2021-08-23 16:47:08 -04:00
< / td >
2021-07-21 11:20:35 -04:00
< / tr >
{% endfor %}
< / table >
2021-04-21 13:20:09 -07:00
< / div >
2021-07-21 11:20:35 -04:00
< div class = "card-footer text-end noprint" >
< a href = "{{ object.virtual_chassis.get_absolute_url }}" class = "btn btn-primary btn-sm" >
2023-07-29 03:30:25 +07:00
< span class = "mdi mdi-arrow-right-bold" aria-hidden = "true" > < / span > {% trans "View Virtual Chassis" %}
2021-07-21 11:20:35 -04:00
< / a >
< / div >
< / div >
{% endif %}
2021-12-18 14:30:28 -05:00
{% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %}
{% include 'inc/panels/comments.html' %}
2022-11-15 11:24:36 -05:00
< div class = "card" >
2023-07-29 03:30:25 +07:00
< h5 class = "card-header" > {% trans "Virtual Device Contexts" %}< / h5 >
2023-01-25 17:27:57 -05:00
< div class = "card-body htmx-container table-responsive"
hx-get="{% url 'dcim:virtualdevicecontext_list' %}?device_id={{ object.pk }}"
hx-trigger="load"
>< / div >
2022-11-15 11:24:36 -05:00
{% if perms.dcim.add_virtualdevicecontext %}
< div class = "card-footer text-end noprint" >
< a href = "{% url 'dcim:virtualdevicecontext_add' %}?device={{ object.pk }}" class = "btn btn-sm btn-primary" >
2023-07-29 03:30:25 +07:00
< span class = "mdi mdi-plus-thick" aria-hidden = "true" > < / span > {% trans "Create VDC" %}
2022-11-15 11:24:36 -05:00
< / a >
< / div >
{% endif %}
< / div >
2021-12-18 14:30:28 -05:00
{% plugin_left_page object %}
< / div >
2022-10-03 10:55:05 -07:00
< div class = "col col-12 col-xl-6" >
2021-07-21 11:20:35 -04:00
< div class = "card" >
2023-07-29 03:30:25 +07:00
< h5 class = "card-header" > {% trans "Management" %}< / h5 >
2021-07-21 11:20:35 -04:00
< div class = "card-body" >
< table class = "table table-hover attr-table" >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Status" %}< / th >
2022-02-11 14:25:13 -05:00
< td > {% badge object.get_status_display bg_color=object.get_status_color %}< / td >
2021-07-21 11:20:35 -04:00
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Role" %}< / th >
2023-08-02 19:25:52 +05:30
< td > {{ object.role|linkify }}< / td >
2021-07-21 11:20:35 -04:00
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Platform" %}< / th >
2022-03-22 14:51:20 -04:00
< td > {{ object.platform|linkify|placeholder }}< / td >
2021-07-21 11:20:35 -04:00
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Primary IPv4" %}< / th >
2021-07-21 11:20:35 -04:00
< td >
2021-12-15 08:28:58 -05:00
{% if object.primary_ip4 %}
2023-07-06 23:49:55 +05:30
< a href = "{{ object.primary_ip4.get_absolute_url }}" id = "primary_ip4" > {{ object.primary_ip4.address.ip }}< / a >
2021-12-15 08:28:58 -05:00
{% if object.primary_ip4.nat_inside %}
2023-07-29 03:30:25 +07:00
({% trans "NAT for" %} < a href = "{{ object.primary_ip4.nat_inside.get_absolute_url }}" > {{ object.primary_ip4.nat_inside.address.ip }}< / a > )
2022-08-22 15:17:35 -05:00
{% elif object.primary_ip4.nat_outside.exists %}
2023-07-29 03:30:25 +07:00
({% trans "NAT" %}: {% for nat in object.primary_ip4.nat_outside.all %}< a href = "{{ nat.get_absolute_url }}" > {{ nat.address.ip }}< / a > {% if not forloop.last %}, {% endif %}{% endfor %})
2021-07-21 11:20:35 -04:00
{% endif %}
2023-07-06 23:49:55 +05:30
{% copy_content "primary_ip4" %}
2021-12-15 08:28:58 -05:00
{% else %}
2022-06-15 22:33:21 +02:00
{{ ''|placeholder }}
2021-12-15 08:28:58 -05:00
{% endif %}
2021-07-21 11:20:35 -04:00
< / td >
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Primary IPv6" %}< / th >
2021-07-21 11:20:35 -04:00
< td >
2021-12-15 08:28:58 -05:00
{% if object.primary_ip6 %}
2023-07-06 23:49:55 +05:30
< a href = "{{ object.primary_ip6.get_absolute_url }}" id = "primary_ip6" > {{ object.primary_ip6.address.ip }}< / a >
2021-12-15 08:28:58 -05:00
{% if object.primary_ip6.nat_inside %}
2023-07-29 03:30:25 +07:00
({% trans "NAT for" %} < a href = "{{ object.primary_ip6.nat_inside.get_absolute_url }}" > {{ object.primary_ip6.nat_inside.address.ip }}< / a > )
2022-08-22 15:17:35 -05:00
{% elif object.primary_ip6.nat_outside.exists %}
2023-07-29 03:30:25 +07:00
({% trans "NAT" %}: {% for nat in object.primary_ip6.nat_outside.all %}< a href = "{{ nat.get_absolute_url }}" > {{ nat.address.ip }}< / a > {% if not forloop.last %}, {% endif %}{% endfor %})
2021-07-21 11:20:35 -04:00
{% endif %}
2023-07-06 23:49:55 +05:30
{% copy_content "primary_ip6" %}
2021-12-15 08:28:58 -05:00
{% else %}
2022-06-15 22:33:21 +02:00
{{ ''|placeholder }}
2021-12-15 08:28:58 -05:00
{% endif %}
2021-07-21 11:20:35 -04:00
< / td >
< / tr >
2023-07-25 19:40:40 +01:00
< tr >
< th scope = "row" > Out-of-band IP< / th >
< td >
{% if object.oob_ip %}
< a href = "{{ object.oob_ip.get_absolute_url }}" id = "oob_ip" > {{ object.oob_ip.address.ip }}< / a >
{% copy_content "oob_ip" %}
{% else %}
{{ ''|placeholder }}
{% endif %}
< / td >
< / tr >
2021-07-21 11:20:35 -04:00
{% if object.cluster %}
< tr >
2023-07-29 03:30:25 +07:00
< th > {% trans "Cluster" %}< / th >
2021-07-21 11:20:35 -04:00
< td >
{% if object.cluster.group %}
2022-03-22 14:51:20 -04:00
{{ object.cluster.group|linkify }} /
2021-07-21 11:20:35 -04:00
{% endif %}
2022-03-22 14:51:20 -04:00
{{ object.cluster|linkify }}
2021-07-21 11:20:35 -04:00
< / td >
< / tr >
2021-04-21 13:20:09 -07:00
{% endif %}
2021-07-21 11:20:35 -04:00
< / table >
< / div >
< / div >
{% if object.powerports.exists and object.poweroutlets.exists %}
< div class = "card" >
< h5 class = "card-header" >
2023-07-29 03:30:25 +07:00
{% trans "Power Utilization" %}
2021-07-21 11:20:35 -04:00
< / h5 >
< div class = "card-body" >
< table class = "table table-hover" >
< tr >
2023-07-29 03:30:25 +07:00
< th > {% trans "Input" %}< / th >
< th > {% trans "Outlets" %}< / th >
< th > {% trans "Allocated" %}< / th >
< th > {% trans "Available" %}< / th >
< th > {% trans "Utilization" %}< / th >
2021-07-21 11:20:35 -04:00
< / tr >
{% for powerport in object.powerports.all %}
2022-11-28 08:45:24 -08:00
{% with utilization=powerport.get_power_draw powerfeed=powerport.connected_endpoints.0 %}
2021-04-21 13:20:09 -07:00
< tr >
2021-07-21 11:20:35 -04:00
< td > {{ powerport }}< / td >
< td > {{ utilization.outlet_count }}< / td >
2023-07-29 03:30:25 +07:00
< td > {{ utilization.allocated }}{% trans "VA" %}< / td >
2021-07-21 11:20:35 -04:00
{% if powerfeed.available_power %}
2023-07-29 03:30:25 +07:00
< td > {{ powerfeed.available_power }}{% trans "VA" %}< / td >
2021-07-21 11:20:35 -04:00
< td > {% utilization_graph utilization.allocated|percentage:powerfeed.available_power %}< / td >
{% else %}
< td class = "text-muted" > — < / td >
< td class = "text-muted" > — < / td >
{% endif %}
2021-04-21 13:20:09 -07:00
< / tr >
2021-07-21 11:20:35 -04:00
{% for leg in utilization.legs %}
< tr >
2023-08-02 14:53:32 -04:00
< td style = "padding-left: 20px" >
2023-09-11 14:16:29 -04:00
{% trans "Leg" context "Leg of a power feed" %} {{ leg.name }}
2023-08-02 14:53:32 -04:00
< / td >
2021-07-21 11:20:35 -04:00
< td > {{ leg.outlet_count }}< / td >
< td > {{ leg.allocated }}< / td >
2022-11-18 05:55:28 -08:00
{% if powerfeed.available_power %}
{% with phase_available=powerfeed.available_power|divide:3 %}
2023-07-29 03:30:25 +07:00
< td > {{ phase_available }}{% trans "VA" %}< / td >
2022-11-18 05:55:28 -08:00
< td > {% utilization_graph leg.allocated|percentage:phase_available %}< / td >
{% endwith %}
{% else %}
< td class = "text-muted" > — < / td >
< td class = "text-muted" > — < / td >
{% endif %}
2021-07-21 11:20:35 -04:00
< / tr >
2021-04-21 13:20:09 -07:00
{% endfor %}
2021-07-21 11:20:35 -04:00
{% endwith %}
{% endfor %}
< / table >
2021-04-21 13:20:09 -07:00
< / div >
< / div >
2021-07-21 11:20:35 -04:00
{% endif %}
2023-01-25 20:25:06 -05:00
< div class = "card" >
2023-07-29 03:30:25 +07:00
< h5 class = "card-header" > {% trans "Services" %}< / h5 >
2023-01-25 20:25:06 -05:00
< div class = "card-body htmx-container table-responsive"
hx-get="{% url 'ipam:service_list' %}?device_id={{ object.pk }}"
hx-trigger="load"
>< / div >
{% if perms.ipam.add_service %}
< div class = "card-footer text-end noprint" >
< a href = "{% url 'ipam:service_add' %}?device={{ object.pk }}" class = "btn btn-sm btn-primary" >
2023-07-29 03:30:25 +07:00
< span class = "mdi mdi-plus-thick" aria-hidden = "true" > < / span > {% trans "Add a service" %}
2023-01-25 20:25:06 -05:00
< / a >
< / div >
{% endif %}
< / div >
2021-10-19 14:21:31 -04:00
{% include 'inc/panels/image_attachments.html' %}
2023-05-08 18:26:28 +05:30
< div class = "card" >
2023-07-29 03:30:25 +07:00
< h5 class = "card-header" > {% trans "Dimensions" %}< / h5 >
2023-05-08 18:26:28 +05:30
< div class = "card-body table-responsive" >
< table class = "table table-hover attr-table" >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Height" %}< / th >
2023-05-08 18:26:28 +05:30
< td >
{{ object.device_type.u_height }}U
< / td >
< / tr >
< tr >
2023-07-29 03:30:25 +07:00
< th scope = "row" > {% trans "Weight" %}< / th >
2023-05-08 18:26:28 +05:30
< td >
2023-05-09 19:05:00 +05:30
{% if object.total_weight %}
2023-07-29 03:30:25 +07:00
{{ object.total_weight|floatformat }} {% trans "Kilograms" %}
2023-05-08 18:26:28 +05:30
{% else %}
{{ ''|placeholder }}
{% endif %}
< / td >
< / tr >
< / table >
< / div >
< / div >
2022-10-03 10:55:05 -07:00
{% if object.rack and object.position %}
2022-11-15 11:24:36 -05:00
< div class = "row" style = "margin-bottom: 20px" >
2022-10-03 10:55:05 -07:00
< div class = "col col-md-6 col-sm-6 col-xs-12 text-center" >
< div style = "margin-left: 30px" >
2023-07-29 03:30:25 +07:00
< h4 > {% trans "Front" %}< / h4 >
2022-10-03 10:55:05 -07:00
{% include 'dcim/inc/rack_elevation.html' with object=object.rack face='front' extra_params=svg_extra %}
< / div >
< / div >
< div class = "col col-md-6 col-sm-6 col-xs-12 text-center" >
< div style = "margin-left: 30px" >
2023-07-29 03:30:25 +07:00
< h4 > {% trans "Rear" %}< / h4 >
2022-10-03 10:55:05 -07:00
{% include 'dcim/inc/rack_elevation.html' with object=object.rack face='rear' extra_params=svg_extra %}
< / div >
< / div >
2022-11-15 11:24:36 -05:00
< / div >
2022-10-03 10:55:05 -07:00
{% endif %}
2021-07-21 11:20:35 -04:00
{% plugin_right_page object %}
< / div >
< / div >
< div class = "row" >
< div class = "col col-md-12" >
{% plugin_full_width_page object %}
2020-11-13 15:00:12 -05:00
< / div >
< / div >
{% endblock %}