Remove padding surrounding tables inside cards

This commit is contained in:
Jeremy Stretch 2024-01-12 10:55:35 -05:00
parent a16f272535
commit d8e853d1fc
112 changed files with 4579 additions and 5006 deletions

Binary file not shown.

View File

@ -21,5 +21,10 @@
padding: 0.5rem 0.75rem; padding: 0.5rem 0.75rem;
} }
// Remove bottom margin
.table {
margin-bottom: 0;
}
} }
} }

View File

@ -15,7 +15,6 @@ table.attr-table {
th { th {
color: $gray-700; color: $gray-700;
font-weight: normal; font-weight: normal;
padding-left: 0;
} }
// Restyle row border // Restyle row border

View File

@ -10,40 +10,38 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Account Details" %}</h5> <h5 class="card-header">{% trans "Account Details" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Username" %}</th>
<th scope="row">{% trans "Username" %}</th> <td>{{ request.user.username }}</td>
<td>{{ request.user.username }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Full Name" %}</th>
<th scope="row">{% trans "Full Name" %}</th> <td>
<td> {% if request.user.first_name or request.user.last_name %}
{% if request.user.first_name or request.user.last_name %} {{ request.user.first_name }} {{ request.user.last_name }}
{{ request.user.first_name }} {{ request.user.last_name }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Email" %}</th>
<th scope="row">{% trans "Email" %}</th> <td>{{ request.user.email|placeholder }}</td>
<td>{{ request.user.email|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Account Created" %}</th>
<th scope="row">{% trans "Account Created" %}</th> <td>{{ request.user.date_joined|annotated_date }}</td>
<td>{{ request.user.date_joined|annotated_date }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Superuser" %}</th>
<th scope="row">{% trans "Superuser" %}</th> <td>{% checkmark request.user.is_superuser %}</td>
<td>{% checkmark request.user.is_superuser %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Admin Access" %}</th>
<th scope="row">{% trans "Admin Access" %}</th> <td>{% checkmark request.user.is_staff %}</td>
<td>{% checkmark request.user.is_staff %}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">

View File

@ -17,47 +17,45 @@
<div class="col col-md-12"> <div class="col col-md-12">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Token" %}</h5> <h5 class="card-header">{% trans "Token" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Key" %}</th>
<th scope="row">{% trans "Key" %}</th> <td>
<td> {% if key %}
{% if key %} <div class="float-end">
<div class="float-end"> {% copy_content "token_id" %}
{% copy_content "token_id" %} </div>
</div> <div id="token_id">{{ key }}</div>
<div id="token_id">{{ key }}</div> {% else %}
{% else %} {{ object.partial }}
{{ object.partial }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Write enabled" %}</th>
<th scope="row">{% trans "Write enabled" %}</th> <td>{% checkmark object.write_enabled %}</td>
<td>{% checkmark object.write_enabled %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Created" %}</th>
<th scope="row">{% trans "Created" %}</th> <td>{{ object.created|annotated_date }}</td>
<td>{{ object.created|annotated_date }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Expires" %}</th>
<th scope="row">{% trans "Expires" %}</th> <td>{{ object.expires|placeholder }}</td>
<td>{{ object.expires|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Last used" %}</th>
<th scope="row">{% trans "Last used" %}</th> <td>{{ object.last_used|placeholder }}</td>
<td>{{ object.last_used|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Allowed IPs" %}</th>
<th scope="row">{% trans "Allowed IPs" %}</th> <td>{{ object.allowed_ips|join:", "|placeholder }}</td>
<td>{{ object.allowed_ips|join:", "|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -13,55 +13,53 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Circuit" %}</h5> <h5 class="card-header">{% trans "Circuit" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Provider" %}</th>
<th scope="row">{% trans "Provider" %}</th> <td>{{ object.provider|linkify }}</td>
<td>{{ object.provider|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Account" %}</th>
<th scope="row">{% trans "Account" %}</th> <td>{{ object.provider_account|linkify|placeholder }}</td>
<td>{{ object.provider_account|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Circuit ID" %}</th>
<th scope="row">{% trans "Circuit ID" %}</th> <td>{{ object.cid }}</td>
<td>{{ object.cid }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Type" %}</th>
<th scope="row">{% trans "Type" %}</th> <td>{{ object.type|linkify }}</td>
<td>{{ object.type|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Status" %}</th>
<th scope="row">{% trans "Status" %}</th> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Tenant" %}</th>
<th scope="row">{% trans "Tenant" %}</th> <td>
<td> {% if object.tenant.group %}
{% if object.tenant.group %} {{ object.tenant.group|linkify }} /
{{ object.tenant.group|linkify }} / {% endif %}
{% endif %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant|linkify|placeholder }} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Install Date" %}</th>
<th scope="row">{% trans "Install Date" %}</th> <td>{{ object.install_date|annotated_date|placeholder }}</td>
<td>{{ object.install_date|annotated_date|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Termination Date" %}</th>
<th scope="row">{% trans "Termination Date" %}</th> <td>{{ object.termination_date|annotated_date|placeholder }}</td>
<td>{{ object.termination_date|annotated_date|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Commit Rate" %}</th>
<th scope="row">{% trans "Commit Rate" %}</th> <td>{{ object.commit_rate|humanize_speed|placeholder }}</td>
<td>{{ object.commit_rate|humanize_speed|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -16,31 +16,27 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Circuit Type" %}</h5>
{% trans "Circuit Type" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Color" %}</th>
</tr> <td>
<tr> {% if object.color %}
<th scope="row">{% trans "Color" %}</th> <span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
<td> {% else %}
{% if object.color %} {{ ''|placeholder }}
<span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span> {% endif %}
{% else %} </td>
{{ ''|placeholder }} </tr>
{% endif %} </table>
</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -25,7 +25,6 @@
{% endif %} {% endif %}
</div> </div>
</h5> </h5>
<div class="card-body">
{% if termination %} {% if termination %}
<table class="table table-hover attr-table"> <table class="table table-hover attr-table">
{% if termination.site %} {% if termination.site %}
@ -151,7 +150,8 @@
{% endfor %} {% endfor %}
</table> </table>
{% else %} {% else %}
<div class="card-body">
<span class="text-muted">{% trans "None" %}</span> <span class="text-muted">{% trans "None" %}</span>
</div>
{% endif %} {% endif %}
</div>
</div> </div>

View File

@ -17,25 +17,23 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Provider" %}</h5> <h5 class="card-header">{% trans "Provider" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "ASNs" %}</th>
<th scope="row">{% trans "ASNs" %}</th> <td>
<td> {% for asn in object.asns.all %}
{% for asn in object.asns.all %} {{ asn|linkify }}{% if not forloop.last %}, {% endif %}
{{ asn|linkify }}{% if not forloop.last %}, {% endif %} {% empty %}
{% empty %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endfor %}
{% endfor %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/comments.html' %} {% include 'inc/panels/comments.html' %}

View File

@ -15,22 +15,20 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Provider Account" %}</h5> <h5 class="card-header">{% trans "Provider Account" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Provider" %}</th>
<th scope="row">{% trans "Provider" %}</th> <td>{{ object.provider|linkify }}</td>
<td>{{ object.provider|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Account" %}</th>
<th scope="row">{% trans "Account" %}</th> <td>{{ object.account }}</td>
<td>{{ object.account }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name|placeholder }}</td>
<td>{{ object.name|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -11,53 +11,49 @@
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Provider Network" %}</h5>
{% trans "Provider Network" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Provider" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.provider|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Provider" %}</th> <tr>
<td>{{ object.provider|linkify }}</td> <th scope="row">{% trans "Name" %}</th>
</tr> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Service ID" %}</th>
</tr> <td>{{ object.service_id|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Service ID" %}</th> <tr>
<td>{{ object.service_id|placeholder }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td> </div>
</tr> {% include 'inc/panels/tags.html' %}
</table> {% plugin_left_page object %}
</div>
</div>
{% include 'inc/panels/tags.html' %}
{% plugin_left_page object %}
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">
{% include 'inc/panels/related_objects.html' %} {% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/comments.html' %} {% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %} {% plugin_right_page object %}
</div>
</div>
<div class="row mb-3">
<div class="col col-md-12">
<div class="card">
<h5 class="card-header">{% trans "Circuits" %}</h5>
<div class="card-body htmx-container table-responsive p-0"
hx-get="{% url 'circuits:circuit_list' %}?provider_network_id={{ object.pk }}"
hx-trigger="load"
></div>
</div>
{% plugin_full_width_page object %}
</div> </div>
</div>
<div class="row mb-3">
<div class="col col-md-12">
<div class="card">
<h5 class="card-header">{% trans "Circuits" %}</h5>
<div class="card-body htmx-container table-responsive p-0"
hx-get="{% url 'circuits:circuit_list' %}?provider_network_id={{ object.pk }}"
hx-trigger="load"
></div>
</div>
{% plugin_full_width_page object %}
</div> </div>
</div>
{% endblock %} {% endblock %}

View File

@ -41,180 +41,162 @@
<div class="col col-md-12"> <div class="col col-md-12">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Rack Elevations" %}</h5> <h5 class="card-header">{% trans "Rack Elevations" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Default unit height" %}</th>
<th scope="row">{% trans "Default unit height" %}</th> <td>{{ object.data.RACK_ELEVATION_DEFAULT_UNIT_HEIGHT }}</td>
<td>{{ object.data.RACK_ELEVATION_DEFAULT_UNIT_HEIGHT }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Default unit width" %}</th>
<th scope="row">{% trans "Default unit width" %}</th> <td>{{ object.data.RACK_ELEVATION_DEFAULT_UNIT_WIDTH }}</td>
<td>{{ object.data.RACK_ELEVATION_DEFAULT_UNIT_WIDTH }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Power Feeds" %}</h5> <h5 class="card-header">{% trans "Power Feeds" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Default voltage" %}</th>
<th scope="row">{% trans "Default voltage" %}</th> <td>{{ object.data.POWERFEED_DEFAULT_VOLTAGE }}</td>
<td>{{ object.data.POWERFEED_DEFAULT_VOLTAGE }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Default amperage" %}</th>
<th scope="row">{% trans "Default amperage" %}</th> <td>{{ object.data.POWERFEED_DEFAULT_AMPERAGE }}</td>
<td>{{ object.data.POWERFEED_DEFAULT_AMPERAGE }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Default max utilization" %}</th>
<th scope="row">{% trans "Default max utilization" %}</th> <td>{{ object.data.POWERFEED_DEFAULT_MAX_UTILIZATION }}</td>
<td>{{ object.data.POWERFEED_DEFAULT_MAX_UTILIZATION }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "IPAM" %}</h5> <h5 class="card-header">{% trans "IPAM" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Enforce global unique" %}</th>
<th scope="row">{% trans "Enforce global unique" %}</th> <td>{{ object.data.ENFORCE_GLOBAL_UNIQUE }}</td>
<td>{{ object.data.ENFORCE_GLOBAL_UNIQUE }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Prefer IPv4" %}</th>
<th scope="row">{% trans "Prefer IPv4" %}</th> <td>{{ object.data.PREFER_IPV4 }}</td>
<td>{{ object.data.PREFER_IPV4 }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Security" %}</h5> <h5 class="card-header">{% trans "Security" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Allowed URL schemes" %}</th>
<th scope="row">{% trans "Allowed URL schemes" %}</th> <td>{{ object.data.ALLOWED_URL_SCHEMES|join:", "|placeholder }}</td>
<td>{{ object.data.ALLOWED_URL_SCHEMES|join:", "|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Banners" %}</h5> <h5 class="card-header">{% trans "Banners" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Login banner" %}</th>
<th scope="row">{% trans "Login banner" %}</th> <td>{{ object.data.BANNER_LOGIN }}</td>
<td>{{ object.data.BANNER_LOGIN }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Maintenance banner" %}</th>
<th scope="row">{% trans "Maintenance banner" %}</th> <td>{{ object.data.BANNER_MAINTENANCE }}</td>
<td>{{ object.data.BANNER_MAINTENANCE }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Top banner" %}</th>
<th scope="row">{% trans "Top banner" %}</th> <td>{{ object.data.BANNER_TOP }}</td>
<td>{{ object.data.BANNER_TOP }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Bottom banner" %}</th>
<th scope="row">{% trans "Bottom banner" %}</th> <td>{{ object.data.BANNER_BOTTOM }}</td>
<td>{{ object.data.BANNER_BOTTOM }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Pagination" %}</h5> <h5 class="card-header">{% trans "Pagination" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Paginate count" %}</th>
<th scope="row">{% trans "Paginate count" %}</th> <td>{{ object.data.PAGINATE_COUNT }}</td>
<td>{{ object.data.PAGINATE_COUNT }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Max page size" %}</th>
<th scope="row">{% trans "Max page size" %}</th> <td>{{ object.data.MAX_PAGE_SIZE }}</td>
<td>{{ object.data.MAX_PAGE_SIZE }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Validation" %}</h5> <h5 class="card-header">{% trans "Validation" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Custom validators" %}</th>
<th scope="row">{% trans "Custom validators" %}</th> {% if object.data.CUSTOM_VALIDATORS %}
{% if object.data.CUSTOM_VALIDATORS %} <td class="font-monospace">
<td class="font-monospace"> <pre>{{ object.data.CUSTOM_VALIDATORS|json }}</pre>
<pre>{{ object.data.CUSTOM_VALIDATORS|json }}</pre> </td>
</td> {% else %}
{% else %} <td>{{ ''|placeholder }}</td>
<td>{{ ''|placeholder }}</td> {% endif %}
{% endif %} </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Protection rules" %}</th>
<th scope="row">{% trans "Protection rules" %}</th> {% if object.data.PROTECTION_RULES %}
{% if object.data.PROTECTION_RULES %} <td>
<td> <pre>{{ object.data.PROTECTION_RULES|json }}</pre>
<pre>{{ object.data.PROTECTION_RULES|json }}</pre> </td>
</td> {% else %}
{% else %} <td>{{ ''|placeholder }}</td>
<td>{{ ''|placeholder }}</td> {% endif %}
{% endif %} </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "User Preferences" %}</h5> <h5 class="card-header">{% trans "User Preferences" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Default user preferences" %}</th>
<th scope="row">{% trans "Default user preferences" %}</th> {% if object.data.DEFAULT_USER_PREFERENCES %}
{% if object.data.DEFAULT_USER_PREFERENCES %} <td>
<td> <pre>{{ object.data.DEFAULT_USER_PREFERENCES|json }}</pre>
<pre>{{ object.data.DEFAULT_USER_PREFERENCES|json }}</pre> </td>
</td> {% else %}
{% else %} <td>{{ ''|placeholder }}</td>
<td>{{ ''|placeholder }}</td> {% endif %}
{% endif %} </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Miscellaneous" %}</h5> <h5 class="card-header">{% trans "Miscellaneous" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Maintenance mode" %}</th>
<th scope="row">{% trans "Maintenance mode" %}</th> <td>{{ object.data.MAINTENANCE_MODE }}</td>
<td>{{ object.data.MAINTENANCE_MODE }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "GraphQL enabled" %}</th>
<th scope="row">{% trans "GraphQL enabled" %}</th> <td>{{ object.data.GRAPHQL_ENABLED }}</td>
<td>{{ object.data.GRAPHQL_ENABLED }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Changelog retention" %}</th>
<th scope="row">{% trans "Changelog retention" %}</th> <td>{{ object.data.CHANGELOG_RETENTION }}</td>
<td>{{ object.data.CHANGELOG_RETENTION }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Job retention" %}</th>
<th scope="row">{% trans "Job retention" %}</th> <td>{{ object.data.JOB_RETENTION }}</td>
<td>{{ object.data.JOB_RETENTION }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Maps URL" %}</th>
<th scope="row">{% trans "Maps URL" %}</th> <td>{{ object.data.MAPS_URL }}</td>
<td>{{ object.data.MAPS_URL }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">

View File

@ -30,36 +30,34 @@
<div class="col"> <div class="col">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Data File" %}</h5> <h5 class="card-header">{% trans "Data File" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Source" %}</th>
<th scope="row">{% trans "Source" %}</th> <td>{{ object.source|linkify }}</td>
<td>{{ object.source|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Path" %}</th>
<th scope="row">{% trans "Path" %}</th> <td>
<td> <span class="font-monospace" id="datafile_path">{{ object.path }}</span>
<span class="font-monospace" id="datafile_path">{{ object.path }}</span> {% copy_content "datafile_path" %}
{% copy_content "datafile_path" %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Last Updated" %}</th>
<th scope="row">{% trans "Last Updated" %}</th> <td>{{ object.last_updated }}</td>
<td>{{ object.last_updated }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Size" %}</th>
<th scope="row">{% trans "Size" %}</th> <td>{{ object.size }} {% trans "bytes" %}</td>
<td>{{ object.size }} {% trans "bytes" %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "SHA256 Hash" %}</th>
<th scope="row">{% trans "SHA256 Hash" %}</th> <td>
<td> <span class="font-monospace" id="datafile_hash">{{ object.hash }}</span>
<span class="font-monospace" id="datafile_hash">{{ object.hash }}</span> {% copy_content "datafile_hash" %}
{% copy_content "datafile_hash" %} </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Content" %}</h5> <h5 class="card-header">{% trans "Content" %}</h5>

View File

@ -29,53 +29,51 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Data Source" %}</h5> <h5 class="card-header">{% trans "Data Source" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Type" %}</th>
<th scope="row">{% trans "Type" %}</th> <td>{{ object.get_type_display }}</td>
<td>{{ object.get_type_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Enabled" %}</th>
<th scope="row">{% trans "Enabled" %}</th> <td>{% checkmark object.enabled %}</td>
<td>{% checkmark object.enabled %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Status" %}</th>
<th scope="row">{% trans "Status" %}</th> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Last synced" %}</th>
<th scope="row">{% trans "Last synced" %}</th> <td>{{ object.last_synced|placeholder }}</td>
<td>{{ object.last_synced|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "URL" %}</th>
<th scope="row">{% trans "URL" %}</th> <td>
<td> {% if not object.type.is_local %}
{% if not object.type.is_local %} <a href="{{ object.source_url }}">{{ object.source_url }}</a>
<a href="{{ object.source_url }}">{{ object.source_url }}</a> {% else %}
{% else %} {{ object.source_url }}
{{ object.source_url }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Ignore rules" %}</th>
<th scope="row">{% trans "Ignore rules" %}</th> <td>
<td> {% if object.ignore_rules %}
{% if object.ignore_rules %} <pre>{{ object.ignore_rules }}</pre>
<pre>{{ object.ignore_rules }}</pre> {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}</td>
{% endif %}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/comments.html' %} {% include 'inc/panels/comments.html' %}
@ -84,7 +82,6 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Backend" %}</h5> <h5 class="card-header">{% trans "Backend" %}</h5>
<div class="card-body">
{% with backend=object.backend_class %} {% with backend=object.backend_class %}
<table class="table table-hover attr-table"> <table class="table table-hover attr-table">
{% for name, field in backend.parameters.items %} {% for name, field in backend.parameters.items %}
@ -104,8 +101,7 @@
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
{% endwith %} {% endwith %}
</div>
</div> </div>
{% include 'inc/panels/related_objects.html' %} {% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}

View File

@ -19,64 +19,60 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Job" %}</h5> <h5 class="card-header">{% trans "Job" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<th scope="row">{% trans "Object Type" %}</th>
<td>
<a href="{% url 'core:job_list' %}?object_type={{ object.object_type_id }}">{{ object.object_type }}</a>
</td>
</tr>
<tr>
<th scope="row">{% trans "Name" %}</th>
<td>{{ object.name|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Status" %}</th>
<td>{% badge object.get_status_display object.get_status_color %}</td>
</tr>
{% if object.error %}
<tr> <tr>
<th scope="row">{% trans "Object Type" %}</th> <th scope="row">{% trans "Error" %}</th>
<td> <td>{{ object.error }}</td>
<a href="{% url 'core:job_list' %}?object_type={{ object.object_type_id }}">{{ object.object_type }}</a>
</td>
</tr> </tr>
<tr> {% endif %}
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name|placeholder }}</td> <th scope="row">{% trans "Created By" %}</th>
</tr> <td>{{ object.user|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Status" %}</th> </table>
<td>{% badge object.get_status_display object.get_status_color %}</td>
</tr>
{% if object.error %}
<tr>
<th scope="row">{% trans "Error" %}</th>
<td>{{ object.error }}</td>
</tr>
{% endif %}
<tr>
<th scope="row">{% trans "Created By" %}</th>
<td>{{ object.user|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Scheduling" %}</h5> <h5 class="card-header">{% trans "Scheduling" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Created" %}</th>
<th scope="row">{% trans "Created" %}</th> <td>{{ object.created|annotated_date }}</td>
<td>{{ object.created|annotated_date }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Scheduled" %}</th>
<th scope="row">{% trans "Scheduled" %}</th> <td>
<td> {{ object.scheduled|annotated_date|placeholder }}
{{ object.scheduled|annotated_date|placeholder }} {% if object.interval %}
{% if object.interval %} ({% blocktrans with interval=object.interval %}every {{ interval }} seconds{% endblocktrans %})
({% blocktrans with interval=object.interval %}every {{ interval }} seconds{% endblocktrans %}) {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Started" %}</th>
<th scope="row">{% trans "Started" %}</th> <td>{{ object.started|annotated_date|placeholder }}</td>
<td>{{ object.started|annotated_date|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Completed" %}</th>
<th scope="row">{% trans "Completed" %}</th> <td>{{ object.completed|annotated_date|placeholder }}</td>
<td>{{ object.completed|annotated_date|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -10,55 +10,53 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Cable" %}</h5> <h5 class="card-header">{% trans "Cable" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Type" %}</th>
<th scope="row">{% trans "Type" %}</th> <td>{{ object.get_type_display|placeholder }}</td>
<td>{{ object.get_type_display|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Status" %}</th>
<th scope="row">{% trans "Status" %}</th> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Tenant" %}</th>
<th scope="row">{% trans "Tenant" %}</th> <td>
<td> {% if object.tenant.group %}
{% if object.tenant.group %} {{ object.tenant.group|linkify }} /
{{ object.tenant.group|linkify }} / {% endif %}
{% endif %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant|linkify|placeholder }} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Label" %}</th>
<th scope="row">{% trans "Label" %}</th> <td>{{ object.label|placeholder }}</td>
<td>{{ object.label|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Color" %}</th>
<th scope="row">{% trans "Color" %}</th> <td>
<td> {% if object.color %}
{% if object.color %} <span class="color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
<span class="color-label" style="background-color: #{{ object.color }}">&nbsp;</span> {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Length" %}</th>
<th scope="row">{% trans "Length" %}</th> <td>
<td> {% if object.length is not None %}
{% if object.length is not None %} {{ object.length|floatformat }} {{ object.get_length_unit_display }}
{{ object.length|floatformat }} {{ object.get_length_unit_display }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -68,15 +66,11 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Termination" %} A</h5> <h5 class="card-header">{% trans "Termination" %} A</h5>
<div class="card-body"> {% include 'dcim/inc/cable_termination.html' with terminations=object.a_terminations %}
{% include 'dcim/inc/cable_termination.html' with terminations=object.a_terminations %}
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Termination" %} B</h5> <h5 class="card-header">{% trans "Termination" %} B</h5>
<div class="card-body"> {% include 'dcim/inc/cable_termination.html' with terminations=object.b_terminations %}
{% include 'dcim/inc/cable_termination.html' with terminations=object.b_terminations %}
</div>
</div> </div>
{% plugin_right_page object %} {% plugin_right_page object %}
</div> </div>

View File

@ -79,43 +79,39 @@
{# Related paths #} {# Related paths #}
<div class="col col-md-7"> <div class="col col-md-7">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Related Paths" %}</h5>
{% trans "Related Paths" %} <table class="table table-hover">
</h5> <thead>
<div class="card-body"> <tr>
<table class="table table-hover"> <th>{% trans "Origin" %}</th>
<thead> <th>{% trans "Destination" %}</th>
<tr> <th>{% trans "Segments" %}</th>
<th>{% trans "Origin" %}</th> </tr>
<th>{% trans "Destination" %}</th> </thead>
<th>{% trans "Segments" %}</th> <tbody>
</tr> {% for cablepath in related_paths %}
</thead> <tr{% if cablepath.pk == path.pk %} class="info"{% endif %}>
<tbody> <td>
{% for cablepath in related_paths %} <a href="?cablepath_id={{ cablepath.pk }}">{{ cablepath.origins|join:", " }}</a>
<tr{% if cablepath.pk == path.pk %} class="info"{% endif %}>
<td>
<a href="?cablepath_id={{ cablepath.pk }}">{{ cablepath.origins|join:", " }}</a>
</td>
<td>
{% if cablepath.destinations %}
{{ cablepath.destinations|join:", " }}
{% else %}
<span class="text-muted">{% trans "Incomplete" %}</span>
{% endif %}
</td>
<td>
{{ cablepath.segment_count }}
</td>
</tr>
{% empty %}
<td colspan="3" class="text-muted">
{% trans "None found" %}
</td> </td>
{% endfor %} <td>
</tbody> {% if cablepath.destinations %}
</table> {{ cablepath.destinations|join:", " }}
</div> {% else %}
<span class="text-muted">{% trans "Incomplete" %}</span>
{% endif %}
</td>
<td>
{{ cablepath.segment_count }}
</td>
</tr>
{% empty %}
<td colspan="3" class="text-muted">
{% trans "None found" %}
</td>
{% endfor %}
</tbody>
</table>
</div> </div>
</div> </div>

View File

@ -14,41 +14,37 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Console Port" %}</h5>
{% trans "Console Port" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Device" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.device|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Device" %}</th> <tr>
<td>{{ object.device|linkify }}</td> <th scope="row">{% trans "Module" %}</th>
</tr> <td>{{ object.module|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Module" %}</th> <tr>
<td>{{ object.module|linkify|placeholder }}</td> <th scope="row">{% trans "Name" %}</th>
</tr> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Label" %}</th>
</tr> <td>{{ object.label|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Label" %}</th> <tr>
<td>{{ object.label|placeholder }}</td> <th scope="row">{% trans "Type" %}</th>
</tr> <td>{{ object.get_type_display }}</td>
<tr> </tr>
<th scope="row">{% trans "Type" %}</th> <tr>
<td>{{ object.get_type_display }}</td> <th scope="row">{% trans "Speed" %}</th>
</tr> <td>{{ object.get_speed_display }}</td>
<tr> </tr>
<th scope="row">{% trans "Speed" %}</th> <tr>
<td>{{ object.get_speed_display }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -57,35 +53,36 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Connection" %}</h5> <h5 class="card-header">{% trans "Connection" %}</h5>
<div class="card-body"> {% if object.mark_connected %}
{% if object.mark_connected %} <div class="card-body">
<span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% trans "Marked as connected" %} <span class="text-success"><i class="mdi mdi-check-bold"></i></span>
{% elif object.cable %} {% trans "Marked as connected" %}
{% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:consoleport_trace' %} </div>
{% else %} {% elif object.cable %}
<div class="text-muted"> {% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:consoleport_trace' %}
{% trans "Not Connected" %} {% else %}
{% if perms.dcim.add_cable %} <div class="card-body text-muted">
<div class="dropdown float-end"> {% trans "Not Connected" %}
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"> {% if perms.dcim.add_cable %}
<span class="mdi mdi-ethernet-cable" aria-hidden="true"></span> {% trans "Connect" %} <div class="dropdown float-end">
</button> <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
<ul class="dropdown-menu dropdown-menu-end"> <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span> {% trans "Connect" %}
<li> </button>
<a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleport&a_terminations={{ object.pk }}&b_terminations_type=dcim.consoleserverport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Console Server Port" %}</a> <ul class="dropdown-menu dropdown-menu-end">
</li> <li>
<li> <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleport&a_terminations={{ object.pk }}&b_terminations_type=dcim.consoleserverport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Console Server Port" %}</a>
<a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleport&a_terminations={{ object.pk }}&b_terminations_type=dcim.frontport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Front Port" %}</a> </li>
</li> <li>
<li> <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleport&a_terminations={{ object.pk }}&b_terminations_type=dcim.frontport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Front Port" %}</a>
<a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleport&a_terminations={{ object.pk }}&b_terminations_type=dcim.rearport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Rear Port" %}</a> </li>
</li> <li>
</ul> <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleport&a_terminations={{ object.pk }}&b_terminations_type=dcim.rearport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Rear Port" %}</a>
</div> </li>
{% endif %} </ul>
</div> </div>
{% endif %} {% endif %}
</div> </div>
{% endif %}
</div> </div>
{% include 'dcim/inc/panels/inventory_items.html' %} {% include 'dcim/inc/panels/inventory_items.html' %}
{% plugin_right_page object %} {% plugin_right_page object %}

View File

@ -14,41 +14,37 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Console Server Port" %}</h5>
{% trans "Console Server Port" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Device" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.device|linkify }}</td>
<tr>
<th scope="row">{% trans "Device" %}</th>
<td>{{ object.device|linkify }}</td>
</tr>
<tr>
<th scope="row">{% trans "Module" %}</th>
<td>{{ object.module|linkify|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Name" %}</th>
<td>{{ object.name }}</td>
</tr>
<tr>
<th scope="row">{% trans "Label" %}</th>
<td>{{ object.label|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Type" %}</th>
<td>{{ object.get_type_display|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Speed" %}</th>
<td>{{ object.get_speed_display|placeholder }}</td>
</tr> </tr>
<tr> <tr>
<th scope="row">{% trans "Description" %}</th> <th scope="row">{% trans "Module" %}</th>
<td>{{ object.description|placeholder }}</td> <td>{{ object.module|linkify|placeholder }}</td>
</tr> </tr>
</table> <tr>
</div> <th scope="row">{% trans "Name" %}</th>
<td>{{ object.name }}</td>
</tr>
<tr>
<th scope="row">{% trans "Label" %}</th>
<td>{{ object.label|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Type" %}</th>
<td>{{ object.get_type_display|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Speed" %}</th>
<td>{{ object.get_speed_display|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Description" %}</th>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -58,34 +54,36 @@
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Connection" %}</h5> <h5 class="card-header">{% trans "Connection" %}</h5>
<div class="card-body"> <div class="card-body">
{% if object.mark_connected %} {% if object.mark_connected %}
<span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% trans "Marked as connected" %} <div class="card-body">
{% elif object.cable %} <span class="text-success"><i class="mdi mdi-check-bold"></i></span>
{% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:consoleserverport_trace' %} {% trans "Marked as connected" %}
{% else %} </div>
<div class="text-muted"> {% elif object.cable %}
{% trans "Not Connected" %} {% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:consoleserverport_trace' %}
{% if perms.dcim.add_cable %} {% else %}
<div class="dropdown float-end"> <div class="card-body text-muted">
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false"> {% trans "Not Connected" %}
<span class="mdi mdi-ethernet-cable" aria-hidden="true"></span> {% trans "Connect" %} {% if perms.dcim.add_cable %}
</button> <div class="dropdown float-end">
<ul class="dropdown-menu dropdown-menu-end"> <button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
<li> <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span> {% trans "Connect" %}
<a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleserverport&a_terminations={{ object.pk }}&b_terminations_type=dcim.consoleport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Console Port" %}</a> </button>
</li> <ul class="dropdown-menu dropdown-menu-end">
<li> <li>
<a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleserverport&a_terminations={{ object.pk }}&b_terminations_type=dcim.frontport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Front Port" %}</a> <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleserverport&a_terminations={{ object.pk }}&b_terminations_type=dcim.consoleport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Console Port" %}</a>
</li> </li>
<li> <li>
<a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleserverport&a_terminations={{ object.pk }}&b_terminations_type=dcim.rearport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Rear Port" %}</a> <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleserverport&a_terminations={{ object.pk }}&b_terminations_type=dcim.frontport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Front Port" %}</a>
</li> </li>
</ul> <li>
</div> <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.consoleserverport&a_terminations={{ object.pk }}&b_terminations_type=dcim.rearport&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Rear Port" %}</a>
{% endif %} </li>
</div> </ul>
{% endif %} </div>
</div> {% endif %}
</div>
{% endif %}
</div> </div>
{% include 'dcim/inc/panels/inventory_items.html' %} {% include 'dcim/inc/panels/inventory_items.html' %}
{% plugin_right_page object %} {% plugin_right_page object %}

View File

@ -12,142 +12,136 @@
<div class="col col-12 col-xl-6"> <div class="col col-12 col-xl-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Device" %}</h5> <h5 class="card-header">{% trans "Device" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Region" %}</th>
<th scope="row">{% trans "Region" %}</th> <td>{% nested_tree object.site.region %}</td>
<td>{% nested_tree object.site.region %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Site" %}</th>
<th scope="row">{% trans "Site" %}</th> <td>{{ object.site|linkify }}</td>
<td>{{ object.site|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Location" %}</th>
<th scope="row">{% trans "Location" %}</th> <td>{% nested_tree object.location %}</td>
<td>{% nested_tree object.location %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Rack" %}</th>
<th scope="row">{% trans "Rack" %}</th> <td class="position-relative">
<td class="position-relative"> {% if object.rack %}
{% if object.rack %} {{ object.rack|linkify }}
{{ object.rack|linkify }}
<div class="position-absolute top-50 end-0 translate-middle-y noprint">
<a href="{{ object.rack.get_absolute_url }}?device={{ object.pk }}" class="btn btn-primary" title="{% trans "Highlight device" %}">
<i class="mdi mdi-view-day-outline"></i>
</a>
</div>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Position" %}</th>
<td>
{% if object.parent_bay %}
{% with object.parent_bay.device as parent %}
{{ parent|linkify }} / {{ object.parent_bay }}
{% if parent.position %}
(U{{ parent.position|floatformat }} / {{ parent.get_face_display }})
{% endif %}
{% endwith %}
{% elif object.rack and object.position %}
<span>U{{ object.position|floatformat }} / {{ object.get_face_display }}</span>
{% elif object.rack and object.device_type.u_height %}
<span class="badge text-bg-warning">{% trans "Not racked" %}</span>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "GPS Coordinates" %}</th>
<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"> <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"> <a href="{{ object.rack.get_absolute_url }}?device={{ object.pk }}" class="btn btn-primary" title="{% trans "Highlight device" %}">
<i class="mdi mdi-map-marker"></i> {% trans "Map It" %} <i class="mdi mdi-view-day-outline"></i>
</a> </a>
</div> </div>
{% endif %}
<span>{{ object.latitude }}, {{ object.longitude }}</span>
{% else %} {% else %}
{{ ''|placeholder }} {{ ''|placeholder }}
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th scope="row">{% trans "Tenant" %}</th> <th scope="row">{% trans "Position" %}</th>
<td> <td>
{% if object.tenant.group %} {% if object.parent_bay %}
{{ object.tenant.group|linkify }} / {% with object.parent_bay.device as parent %}
{% endif %} {{ parent|linkify }} / {{ object.parent_bay }}
{{ object.tenant|linkify|placeholder }} {% if parent.position %}
</td> (U{{ parent.position|floatformat }} / {{ parent.get_face_display }})
</tr> {% endif %}
<tr> {% endwith %}
<th scope="row">{% trans "Device Type" %}</th> {% elif object.rack and object.position %}
<td> <span>U{{ object.position|floatformat }} / {{ object.get_face_display }}</span>
{{ object.device_type|linkify:"get_full_name" }} ({{ object.device_type.u_height|floatformat }}U) {% elif object.rack and object.device_type.u_height %}
</td> <span class="badge text-bg-warning">{% trans "Not racked" %}</span>
</tr> {% else %}
<tr> {{ ''|placeholder }}
<th scope="row">{% trans "Description" %}</th> {% endif %}
<td>{{ object.description|placeholder }}</td> </td>
</tr> </tr>
<tr> <tr>
<th scope="row">{% trans "Airflow" %}</th> <th scope="row">{% trans "GPS Coordinates" %}</th>
<td> <td class="position-relative">
{{ object.get_airflow_display|placeholder }} {% if object.latitude and object.longitude %}
</td> {% if config.MAPS_URL %}
</tr> <div class="position-absolute top-50 end-0 translate-middle-y noprint">
<tr> <a href="{{ config.MAPS_URL }}{{ object.latitude }},{{ object.longitude }}" target="_blank" class="btn btn-primary">
<th scope="row">{% trans "Serial Number" %}</th> <i class="mdi mdi-map-marker"></i> {% trans "Map It" %}
<td class="font-monospace">{{ object.serial|placeholder }}</td> </a>
</tr> </div>
<tr> {% endif %}
<th scope="row">{% trans "Asset Tag" %}</th> <span>{{ object.latitude }}, {{ object.longitude }}</span>
<td class="font-monospace">{{ object.asset_tag|placeholder }}</td> {% else %}
</tr> {{ ''|placeholder }}
<tr> {% endif %}
<th scope="row">{% trans "Config Template" %}</th> </td>
<td>{{ object.config_template|linkify|placeholder }}</td> </tr>
</tr> <tr>
</table> <th scope="row">{% trans "Tenant" %}</th>
</div> <td>
{% if object.tenant.group %}
{{ object.tenant.group|linkify }} /
{% endif %}
{{ object.tenant|linkify|placeholder }}
</td>
</tr>
<tr>
<th scope="row">{% trans "Device Type" %}</th>
<td>
{{ object.device_type|linkify:"get_full_name" }} ({{ object.device_type.u_height|floatformat }}U)
</td>
</tr>
<tr>
<th scope="row">{% trans "Description" %}</th>
<td>{{ object.description|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Airflow" %}</th>
<td>
{{ object.get_airflow_display|placeholder }}
</td>
</tr>
<tr>
<th scope="row">{% trans "Serial Number" %}</th>
<td class="font-monospace">{{ object.serial|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Asset Tag" %}</th>
<td class="font-monospace">{{ object.asset_tag|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Config Template" %}</th>
<td>{{ object.config_template|linkify|placeholder }}</td>
</tr>
</table>
</div> </div>
{% if vc_members %} {% if vc_members %}
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Virtual Chassis" %}</h5>
{% trans "Virtual Chassis" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th>{% trans "Device" %}</th>
<table class="table table-hover attr-table"> <th>{% trans "Position" %}</th>
<tr> <th>{% trans "Master" %}</th>
<th>{% trans "Device" %}</th> <th>{% trans "Priority" %}</th>
<th>{% trans "Position" %}</th> </tr>
<th>{% trans "Master" %}</th> {% for vc_member in vc_members %}
<th>{% trans "Priority" %}</th> <tr{% if vc_member == object %} class="info"{% endif %}>
<td>
{{ vc_member|linkify }}
</td>
<td>
{% badge vc_member.vc_position show_empty=True %}
</td>
<td>
{% if object.virtual_chassis.master == vc_member %}<i class="mdi mdi-check-bold"></i>{% endif %}
</td>
<td>
{{ vc_member.vc_priority|placeholder }}
</td>
</tr> </tr>
{% for vc_member in vc_members %} {% endfor %}
<tr{% if vc_member == object %} class="info"{% endif %}> </table>
<td>
{{ vc_member|linkify }}
</td>
<td>
{% badge vc_member.vc_position show_empty=True %}
</td>
<td>
{% if object.virtual_chassis.master == vc_member %}<i class="mdi mdi-check-bold"></i>{% endif %}
</td>
<td>
{{ vc_member.vc_priority|placeholder }}
</td>
</tr>
{% endfor %}
</table>
</div>
<div class="card-footer text-end noprint"> <div class="card-footer text-end noprint">
<a href="{{ object.virtual_chassis.get_absolute_url }}" class="btn btn-primary"> <a href="{{ object.virtual_chassis.get_absolute_url }}" class="btn btn-primary">
<span class="mdi mdi-arrow-right-bold" aria-hidden="true"></span> {% trans "View Virtual Chassis" %} <span class="mdi mdi-arrow-right-bold" aria-hidden="true"></span> {% trans "View Virtual Chassis" %}
@ -177,127 +171,121 @@
<div class="col col-12 col-xl-6"> <div class="col col-12 col-xl-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Management" %}</h5> <h5 class="card-header">{% trans "Management" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<th scope="row">{% trans "Status" %}</th>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
</tr>
<tr>
<th scope="row">{% trans "Role" %}</th>
<td>{{ object.role|linkify }}</td>
</tr>
<tr>
<th scope="row">{% trans "Platform" %}</th>
<td>{{ object.platform|linkify|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Primary IPv4" %}</th>
<td>
{% if object.primary_ip4 %}
<a href="{{ object.primary_ip4.get_absolute_url }}" id="primary_ip4">{{ object.primary_ip4.address.ip }}</a>
{% if object.primary_ip4.nat_inside %}
({% trans "NAT for" %} <a href="{{ object.primary_ip4.nat_inside.get_absolute_url }}">{{ object.primary_ip4.nat_inside.address.ip }}</a>)
{% elif object.primary_ip4.nat_outside.exists %}
({% 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 %})
{% endif %}
{% copy_content "primary_ip4" %}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Primary IPv6" %}</th>
<td>
{% if object.primary_ip6 %}
<a href="{{ object.primary_ip6.get_absolute_url }}" id="primary_ip6">{{ object.primary_ip6.address.ip }}</a>
{% if object.primary_ip6.nat_inside %}
({% trans "NAT for" %} <a href="{{ object.primary_ip6.nat_inside.get_absolute_url }}">{{ object.primary_ip6.nat_inside.address.ip }}</a>)
{% elif object.primary_ip6.nat_outside.exists %}
({% 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 %})
{% endif %}
{% copy_content "primary_ip6" %}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<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>
{% if object.cluster %}
<tr> <tr>
<th scope="row">{% trans "Status" %}</th> <th>{% trans "Cluster" %}</th>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
</tr>
<tr>
<th scope="row">{% trans "Role" %}</th>
<td>{{ object.role|linkify }}</td>
</tr>
<tr>
<th scope="row">{% trans "Platform" %}</th>
<td>{{ object.platform|linkify|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Primary IPv4" %}</th>
<td> <td>
{% if object.primary_ip4 %} {% if object.cluster.group %}
<a href="{{ object.primary_ip4.get_absolute_url }}" id="primary_ip4">{{ object.primary_ip4.address.ip }}</a> {{ object.cluster.group|linkify }} /
{% if object.primary_ip4.nat_inside %}
({% trans "NAT for" %} <a href="{{ object.primary_ip4.nat_inside.get_absolute_url }}">{{ object.primary_ip4.nat_inside.address.ip }}</a>)
{% elif object.primary_ip4.nat_outside.exists %}
({% 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 %})
{% endif %} {% endif %}
{% copy_content "primary_ip4" %} {{ object.cluster|linkify }}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td> </td>
</tr> </tr>
<tr> {% endif %}
<th scope="row">{% trans "Primary IPv6" %}</th> </table>
<td>
{% if object.primary_ip6 %}
<a href="{{ object.primary_ip6.get_absolute_url }}" id="primary_ip6">{{ object.primary_ip6.address.ip }}</a>
{% if object.primary_ip6.nat_inside %}
({% trans "NAT for" %} <a href="{{ object.primary_ip6.nat_inside.get_absolute_url }}">{{ object.primary_ip6.nat_inside.address.ip }}</a>)
{% elif object.primary_ip6.nat_outside.exists %}
({% 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 %})
{% endif %}
{% copy_content "primary_ip6" %}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<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>
{% if object.cluster %}
<tr>
<th>{% trans "Cluster" %}</th>
<td>
{% if object.cluster.group %}
{{ object.cluster.group|linkify }} /
{% endif %}
{{ object.cluster|linkify }}
</td>
</tr>
{% endif %}
</table>
</div>
</div> </div>
{% if object.powerports.exists and object.poweroutlets.exists %} {% if object.powerports.exists and object.poweroutlets.exists %}
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Power Utilization" %}</h5>
{% trans "Power Utilization" %} <table class="table table-hover">
</h5> <tr>
<div class="card-body"> <th>{% trans "Input" %}</th>
<table class="table table-hover"> <th>{% trans "Outlets" %}</th>
<tr> <th>{% trans "Allocated" %}</th>
<th>{% trans "Input" %}</th> <th>{% trans "Available" %}</th>
<th>{% trans "Outlets" %}</th> <th>{% trans "Utilization" %}</th>
<th>{% trans "Allocated" %}</th> </tr>
<th>{% trans "Available" %}</th> {% for powerport in object.powerports.all %}
<th>{% trans "Utilization" %}</th> {% with utilization=powerport.get_power_draw powerfeed=powerport.connected_endpoints.0 %}
</tr> <tr>
{% for powerport in object.powerports.all %} <td>{{ powerport }}</td>
{% with utilization=powerport.get_power_draw powerfeed=powerport.connected_endpoints.0 %} <td>{{ utilization.outlet_count }}</td>
<td>{{ utilization.allocated }}{% trans "VA" %}</td>
{% if powerfeed.available_power %}
<td>{{ powerfeed.available_power }}{% trans "VA" %}</td>
<td>{% utilization_graph utilization.allocated|percentage:powerfeed.available_power %}</td>
{% else %}
<td class="text-muted">&mdash;</td>
<td class="text-muted">&mdash;</td>
{% endif %}
</tr>
{% for leg in utilization.legs %}
<tr> <tr>
<td>{{ powerport }}</td> <td style="padding-left: 20px">
<td>{{ utilization.outlet_count }}</td> {% trans "Leg" context "Leg of a power feed" %} {{ leg.name }}
<td>{{ utilization.allocated }}{% trans "VA" %}</td> </td>
<td>{{ leg.outlet_count }}</td>
<td>{{ leg.allocated }}</td>
{% if powerfeed.available_power %} {% if powerfeed.available_power %}
<td>{{ powerfeed.available_power }}{% trans "VA" %}</td> {% with phase_available=powerfeed.available_power|divide:3 %}
<td>{% utilization_graph utilization.allocated|percentage:powerfeed.available_power %}</td> <td>{{ phase_available }}{% trans "VA" %}</td>
<td>{% utilization_graph leg.allocated|percentage:phase_available %}</td>
{% endwith %}
{% else %} {% else %}
<td class="text-muted">&mdash;</td> <td class="text-muted">&mdash;</td>
<td class="text-muted">&mdash;</td> <td class="text-muted">&mdash;</td>
{% endif %} {% endif %}
</tr> </tr>
{% for leg in utilization.legs %} {% endfor %}
<tr> {% endwith %}
<td style="padding-left: 20px"> {% endfor %}
{% trans "Leg" context "Leg of a power feed" %} {{ leg.name }} </table>
</td>
<td>{{ leg.outlet_count }}</td>
<td>{{ leg.allocated }}</td>
{% if powerfeed.available_power %}
{% with phase_available=powerfeed.available_power|divide:3 %}
<td>{{ phase_available }}{% trans "VA" %}</td>
<td>{% utilization_graph leg.allocated|percentage:phase_available %}</td>
{% endwith %}
{% else %}
<td class="text-muted">&mdash;</td>
<td class="text-muted">&mdash;</td>
{% endif %}
</tr>
{% endfor %}
{% endwith %}
{% endfor %}
</table>
</div>
</div> </div>
{% endif %} {% endif %}
<div class="card"> <div class="card">
@ -317,26 +305,24 @@
{% include 'inc/panels/image_attachments.html' %} {% include 'inc/panels/image_attachments.html' %}
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Dimensions" %}</h5> <h5 class="card-header">{% trans "Dimensions" %}</h5>
<div class="card-body table-responsive"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Height" %}</th>
<th scope="row">{% trans "Height" %}</th> <td>
<td> {{ object.device_type.u_height }}U
{{ object.device_type.u_height }}U </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Weight" %}</th>
<th scope="row">{% trans "Weight" %}</th> <td>
<td> {% if object.total_weight %}
{% if object.total_weight %} {{ object.total_weight|floatformat }} {% trans "Kilograms" %}
{{ object.total_weight|floatformat }} {% trans "Kilograms" %} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% if object.rack and object.position %} {% if object.rack and object.position %}
<div class="row" style="margin-bottom: 20px"> <div class="row" style="margin-bottom: 20px">

View File

@ -9,22 +9,20 @@
<div class="col-5"> <div class="col-5">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Config Template" %}</h5> <h5 class="card-header">{% trans "Config Template" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Config Template" %}</th>
<th scope="row">{% trans "Config Template" %}</th> <td>{{ config_template|linkify|placeholder }}</td>
<td>{{ config_template|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Data Source" %}</th>
<th scope="row">{% trans "Data Source" %}</th> <td>{{ config_template.data_file.source|linkify|placeholder }}</td>
<td>{{ config_template.data_file.source|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Data File" %}</th>
<th scope="row">{% trans "Data File" %}</th> <td>{{ config_template.data_file|linkify|placeholder }}</td>
<td>{{ config_template.data_file|linkify|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
</div> </div>
<div class="col-7"> <div class="col-7">

View File

@ -14,29 +14,25 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Device Bay" %}</h5>
{% trans "Device Bay" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Device" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.device|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Device" %}</th> <tr>
<td>{{ object.device|linkify }}</td> <th scope="row">{% trans "Name" %}</th>
</tr> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Label" %}</th>
</tr> <td>{{ object.label|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Label" %}</th> <tr>
<td>{{ object.label|placeholder }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -44,10 +40,7 @@
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Installed Device" %}</h5>
{% trans "Installed Device" %}
</h5>
<div class="card-body">
{% if object.installed_device %} {% if object.installed_device %}
{% with device=object.installed_device %} {% with device=object.installed_device %}
<table class="table table-hover attr-table"> <table class="table table-hover attr-table">
@ -62,11 +55,10 @@
</table> </table>
{% endwith %} {% endwith %}
{% else %} {% else %}
<div class="text-muted"> <div class="card-body text-muted">
{% trans "None" %} {% trans "None" %}
</div> </div>
{% endif %} {% endif %}
</div>
</div> </div>
{% plugin_right_page object %} {% plugin_right_page object %}
</div> </div>

View File

@ -20,35 +20,31 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Device Role" %}</h5>
{% trans "Device Role" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Color" %}</th>
</tr> <td>
<tr> <span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
<th scope="row">{% trans "Color" %}</th> </td>
<td> </tr>
<span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span> <tr>
</td> <th scope="row">{% trans "VM Role" %}</th>
</tr> <td>{% checkmark object.vm_role %}</td>
<tr> </tr>
<th scope="row">{% trans "VM Role" %}</th> <tr>
<td>{% checkmark object.vm_role %}</td> <th scope="row">{% trans "Config Template" %}</th>
</tr> <td>{{ object.config_template|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Config Template" %}</th> </table>
<td>{{ object.config_template|linkify|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -8,94 +8,90 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Chassis" %}</h5>
{% trans "Chassis" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Manufacturer" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.manufacturer|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Manufacturer" %}</th> <tr>
<td>{{ object.manufacturer|linkify }}</td> <th scope="row">{% trans "Model Name" %}</th>
</tr> <td>
<tr> {{ object.model }}<br/>
<th scope="row">{% trans "Model Name" %}</th> <small class="text-muted">{{ object.slug }}</small>
<td> </td>
{{ object.model }}<br/> </tr>
<small class="text-muted">{{ object.slug }}</small> <tr>
</td> <th scope="row">{% trans "Part Number" %}</th>
</tr> <td>{{ object.part_number|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Part Number" %}</th> <tr>
<td>{{ object.part_number|placeholder }}</td> <th scope="row">{% trans "Default Platform" %}</th>
</tr> <td>{{ object.default_platform|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Default Platform" %}</th> <tr>
<td>{{ object.default_platform|linkify }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Height (U" %})</th>
</tr> <td>{{ object.u_height|floatformat }}</td>
<tr> </tr>
<th scope="row">{% trans "Height (U" %})</th> <tr>
<td>{{ object.u_height|floatformat }}</td> <th scope="row">{% trans "Exclude From Utilization" %})</th>
</tr> <td>{% checkmark object.exclude_from_utilization %}</td>
<tr> </tr>
<th scope="row">{% trans "Exclude From Utilization" %})</th> <tr>
<td>{% checkmark object.exclude_from_utilization %}</td> <th scope="row">{% trans "Full Depth" %}</th>
</tr> <td>{% checkmark object.is_full_depth %}</td>
<tr> </tr>
<th scope="row">{% trans "Full Depth" %}</th> <tr>
<td>{% checkmark object.is_full_depth %}</td> <th scope="row">{% trans "Weight" %}</th>
</tr> <td>
<tr> {% if object.weight %}
<th scope="row">{% trans "Weight" %}</th> {{ object.weight|floatformat }} {{ object.get_weight_unit_display }}
<td> {% else %}
{% if object.weight %} {{ ''|placeholder }}
{{ object.weight|floatformat }} {{ object.get_weight_unit_display }} {% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Parent/Child" %}</th>
<td>
{{ object.get_subdevice_role_display|placeholder }}
</td>
</tr>
<tr>
<th scope="row">{% trans "Airflow" %}</th>
<td>
{{ object.get_airflow_display|placeholder }}
</td>
</tr>
<tr>
<th scope="row">{% trans "Front Image" %}</th>
<td>
{% if object.front_image %}
<a href="{{ object.front_image.url }}">
<img src="{{ object.front_image.url }}" alt="{{ object.front_image.name }}" class="img-fluid" />
</a>
{% else %} {% else %}
{{ ''|placeholder }} {{ ''|placeholder }}
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th scope="row">{% trans "Parent/Child" %}</th> <th scope="row">{% trans "Rear Image" %}</th>
<td> <td>
{{ object.get_subdevice_role_display|placeholder }} {% if object.rear_image %}
</td> <a href="{{ object.rear_image.url }}">
</tr> <img src="{{ object.rear_image.url }}" alt="{{ object.rear_image.name }}" class="img-fluid" />
<tr> </a>
<th scope="row">{% trans "Airflow" %}</th> {% else %}
<td> {{ ''|placeholder }}
{{ object.get_airflow_display|placeholder }} {% endif %}
</td> </td>
</tr> </tr>
<tr> </table>
<th scope="row">{% trans "Front Image" %}</th>
<td>
{% if object.front_image %}
<a href="{{ object.front_image.url }}">
<img src="{{ object.front_image.url }}" alt="{{ object.front_image.name }}" class="img-fluid" />
</a>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Rear Image" %}</th>
<td>
{% if object.rear_image %}
<a href="{{ object.rear_image.url }}">
<img src="{{ object.rear_image.url }}" alt="{{ object.rear_image.name }}" class="img-fluid" />
</a>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -14,55 +14,51 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Front Port" %}</h5>
{% trans "Front Port" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Device" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.device|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Device" %}</th> <tr>
<td>{{ object.device|linkify }}</td> <th scope="row">{% trans "Module" %}</th>
</tr> <td>{{ object.module|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Module" %}</th> <tr>
<td>{{ object.module|linkify|placeholder }}</td> <th scope="row">{% trans "Name" %}</th>
</tr> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Label" %}</th>
</tr> <td>{{ object.label|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Label" %}</th> <tr>
<td>{{ object.label|placeholder }}</td> <th scope="row">{% trans "Type" %}</th>
</tr> <td>{{ object.get_type_display }}</td>
<tr> </tr>
<th scope="row">{% trans "Type" %}</th> <tr>
<td>{{ object.get_type_display }}</td> <th scope="row">{% trans "Color" %}</th>
</tr> <td>
<tr> {% if object.color %}
<th scope="row">{% trans "Color" %}</th> <span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
<td> {% else %}
{% if object.color %} {{ ''|placeholder }}
<span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span> {% endif %}
{% else %} </td>
{{ ''|placeholder }} </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Rear Port" %}</th>
</tr> <td>{{ object.rear_port|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Rear Port" %}</th> <tr>
<td>{{ object.rear_port|linkify }}</td> <th scope="row">{% trans "Rear Port Position" %}</th>
</tr> <td>{{ object.rear_port_position }}</td>
<tr> </tr>
<th scope="row">{% trans "Rear Port Position" %}</th> <tr>
<td>{{ object.rear_port_position }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -70,12 +66,9 @@
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Connection" %}</h5>
{% trans "Connection" %}
</h5>
<div class="card-body">
{% if object.mark_connected %} {% if object.mark_connected %}
<div class="text-muted"> <div class="card-body text-muted">
<span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% trans "Marked as Connected" %} <span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% trans "Marked as Connected" %}
</div> </div>
{% elif object.cable %} {% elif object.cable %}
@ -101,7 +94,7 @@
</tr> </tr>
</table> </table>
{% else %} {% else %}
<div class="text-muted"> <div class="card-body text-muted">
{% trans "Not Connected" %} {% trans "Not Connected" %}
{% if perms.dcim.add_cable %} {% if perms.dcim.add_cable %}
<div class="dropdown float-end"> <div class="dropdown float-end">
@ -132,7 +125,6 @@
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}
</div>
</div> </div>
{% include 'dcim/inc/panels/inventory_items.html' %} {% include 'dcim/inc/panels/inventory_items.html' %}
{% plugin_right_page object %} {% plugin_right_page object %}

View File

@ -1,5 +1,5 @@
{% load i18n %} {% load i18n %}
<table class="table table-hover"> <table class="table table-hover attr-table">
<tr> <tr>
<th scope="row">{% trans "Cable" %}</th> <th scope="row">{% trans "Cable" %}</th>
<td> <td>

View File

@ -3,43 +3,41 @@
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Inventory Items" %}</h5> <h5 class="card-header">{% trans "Inventory Items" %}</h5>
<div class="card-body"> <table class="table table-hover">
<table class="table table-hover table-headings"> <thead>
<thead> <tr>
<th>{% trans "Name" %}</th>
<th>{% trans "Label" %}</th>
<th>{% trans "Role" %}</th>
<th></th>
</tr>
</thead>
<tbody>
{% for item in object.inventory_items.all %}
<tr> <tr>
<th>{% trans "Name" %}</th> <td>{{ item|linkify:"name" }}</td>
<th>{% trans "Label" %}</th> <td>{{ item.label|placeholder }}</td>
<th>{% trans "Role" %}</th> <td>{{ item.role|linkify|placeholder }}</td>
<th></th> <td class="text-end noprint">
{% if perms.dcim.change_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_edit' pk=item.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-warning lh-1" title="{% trans "Edit" %}">
<i class="mdi mdi-pencil" aria-hidden="true"></i>
</a>
{% endif %}
{% if perms.ipam.delete_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_delete' pk=item.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-danger lh-1" title="{% trans "Delete" %}">
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i>
</a>
{% endif %}
</td>
</tr> </tr>
</thead> {% empty %}
<tbody> <tr>
{% for item in object.inventory_items.all %} <td colspan="5" class="text-muted">{% trans "None" %}</td>
<tr> </tr>
<td>{{ item|linkify:"name" }}</td> {% endfor %}
<td>{{ item.label|placeholder }}</td> </tbody>
<td>{{ item.role|linkify|placeholder }}</td> </table>
<td class="text-end noprint">
{% if perms.dcim.change_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_edit' pk=item.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-warning lh-1" title="{% trans "Edit" %}">
<i class="mdi mdi-pencil" aria-hidden="true"></i>
</a>
{% endif %}
{% if perms.ipam.delete_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_delete' pk=item.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-danger lh-1" title="{% trans "Delete" %}">
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i>
</a>
{% endif %}
</td>
</tr>
{% empty %}
<tr>
<td colspan="5" class="text-muted">{% trans "None" %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="card-footer text-end noprint"> <div class="card-footer text-end noprint">
{% if perms.dcim.add_inventoryitem %} {% if perms.dcim.add_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_add' %}?device={{ object.device.pk }}&component_type={{ object|content_type_id }}&component_id={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary"> <a href="{% url 'dcim:inventoryitem_add' %}?device={{ object.device.pk }}&component_type={{ object|content_type_id }}&component_id={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">

View File

@ -25,96 +25,92 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Interface" %}</h5> <h5 class="card-header">{% trans "Interface" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover"> <tr>
<tr> <th scope="row">{% trans "Device" %}</th>
<th scope="row">{% trans "Device" %}</th> <td>{{ object.device|linkify }}</td>
<td>{{ object.device|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Module" %}</th>
<th scope="row">{% trans "Module" %}</th> <td>{{ object.module|linkify|placeholder }}</td>
<td>{{ object.module|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Label" %}</th>
<th scope="row">{% trans "Label" %}</th> <td>{{ object.label|placeholder }}</td>
<td>{{ object.label|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Type" %}</th>
<th scope="row">{% trans "Type" %}</th> <td>{{ object.get_type_display }}</td>
<td>{{ object.get_type_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Speed/Duplex" %}</th>
<th scope="row">{% trans "Speed/Duplex" %}</th> <td>
<td> {{ object.speed|humanize_speed|placeholder }} /
{{ object.speed|humanize_speed|placeholder }} / {{ object.get_duplex_display|placeholder }}
{{ object.get_duplex_display|placeholder }} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "MTU" %}</th>
<th scope="row">{% trans "MTU" %}</th> <td>{{ object.mtu|placeholder }}</td>
<td>{{ object.mtu|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Enabled" %}</th>
<th scope="row">{% trans "Enabled" %}</th> <td>{% checkmark object.enabled %}</td>
<td>{% checkmark object.enabled %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Management Only" %}</th>
<th scope="row">{% trans "Management Only" %}</th> <td>{% checkmark object.mgmt_only %}</td>
<td>{% checkmark object.mgmt_only %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }} </td>
<td>{{ object.description|placeholder }} </td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "PoE Mode" %}</th>
<th scope="row">{% trans "PoE Mode" %}</th> <td>{{ object.get_poe_mode_display|placeholder }}</td>
<td>{{ object.get_poe_mode_display|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "PoE Type" %}</th>
<th scope="row">{% trans "PoE Type" %}</th> <td>{{ object.get_poe_type_display|placeholder }}</td>
<td>{{ object.get_poe_type_display|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "802.1Q Mode" %}</th>
<th scope="row">{% trans "802.1Q Mode" %}</th> <td>{{ object.get_mode_display|placeholder }}</td>
<td>{{ object.get_mode_display|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Transmit power (dBm)" %}</th>
<th scope="row">{% trans "Transmit power (dBm)" %}</th> <td>{{ object.tx_power|placeholder }}</td>
<td>{{ object.tx_power|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Tunnel" %}</th>
<th scope="row">{% trans "Tunnel" %}</th> <td>{{ object.tunnel_termination.tunnel|linkify|placeholder }}</td>
<td>{{ object.tunnel_termination.tunnel|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "L2VPN" %}</th>
<th scope="row">{% trans "L2VPN" %}</th> <td>{{ object.l2vpn_termination.l2vpn|linkify|placeholder }}</td>
<td>{{ object.l2vpn_termination.l2vpn|linkify|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Related Interfaces" %}</h5> <h5 class="card-header">{% trans "Related Interfaces" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover"> <tr>
<tr> <th scope="row">{% trans "Parent" %}</th>
<th scope="row">{% trans "Parent" %}</th> <td>{{ object.parent|linkify|placeholder }}</td>
<td>{{ object.parent|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Bridge" %}</th>
<th scope="row">{% trans "Bridge" %}</th> <td>{{ object.bridge|linkify|placeholder }}</td>
<td>{{ object.bridge|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "LAG" %}</th>
<th scope="row">{% trans "LAG" %}</th> <td>{{ object.lag|linkify|placeholder }}</td>
<td>{{ object.lag|linkify|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -124,220 +120,211 @@
{% include 'inc/panel_table.html' with table=vdc_table heading="Virtual Device Contexts" %} {% include 'inc/panel_table.html' with table=vdc_table heading="Virtual Device Contexts" %}
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Addressing" %}</h5> <h5 class="card-header">{% trans "Addressing" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover"> <tr>
<tr> <th scope="row">{% trans "MAC Address" %}</th>
<th scope="row">{% trans "MAC Address" %}</th> <td><span class="font-monospace">{{ object.mac_address|placeholder }}</span></td>
<td><span class="font-monospace">{{ object.mac_address|placeholder }}</span></td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "WWN" %}</th>
<th scope="row">{% trans "WWN" %}</th> <td><span class="font-monospace">{{ object.wwn|placeholder }}</span></td>
<td><span class="font-monospace">{{ object.wwn|placeholder }}</span></td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "VRF" %}</th>
<th scope="row">{% trans "VRF" %}</th> <td>{{ object.vrf|linkify|placeholder }}</td>
<td>{{ object.vrf|linkify|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% if not object.is_virtual %} {% if not object.is_virtual %}
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Connection" %}</h5> <h5 class="card-header">{% trans "Connection" %}</h5>
<div class="card-body"> {% if object.mark_connected %}
{% if object.mark_connected %} <div class="card-body">
<div class="text-muted"> <span class="text-success"><i class="mdi mdi-check-bold"></i></span>
<span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% trans "Marked as Connected" %} {% trans "Marked as Connected" %}
</div> </div>
{% elif object.cable %} {% elif object.cable %}
{% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:interface_trace' %} {% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:interface_trace' %}
{% elif object.wireless_link %} {% elif object.wireless_link %}
<table class="table table-hover"> <table class="table table-hover attr-table">
<tr>
<th scope="row">{% trans "Wireless Link" %}</th>
<td>
{{ object.wireless_link|linkify }}
<a href="{% url 'dcim:interface_trace' pk=object.pk %}" class="btn btn-primary lh-1" title="{% trans "Trace" %}">
<i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i>
</a>
</td>
</tr>
{% with peer_interface=object.link_peers.0 %}
<tr> <tr>
<th scope="row">{% trans "Wireless Link" %}</th> <th scope="row">{% trans "Device" %}</th>
<td> <td>{{ peer_interface.device|linkify }}</td>
{{ object.wireless_link|linkify }}
<a href="{% url 'dcim:interface_trace' pk=object.pk %}" class="btn btn-primary lh-1" title="{% trans "Trace" %}">
<i class="mdi mdi-transit-connection-variant" aria-hidden="true"></i>
</a>
</td>
</tr> </tr>
{% with peer_interface=object.link_peers.0 %} <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Device" %}</th> <td>{{ peer_interface|linkify }}</td>
<td>{{ peer_interface.device|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Type" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ peer_interface.get_type_display }}</td>
<td>{{ peer_interface|linkify }}</td> </tr>
</tr> {% endwith %}
<tr> </table>
<th scope="row">{% trans "Type" %}</th> {% else %}
<td>{{ peer_interface.get_type_display }}</td> <div class="card-body text-muted">
</tr> {% trans "Not Connected" %}
{% endwith %} {% if object.is_wired and perms.dcim.add_cable %}
</table> <div class="dropdown float-end">
{% else %} <button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<div class="text-muted"> <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span> {% trans "Connect" %}
{% trans "Not Connected" %} </button>
{% if object.is_wired and perms.dcim.add_cable %} <ul class="dropdown-menu dropdown-menu-end">
<div class="dropdown float-end"> <li>
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ object.pk }}&b_terminations_type=dcim.interface&return_url={{ object.get_absolute_url }}">{% trans "Interface" %}</a>
<span class="mdi mdi-ethernet-cable" aria-hidden="true"></span> {% trans "Connect" %} </li>
</button> <li>
<ul class="dropdown-menu dropdown-menu-end"> <a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ object.pk }}&b_terminations_type=dcim.frontport&return_url={{ object.get_absolute_url }}">{% trans "Front Port" %}</a>
<li> </li>
<a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ object.pk }}&b_terminations_type=dcim.interface&return_url={{ object.get_absolute_url }}">{% trans "Interface" %}</a> <li>
</li> <a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ object.pk }}&b_terminations_type=dcim.rearport&return_url={{ object.get_absolute_url }}">{% trans "Rear Port" %}</a>
<li> </li>
<a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ object.pk }}&b_terminations_type=dcim.frontport&return_url={{ object.get_absolute_url }}">{% trans "Front Port" %}</a> <li>
</li> <a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ object.pk }}&b_terminations_type=circuits.circuittermination&return_url={{ object.get_absolute_url }}">{% trans "Circuit Termination" %}</a>
<li> </li>
<a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ object.pk }}&b_terminations_type=dcim.rearport&return_url={{ object.get_absolute_url }}">{% trans "Rear Port" %}</a> </ul>
</li> </div>
<li> {% elif object.is_wireless and perms.wireless.add_wirelesslink %}
<a class="dropdown-item" href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.interface&a_terminations={{ object.pk }}&b_terminations_type=circuits.circuittermination&return_url={{ object.get_absolute_url }}">{% trans "Circuit Termination" %}</a> <div class="dropdown float-end">
</li> <a href="{% url 'wireless:wirelesslink_add' %}?interface_a={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
</ul> <span class="mdi mdi-wifi-plus" aria-hidden="true"></span> {% trans "Connect" %}
</div> </a>
{% elif object.is_wireless and perms.wireless.add_wirelesslink %} </div>
<div class="dropdown float-end"> {% endif %}
<a href="{% url 'wireless:wirelesslink_add' %}?interface_a={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary"> </div>
<span class="mdi mdi-wifi-plus" aria-hidden="true"></span> {% trans "Connect" %} {% endif %}
</a>
</div>
{% endif %}
</div>
{% endif %}
</div>
</div> </div>
{% endif %} {% endif %}
{% if object.is_wireless %} {% if object.is_wireless %}
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Wireless" %}</h5> <h5 class="card-header">{% trans "Wireless" %}</h5>
<div class="card-body"> {% with peer=object.connected_endpoints.0 %}
{% with peer=object.connected_endpoints.0 %} <table class="table table-hover">
<table class="table table-hover"> <thead>
<thead>
<tr>
<th></th>
<th>{% trans "Local" %}</th>
{% if peer %}
<th>{% trans "Peer" %}</th>
{% endif %}
</tr>
</thead>
<tr> <tr>
<th scope="row">{% trans "Role" %}</th> <th></th>
<td>{{ object.get_rf_role_display|placeholder }}</td> <th>{% trans "Local" %}</th>
{% if peer %} {% if peer %}
<td>{{ peer.get_rf_role_display|placeholder }}</td> <th>{% trans "Peer" %}</th>
{% endif %} {% endif %}
</tr> </tr>
<tr> </thead>
<th scope="row">{% trans "Channel" %}</th> <tr>
<td>{{ object.get_rf_channel_display|placeholder }}</td> <th scope="row">{% trans "Role" %}</th>
{% if peer %} <td>{{ object.get_rf_role_display|placeholder }}</td>
<td{% if peer.rf_channel != object.rf_channel %} class="text-danger"{% endif %}> {% if peer %}
{{ peer.get_rf_channel_display|placeholder }} <td>{{ peer.get_rf_role_display|placeholder }}</td>
</td> {% endif %}
</tr>
<tr>
<th scope="row">{% trans "Channel" %}</th>
<td>{{ object.get_rf_channel_display|placeholder }}</td>
{% if peer %}
<td{% if peer.rf_channel != object.rf_channel %} class="text-danger"{% endif %}>
{{ peer.get_rf_channel_display|placeholder }}
</td>
{% endif %}
</tr>
<tr>
<th scope="row">{% trans "Channel Frequency" %}</th>
<td>
{% if object.rf_channel_frequency %}
{{ object.rf_channel_frequency|floatformat:"-2" }} {% trans "MHz" %}
{% else %}
{{ ''|placeholder }}
{% endif %} {% endif %}
</tr> </td>
<tr> {% if peer %}
<th scope="row">{% trans "Channel Frequency" %}</th> <td{% if peer.rf_channel_frequency != object.rf_channel_frequency %} class="text-danger"{% endif %}>
<td> {% if peer.rf_channel_frequency %}
{% if object.rf_channel_frequency %} {{ peer.rf_channel_frequency|floatformat:"-2" }} {% trans "MHz" %}
{{ object.rf_channel_frequency|floatformat:"-2" }} {% trans "MHz" %}
{% else %} {% else %}
{{ ''|placeholder }} {{ ''|placeholder }}
{% endif %} {% endif %}
</td> </td>
{% if peer %} {% endif %}
<td{% if peer.rf_channel_frequency != object.rf_channel_frequency %} class="text-danger"{% endif %}> </tr>
{% if peer.rf_channel_frequency %} <tr>
{{ peer.rf_channel_frequency|floatformat:"-2" }} {% trans "MHz" %} <th scope="row">{% trans "Channel Width" %}</th>
{% else %} <td>
{{ ''|placeholder }} {% if object.rf_channel_width %}
{% endif %} {{ object.rf_channel_width|floatformat:"-3" }} {% trans "MHz" %}
</td> {% else %}
{{ ''|placeholder }}
{% endif %} {% endif %}
</tr> </td>
<tr> {% if peer %}
<th scope="row">{% trans "Channel Width" %}</th> <td{% if peer.rf_channel_width != object.rf_channel_width %} class="text-danger"{% endif %}>
<td> {% if peer.rf_channel_width %}
{% if object.rf_channel_width %} {{ peer.rf_channel_width|floatformat:"-3" }} {% trans "MHz" %}
{{ object.rf_channel_width|floatformat:"-3" }} {% trans "MHz" %}
{% else %} {% else %}
{{ ''|placeholder }} {{ ''|placeholder }}
{% endif %} {% endif %}
</td> </td>
{% if peer %} {% endif %}
<td{% if peer.rf_channel_width != object.rf_channel_width %} class="text-danger"{% endif %}> </tr>
{% if peer.rf_channel_width %} </table>
{{ peer.rf_channel_width|floatformat:"-3" }} {% trans "MHz" %} {% endwith %}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
{% endif %}
</tr>
</table>
{% endwith %}
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Wireless LANs" %}</h5> <h5 class="card-header">{% trans "Wireless LANs" %}</h5>
<div class="card-body"> <table class="table table-hover">
<table class="table table-hover table-headings"> <thead>
<thead> <tr>
<th>{% trans "Group" %}</th>
<th>{% trans "SSID" %}</th>
</tr>
</thead>
<tbody>
{% for wlan in object.wireless_lans.all %}
<tr> <tr>
<th>{% trans "Group" %}</th> <td>{{ wlan.group|linkify|placeholder }}</td>
<th>{% trans "SSID" %}</th> <td>{{ wlan|linkify:"ssid" }}</td>
</tr> </tr>
</thead> {% empty %}
<tbody> <tr>
{% for wlan in object.wireless_lans.all %} <td colspan="3" class="text-muted">{% trans "None" %}</td>
<tr> </tr>
<td>{{ wlan.group|linkify|placeholder }}</td> {% endfor %}
<td>{{ wlan|linkify:"ssid" }}</td> </tbody>
</tr> </table>
{% empty %}
<tr>
<td colspan="3" class="text-muted">{% trans "None" %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div> </div>
{% endif %} {% endif %}
{% if object.is_lag %} {% if object.is_lag %}
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "LAG Members" %}</h5> <h5 class="card-header">{% trans "LAG Members" %}</h5>
<div class="card-body"> <table class="table table-hover">
<table class="table table-hover table-headings"> <thead>
<thead> <tr>
<th>{% trans "Parent" %}</th>
<th>{% trans "Interface" %}</th>
<th>{% trans "Type" %}</th>
</tr>
</thead>
<tbody>
{% for member in object.member_interfaces.all %}
<tr> <tr>
<th>{% trans "Parent" %}</th> <td>{{ member.device|linkify }}</td>
<th>{% trans "Interface" %}</th> <td>{{ member|linkify }}</td>
<th>{% trans "Type" %}</th> <td>{{ member.get_type_display }}</td>
</tr> </tr>
</thead> {% empty %}
<tbody> <tr>
{% for member in object.member_interfaces.all %} <td colspan="3" class="text-muted">{% trans "No member interfaces" %}</td>
<tr> </tr>
<td>{{ member.device|linkify }}</td> {% endfor %}
<td>{{ member|linkify }}</td> </tbody>
<td>{{ member.get_type_display }}</td> </table>
</tr>
{% empty %}
<tr>
<td colspan="3" class="text-muted">{% trans "No member interfaces" %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div> </div>
{% endif %} {% endif %}
{% include 'ipam/inc/panels/fhrp_groups.html' %} {% include 'ipam/inc/panels/fhrp_groups.html' %}

View File

@ -15,54 +15,52 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Inventory Item" %}</h5> <h5 class="card-header">{% trans "Inventory Item" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Device" %}</th>
<th scope="row">{% trans "Device" %}</th> <td>{{ object.device|linkify }}</td>
<td>{{ object.device|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Parent Item" %}</th>
<th scope="row">{% trans "Parent Item" %}</th> <td>{{ object.parent|linkify|placeholder }}</td>
<td>{{ object.parent|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Label" %}</th>
<th scope="row">{% trans "Label" %}</th> <td>{{ object.label|placeholder }}</td>
<td>{{ object.label|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Role" %}</th>
<th scope="row">{% trans "Role" %}</th> <td>{{ object.role|linkify|placeholder }}</td>
<td>{{ object.role|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Component" %}</th>
<th scope="row">{% trans "Component" %}</th> <td>{{ object.component|linkify|placeholder }}</td>
<td>{{ object.component|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Manufacturer" %}</th>
<th scope="row">{% trans "Manufacturer" %}</th> <td>{{ object.manufacturer|linkify|placeholder }}</td>
<td>{{ object.manufacturer|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Part ID" %}</th>
<th scope="row">{% trans "Part ID" %}</th> <td>{{ object.part_id|placeholder }}</td>
<td>{{ object.part_id|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Serial" %}</th>
<th scope="row">{% trans "Serial" %}</th> <td>{{ object.serial|placeholder }}</td>
<td>{{ object.serial|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Asset Tag" %}</th>
<th scope="row">{% trans "Asset Tag" %}</th> <td>{{ object.asset_tag|placeholder }}</td>
<td>{{ object.asset_tag|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -13,30 +13,28 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Inventory Item Role" %}</h5> <h5 class="card-header">{% trans "Inventory Item Role" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Color" %}</th>
<th scope="row">{% trans "Color" %}</th> <td>
<td> <span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
<span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span> </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Inventory Items" %}</th>
<th scope="row">{% trans "Inventory Items" %}</th> <td>
<td> <a href="{% url 'dcim:inventoryitem_list' %}?role_id={{ object.pk }}">{{ inventoryitem_count }}</a>
<a href="{% url 'dcim:inventoryitem_list' %}?role_id={{ object.pk }}">{{ inventoryitem_count }}</a> </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -23,42 +23,38 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Location" %}</h5>
{% trans "Location" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Site" %}</th>
</tr> <td>{{ object.site|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Site" %}</th> <tr>
<td>{{ object.site|linkify }}</td> <th scope="row">{% trans "Parent" %}</th>
</tr> <td>{{ object.parent|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Parent" %}</th> <tr>
<td>{{ object.parent|linkify|placeholder }}</td> <th scope="row">{% trans "Status" %}</th>
</tr> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<tr> </tr>
<th scope="row">{% trans "Status" %}</th> <tr>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> <th scope="row">{% trans "Tenant" %}</th>
</tr> <td>
<tr> {% if object.tenant.group %}
<th scope="row">{% trans "Tenant" %}</th> {{ object.tenant.group|linkify }} /
<td> {% endif %}
{% if object.tenant.group %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant.group|linkify }} / </td>
{% endif %} </tr>
{{ object.tenant|linkify|placeholder }} </table>
</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}

View File

@ -30,21 +30,17 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Manufacturer" %}</h5>
{% trans "Manufacturer" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -49,38 +49,36 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Module" %}</h5> <h5 class="card-header">{% trans "Module" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Device" %}</th>
<th scope="row">{% trans "Device" %}</th> <td>{{ object.device|linkify }}</td>
<td>{{ object.device|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Device Type" %}</th>
<th scope="row">{% trans "Device Type" %}</th> <td>{{ object.device.device_type|linkify }}</td>
<td>{{ object.device.device_type|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Module Type" %}</th>
<th scope="row">{% trans "Module Type" %}</th> <td>{{ object.module_type|linkify }}</td>
<td>{{ object.module_type|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Status" %}</th>
<th scope="row">{% trans "Status" %}</th> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Serial Number" %}</th>
<th scope="row">{% trans "Serial Number" %}</th> <td class="font-monospace">{{ object.serial|placeholder }}</td>
<td class="font-monospace">{{ object.serial|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Asset Tag" %}</th>
<th scope="row">{% trans "Asset Tag" %}</th> <td class="font-monospace">{{ object.asset_tag|placeholder }}</td>
<td class="font-monospace">{{ object.asset_tag|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/comments.html' %} {% include 'inc/panels/comments.html' %}

View File

@ -15,32 +15,30 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Module Bay" %}</h5> <h5 class="card-header">{% trans "Module Bay" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Device" %}</th>
<th scope="row">{% trans "Device" %}</th> <td>
<td> <a href="{% url 'dcim:device_modulebays' pk=object.device.pk %}">{{ object.device }}</a>
<a href="{% url 'dcim:device_modulebays' pk=object.device.pk %}">{{ object.device }}</a> </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Label" %}</th>
<th scope="row">{% trans "Label" %}</th> <td>{{ object.label|placeholder }}</td>
<td>{{ object.label|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Position" %}</th>
<th scope="row">{% trans "Position" %}</th> <td>{{ object.position|placeholder }}</td>
<td>{{ object.position|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}
@ -49,7 +47,6 @@
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Installed Module" %}</h5> <h5 class="card-header">{% trans "Installed Module" %}</h5>
<div class="card-body">
{% if object.installed_module %} {% if object.installed_module %}
{% with module=object.installed_module %} {% with module=object.installed_module %}
<table class="table table-hover attr-table"> <table class="table table-hover attr-table">
@ -76,9 +73,8 @@
</table> </table>
{% endwith %} {% endwith %}
{% else %} {% else %}
<div class="text-muted">{% trans "None" %}</div> <div class="card-body text-muted">{% trans "None" %}</div>
{% endif %} {% endif %}
</div>
</div> </div>
{% plugin_right_page object %} {% plugin_right_page object %}
</div> </div>

View File

@ -9,36 +9,34 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Module Type" %}</h5> <h5 class="card-header">{% trans "Module Type" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Manufacturer" %}</th>
<th scope="row">{% trans "Manufacturer" %}</th> <td>{{ object.manufacturer|linkify }}</td>
<td>{{ object.manufacturer|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Model Name" %}</th>
<th scope="row">{% trans "Model Name" %}</th> <td>{{ object.model }}</td>
<td>{{ object.model }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Part Number" %}</th>
<th scope="row">{% trans "Part Number" %}</th> <td>{{ object.part_number|placeholder }}</td>
<td>{{ object.part_number|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Weight" %}</th>
<th scope="row">{% trans "Weight" %}</th> <td>
<td> {% if object.weight %}
{% if object.weight %} {{ object.weight|floatformat }} {{ object.get_weight_unit_display }}
{{ object.weight|floatformat }} {{ object.get_weight_unit_display }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/comments.html' %} {% include 'inc/panels/comments.html' %}

View File

@ -23,29 +23,25 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Platform" %}</h5>
{% trans "Platform" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Manufacturer" %}</th>
</tr> <td>{{ object.manufacturer|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Manufacturer" %}</th> <tr>
<td>{{ object.manufacturer|linkify|placeholder }}</td> <th scope="row">{% trans "Config Template" %}</th>
</tr> <td>{{ object.config_template|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Config Template" %}</th> </table>
<td>{{ object.config_template|linkify|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -18,96 +18,88 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Power Feed" %}</h5>
{% trans "Power Feed" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Power Panel" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.power_panel|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Power Panel" %}</th> <tr>
<td>{{ object.power_panel|linkify }}</td> <th scope="row">{% trans "Rack" %}</th>
</tr> <td>{{ object.rack|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Rack" %}</th> <tr>
<td>{{ object.rack|linkify|placeholder }}</td> <th scope="row">{% trans "Type" %}</th>
</tr> <td>{% badge object.get_type_display bg_color=object.get_type_color %}</td>
<tr> </tr>
<th scope="row">{% trans "Type" %}</th> <tr>
<td>{% badge object.get_type_display bg_color=object.get_type_color %}</td> <th scope="row">{% trans "Status" %}</th>
</tr> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<tr> </tr>
<th scope="row">{% trans "Status" %}</th> <tr>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Tenant" %}</th>
</tr> <td>
<tr> {% if object.tenant.group %}
<th scope="row">{% trans "Tenant" %}</th> {{ object.tenant.group|linkify }} /
<td> {% endif %}
{% if object.tenant.group %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant.group|linkify }} / </td>
{% endif %} </tr>
{{ object.tenant|linkify|placeholder }} <tr>
</td> <th scope="row">{% trans "Connected Device" %}</th>
</tr> <td>
<tr> {% if object.connected_endpoints %}
<th scope="row">{% trans "Connected Device" %}</th> {{ object.connected_endpoints.0.device|linkify }} ({{ object.connected_endpoints.0|linkify:"name" }})
<td> {% else %}
{% if object.connected_endpoints %} {{ ''|placeholder }}
{{ object.connected_endpoints.0.device|linkify }} ({{ object.connected_endpoints.0|linkify:"name" }}) {% endif %}
{% else %} </td>
{{ ''|placeholder }} </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Utilization (Allocated" %})</th>
</tr> {% with utilization=object.connected_endpoints.0.get_power_draw %}
<tr> {% if utilization %}
<th scope="row">{% trans "Utilization (Allocated" %})</th> <td>
{% with utilization=object.connected_endpoints.0.get_power_draw %} {{ utilization.allocated }}{% trans "VA" %} / {{ object.available_power }}{% trans "VA" %}
{% if utilization %} {% if object.available_power > 0 %}
<td> {% utilization_graph utilization.allocated|percentage:object.available_power %}
{{ utilization.allocated }}{% trans "VA" %} / {{ object.available_power }}{% trans "VA" %} {% endif %}
{% if object.available_power > 0 %} </td>
{% utilization_graph utilization.allocated|percentage:object.available_power %} {% else %}
{% endif %} <td>{{ ''|placeholder }}</td>
</td> {% endif %}
{% else %} {% endwith %}
<td>{{ ''|placeholder }}</td> </tr>
{% endif %} </table>
{% endwith %}
</tr>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Electrical Characteristics" %}</h5>
{% trans "Electrical Characteristics" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Supply" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.get_supply_display }}</td>
<tr> </tr>
<th scope="row">{% trans "Supply" %}</th> <tr>
<td>{{ object.get_supply_display }}</td> <th scope="row">{% trans "Voltage" %}</th>
</tr> <td>{{ object.voltage }}{% trans "V" context "Abbreviation for volts" %}</td>
<tr> </tr>
<th scope="row">{% trans "Voltage" %}</th> <tr>
<td>{{ object.voltage }}{% trans "V" context "Abbreviation for volts" %}</td> <th scope="row">{% trans "Amperage" %}</th>
</tr> <td>{{ object.amperage }}{% trans "A" context "Abbreviation for amperes" %}</td>
<tr> </tr>
<th scope="row">{% trans "Amperage" %}</th> <tr>
<td>{{ object.amperage }}{% trans "A" context "Abbreviation for amperes" %}</td> <th scope="row">{% trans "Phase" %}</th>
</tr> <td>{{ object.get_phase_display }}</td>
<tr> </tr>
<th scope="row">{% trans "Phase" %}</th> <tr>
<td>{{ object.get_phase_display }}</td> <th scope="row">{% trans "Max Utilization" %}</th>
</tr> <td>{{ object.max_utilization }}%</td>
<tr> </tr>
<th scope="row">{% trans "Max Utilization" %}</th> </table>
<td>{{ object.max_utilization }}%</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -116,27 +108,26 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Connection" %}</h5> <h5 class="card-header">{% trans "Connection" %}</h5>
<div class="card-body"> {% if object.mark_connected %}
{% if object.mark_connected %} <div class="card-body">
<div class="text-muted"> <span class="text-success"><i class="mdi mdi-check-bold"></i></span>
<span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% trans "Marked as connected" %} {% trans "Marked as connected" %}
</div> </div>
{% elif object.cable %} {% elif object.cable %}
{% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:powerfeed_trace' %} {% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:powerfeed_trace' %}
{% else %} {% else %}
<div class="text-muted"> <div class="card-body text-muted">
{% trans "Not connected" %} {% trans "Not connected" %}
</div> </div>
{% endif %} {% endif %}
</div>
{% if not object.mark_connected and not object.cable %} {% if not object.mark_connected and not object.cable %}
<div class="card-footer"> <div class="card-footer">
{% if perms.dcim.add_cable %} {% if perms.dcim.add_cable %}
<a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.powerfeed&a_terminations={{ object.pk }}&b_terminations_type=dcim.powerport&return_url={{ object.get_absolute_url }}" class="btn btn-primary float-end"> <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.powerfeed&a_terminations={{ object.pk }}&b_terminations_type=dcim.powerport&return_url={{ object.get_absolute_url }}" class="btn btn-primary float-end">
<i class="mdi mdi-ethernet-cable" aria-hidden="true"></i> {% trans "Connect" %} <i class="mdi mdi-ethernet-cable" aria-hidden="true"></i> {% trans "Connect" %}
</a> </a>
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}
</div> </div>
{% include 'inc/panels/comments.html' %} {% include 'inc/panels/comments.html' %}

View File

@ -14,45 +14,41 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Power Outlet" %}</h5>
{% trans "Power Outlet" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Device" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.device|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Device" %}</th> <tr>
<td>{{ object.device|linkify }}</td> <th scope="row">{% trans "Module" %}</th>
</tr> <td>{{ object.module|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Module" %}</th> <tr>
<td>{{ object.module|linkify|placeholder }}</td> <th scope="row">{% trans "Name" %}</th>
</tr> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Label" %}</th>
</tr> <td>{{ object.label|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Label" %}</th> <tr>
<td>{{ object.label|placeholder }}</td> <th scope="row">{% trans "Type" %}</th>
</tr> <td>{{ object.get_type_display }}</td>
<tr> </tr>
<th scope="row">{% trans "Type" %}</th> <tr>
<td>{{ object.get_type_display }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Power Port" %}</th>
</tr> <td>{{ object.power_port|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Power Port" %}</th> <tr>
<td>{{ object.power_port|linkify|placeholder }}</td> <th scope="row">{% trans "Feed Leg" %}</th>
</tr> <td>{{ object.get_feed_leg_display|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Feed Leg" %}</th> </table>
<td>{{ object.get_feed_leg_display|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -61,24 +57,23 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Connection" %}</h5> <h5 class="card-header">{% trans "Connection" %}</h5>
<div class="card-body"> {% if object.mark_connected %}
{% if object.mark_connected %} <div class="card-body">
<div class="text-muted"> <span class="text-success"><i class="mdi mdi-check-bold"></i></span>
<span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% trans "Marked as Connected" %} {% trans "Marked as Connected" %}
</div> </div>
{% elif object.cable %} {% elif object.cable %}
{% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:poweroutlet_trace' %} {% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:poweroutlet_trace' %}
{% else %} {% else %}
<div class="text-muted"> <div class="card-body text-muted">
{% trans "Not Connected" %} {% trans "Not Connected" %}
{% if perms.dcim.add_cable %} {% if perms.dcim.add_cable %}
<a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.poweroutlet&a_terminations={{ object.pk }}&b_terminations_type=dcim.powerport&return_url={{ object.get_absolute_url }}" title="{% trans "Connect" %}" class="btn btn-primary float-end"> <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.poweroutlet&a_terminations={{ object.pk }}&b_terminations_type=dcim.powerport&return_url={{ object.get_absolute_url }}" title="{% trans "Connect" %}" class="btn btn-primary float-end">
<i class="mdi mdi-ethernet-cable" aria-hidden="true"></i> {% trans "Connect" %} <i class="mdi mdi-ethernet-cable" aria-hidden="true"></i> {% trans "Connect" %}
</a> </a>
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}
</div>
</div> </div>
{% include 'dcim/inc/panels/inventory_items.html' %} {% include 'dcim/inc/panels/inventory_items.html' %}
{% plugin_right_page object %} {% plugin_right_page object %}

View File

@ -17,22 +17,20 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Power Panel" %}</h5> <h5 class="card-header">{% trans "Power Panel" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Site" %}</th>
<th scope="row">{% trans "Site" %}</th> <td>{{ object.site|linkify }}</td>
<td>{{ object.site|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Location" %}</th>
<th scope="row">{% trans "Location" %}</th> <td>{{ object.location|linkify|placeholder }}</td>
<td>{{ object.location|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/comments.html' %} {% include 'inc/panels/comments.html' %}

View File

@ -14,45 +14,41 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Power Port" %}</h5>
{% trans "Power Port" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Device" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.device|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Device" %}</th> <tr>
<td>{{ object.device|linkify }}</td> <th scope="row">{% trans "Module" %}</th>
</tr> <td>{{ object.module|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Module" %}</th> <tr>
<td>{{ object.module|linkify|placeholder }}</td> <th scope="row">{% trans "Name" %}</th>
</tr> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Label" %}</th>
</tr> <td>{{ object.label|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Label" %}</th> <tr>
<td>{{ object.label|placeholder }}</td> <th scope="row">{% trans "Type" %}</th>
</tr> <td>{{ object.get_type_display|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Type" %}</th> <tr>
<td>{{ object.get_type_display|placeholder }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Maximum Draw" %}</th>
</tr> <td>{{ object.maximum_draw|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Maximum Draw" %}</th> <tr>
<td>{{ object.maximum_draw|placeholder }}</td> <th scope="row">{% trans "Allocated Draw" %}</th>
</tr> <td>{{ object.allocated_draw|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Allocated Draw" %}</th> </table>
<td>{{ object.allocated_draw|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -61,34 +57,33 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Connection" %}</h5> <h5 class="card-header">{% trans "Connection" %}</h5>
<div class="card-body"> {% if object.mark_connected %}
{% if object.mark_connected %} <div class="card-body">
<div class="text-muted"> <span class="text-success"><i class="mdi mdi-check-bold"></i></span>
<span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% trans "Marked as Connected" %} {% trans "Marked as Connected" %}
</div> </div>
{% elif object.cable %} {% elif object.cable %}
{% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:powerport_trace' %} {% include 'dcim/inc/connection_endpoints.html' with trace_url='dcim:powerport_trace' %}
{% else %} {% else %}
<div class="text-muted"> <div class="card-body text-muted">
{% trans "Not Connected" %} {% trans "Not Connected" %}
{% if perms.dcim.add_cable %} {% if perms.dcim.add_cable %}
<span class="dropdown float-end"> <span class="dropdown float-end">
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="mdi mdi-ethernet-cable" aria-hidden="true"></span> {% trans "Connect" %} <span class="mdi mdi-ethernet-cable" aria-hidden="true"></span> {% trans "Connect" %}
</button> </button>
<ul class="dropdown-menu dropdown-menu-end"> <ul class="dropdown-menu dropdown-menu-end">
<li> <li>
<a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.powerport&a_terminations={{ object.pk }}&b_terminations_type=dcim.poweroutlet&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Power Outlet" %}</a> <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.powerport&a_terminations={{ object.pk }}&b_terminations_type=dcim.poweroutlet&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Power Outlet" %}</a>
</li> </li>
<li> <li>
<a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.powerport&a_terminations={{ object.pk }}&b_terminations_type=dcim.powerfeed&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Power Feed" %}</a> <a href="{% url 'dcim:cable_add' %}?a_terminations_type=dcim.powerport&a_terminations={{ object.pk }}&b_terminations_type=dcim.powerfeed&return_url={{ object.get_absolute_url }}" class="dropdown-item">{% trans "Power Feed" %}</a>
</li> </li>
</ul> </ul>
</span> </span>
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}
</div>
</div> </div>
{% include 'dcim/inc/panels/inventory_items.html' %} {% include 'dcim/inc/panels/inventory_items.html' %}
{% plugin_right_page object %} {% plugin_right_page object %}

View File

@ -10,156 +10,150 @@
<div class="row"> <div class="row">
<div class="col col-12 col-xl-5"> <div class="col col-12 col-xl-5">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Rack" %}</h5>
{% trans "Rack" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Region" %}</th>
<table class="table table-hover attr-table"> <td>
<tr> {% nested_tree object.site.region %}
<th scope="row">{% trans "Region" %}</th> </td>
<td> </tr>
{% nested_tree object.site.region %} <tr>
</td> <th scope="row">{% trans "Site" %}</th>
</tr> <td>{{ object.site|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Site" %}</th> <tr>
<td>{{ object.site|linkify }}</td> <th scope="row">{% trans "Location" %}</th>
</tr> <td>{% nested_tree object.location %}</td>
<tr> </tr>
<th scope="row">{% trans "Location" %}</th> <tr>
<td>{% nested_tree object.location %}</td> <th scope="row">{% trans "Facility ID" %}</th>
</tr> <td>{{ object.facility_id|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Facility ID" %}</th> <tr>
<td>{{ object.facility_id|placeholder }}</td> <th scope="row">{% trans "Tenant" %}</th>
</tr> <td>
<tr> {% if object.tenant.group %}
<th scope="row">{% trans "Tenant" %}</th> {{ object.tenant.group|linkify }} /
<td> {% endif %}
{% if object.tenant.group %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant.group|linkify }} / </td>
{% endif %} </tr>
{{ object.tenant|linkify|placeholder }} <tr>
</td> <th scope="row">{% trans "Status" %}</th>
</tr> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<tr> </tr>
<th scope="row">{% trans "Status" %}</th> <tr>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> <th scope="row">{% trans "Role" %}</th>
</tr> <td>{{ object.role|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Role" %}</th> <tr>
<td>{{ object.role|linkify|placeholder }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Serial Number" %}</th>
</tr> <td class="font-monospace">{{ object.serial|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Serial Number" %}</th> <tr>
<td class="font-monospace">{{ object.serial|placeholder }}</td> <th scope="row">{% trans "Asset Tag" %}</th>
</tr> <td class="font-monospace">{{ object.asset_tag|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Asset Tag" %}</th> <tr>
<td class="font-monospace">{{ object.asset_tag|placeholder }}</td> <th scope="row">{% trans "Space Utilization" %}</th>
</tr> <td>{% utilization_graph object.get_utilization %}</td>
<tr> </tr>
<th scope="row">{% trans "Space Utilization" %}</th> <tr>
<td>{% utilization_graph object.get_utilization %}</td> <th scope="row">{% trans "Power Utilization" %}</th>
</tr> <td>{% utilization_graph object.get_power_utilization %}</td>
<tr> </tr>
<th scope="row">{% trans "Power Utilization" %}</th> </table>
<td>{% utilization_graph object.get_power_utilization %}</td>
</tr>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Dimensions" %}</h5> <h5 class="card-header">{% trans "Dimensions" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Type" %}</th>
<th scope="row">{% trans "Type" %}</th> <td>
<td> {% if object.type %}
{% if object.type %} {{ object.get_type_display }}
{{ object.get_type_display }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Width" %}</th>
<th scope="row">{% trans "Width" %}</th> <td>{{ object.get_width_display }}</td>
<td>{{ object.get_width_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Height" %}</th>
<th scope="row">{% trans "Height" %}</th> <td>{{ object.u_height }}U ({% if object.desc_units %}{% trans "descending" %}{% else %}{% trans "ascending" %}{% endif %})</td>
<td>{{ object.u_height }}U ({% if object.desc_units %}{% trans "descending" %}{% else %}{% trans "ascending" %}{% endif %})</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Starting Unit" %}</th>
<th scope="row">{% trans "Starting Unit" %}</th> <td>
<td> {{ object.starting_unit }}
{{ object.starting_unit }} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Outer Width" %}</th>
<th scope="row">{% trans "Outer Width" %}</th> <td>
<td> {% if object.outer_width %}
{% if object.outer_width %} {{ object.outer_width }} {{ object.get_outer_unit_display }}
{{ object.outer_width }} {{ object.get_outer_unit_display }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Outer Depth" %}</th>
<th scope="row">{% trans "Outer Depth" %}</th> <td>
<td> {% if object.outer_depth %}
{% if object.outer_depth %} {{ object.outer_depth }} {{ object.get_outer_unit_display }}
{{ object.outer_depth }} {{ object.get_outer_unit_display }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Mounting Depth" %}</th>
<th scope="row">{% trans "Mounting Depth" %}</th> <td>
<td> {% if object.mounting_depth %}
{% if object.mounting_depth %} {{ object.mounting_depth }} {% trans "Millimeters" %}
{{ object.mounting_depth }} {% trans "Millimeters" %} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Rack Weight" %}</th>
<th scope="row">{% trans "Rack Weight" %}</th> <td>
<td> {% if object.weight %}
{% if object.weight %} {{ object.weight|floatformat }} {{ object.get_weight_unit_display }}
{{ object.weight|floatformat }} {{ object.get_weight_unit_display }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Maximum Weight" %}</th>
<th scope="row">{% trans "Maximum Weight" %}</th> <td>
<td> {% if object.max_weight %}
{% if object.max_weight %} {{ object.max_weight }} {{ object.get_weight_unit_display }}
{{ object.max_weight }} {{ object.get_weight_unit_display }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Total Weight" %}</th>
<th scope="row">{% trans "Total Weight" %}</th> <td>
<td> {{ object.total_weight|floatformat }} {% trans "Kilograms" %}
{{ object.total_weight|floatformat }} {% trans "Kilograms" %} ({{ object.total_weight|kg_to_pounds|floatformat }} {% trans "Pounds" %})
({{ object.total_weight|kg_to_pounds|floatformat }} {% trans "Pounds" %}) </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -16,61 +16,53 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-12 col-xl-5"> <div class="col col-12 col-xl-5">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Rack" %}</h5>
{% trans "Rack" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Region" %}</th>
<table class="table table-hover attr-table"> <td>
<tr> {% nested_tree object.rack.site.region %}
<th scope="row">{% trans "Region" %}</th> </td>
<td> </tr>
{% nested_tree object.rack.site.region %} <tr>
</td> <th scope="row">{% trans "Site" %}</th>
</tr> <td>{{ object.rack.site|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Site" %}</th> <tr>
<td>{{ object.rack.site|linkify }}</td> <th scope="row">{% trans "Location" %}</th>
</tr> <td>{{ object.rack.location|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Location" %}</th> <tr>
<td>{{ object.rack.location|linkify|placeholder }}</td> <th scope="row">{% trans "Rack" %}</th>
</tr> <td>{{ object.rack|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Rack" %}</th> </table>
<td>{{ object.rack|linkify }}</td>
</tr>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Reservation Details" %}</h5>
{% trans "Reservation Details" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Units" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.unit_list }}</td>
<tr> </tr>
<th scope="row">{% trans "Units" %}</th> <tr>
<td>{{ object.unit_list }}</td> <th scope="row">{% trans "Tenant" %}</th>
</tr> <td>
<tr> {% if object.tenant.group %}
<th scope="row">{% trans "Tenant" %}</th> {{ object.tenant.group|linkify }} /
<td> {% endif %}
{% if object.tenant.group %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant.group|linkify }} / </td>
{% endif %} </tr>
{{ object.tenant|linkify|placeholder }} <tr>
</td> <th scope="row">{% trans "User" %}</th>
</tr> <td>{{ object.user }}</td>
<tr> </tr>
<th scope="row">{% trans "User" %}</th> <tr>
<td>{{ object.user }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -16,27 +16,23 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Rack Role" %}</h5>
{% trans "Rack Role" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Color" %}</th>
</tr> <td>
<tr> <span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
<th scope="row">{% trans "Color" %}</th> </td>
<td> </tr>
<span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span> </table>
</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -14,51 +14,47 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Rear Port" %}</h5>
{% trans "Rear Port" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Device" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.device|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Device" %}</th> <tr>
<td>{{ object.device|linkify }}</td> <th scope="row">{% trans "Module" %}</th>
</tr> <td>{{ object.module|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Module" %}</th> <tr>
<td>{{ object.module|linkify|placeholder }}</td> <th scope="row">{% trans "Name" %}</th>
</tr> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Label" %}</th>
</tr> <td>{{ object.label|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Label" %}</th> <tr>
<td>{{ object.label|placeholder }}</td> <th scope="row">{% trans "Type" %}</th>
</tr> <td>{{ object.get_type_display }}</td>
<tr> </tr>
<th scope="row">{% trans "Type" %}</th> <tr>
<td>{{ object.get_type_display }}</td> <th scope="row">{% trans "Color" %}</th>
</tr> <td>
<tr> {% if object.color %}
<th scope="row">{% trans "Color" %}</th> <span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
<td> {% else %}
{% if object.color %} {{ ''|placeholder }}
<span class="badge color-label" style="background-color: #{{ object.color }}">&nbsp;</span> {% endif %}
{% else %} </td>
{{ ''|placeholder }} </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Positions" %}</th>
</tr> <td>{{ object.positions }}</td>
<tr> </tr>
<th scope="row">{% trans "Positions" %}</th> <tr>
<td>{{ object.positions }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -66,12 +62,9 @@
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Connection" %}</h5>
{% trans "Connection" %}
</h5>
<div class="card-body">
{% if object.mark_connected %} {% if object.mark_connected %}
<div class="text-muted"> <div class="card-body text-muted">
<span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% trans "Marked as Connected" %} <span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% trans "Marked as Connected" %}
</div> </div>
{% elif object.cable %} {% elif object.cable %}
@ -97,7 +90,7 @@
</tr> </tr>
</table> </table>
{% else %} {% else %}
<div class="text-muted"> <div class="card-body text-muted">
{% trans "Not connected" %} {% trans "Not connected" %}
{% if perms.dcim.add_cable %} {% if perms.dcim.add_cable %}
<span class="dropdown float-end"> <span class="dropdown float-end">
@ -122,7 +115,6 @@
{% endif %} {% endif %}
</div> </div>
{% endif %} {% endif %}
</div>
</div> </div>
{% include 'dcim/inc/panels/inventory_items.html' %} {% include 'dcim/inc/panels/inventory_items.html' %}
{% plugin_right_page object %} {% plugin_right_page object %}

View File

@ -24,22 +24,20 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Region" %}</h5> <h5 class="card-header">{% trans "Region" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Parent" %}</th>
<th scope="row">{% trans "Parent" %}</th> <td>{{ object.parent|linkify|placeholder }}</td>
<td>{{ object.parent|linkify|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}

View File

@ -25,92 +25,90 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Site" %}</h5> <h5 class="card-header">{% trans "Site" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Region" %}</th>
<th scope="row">{% trans "Region" %}</th> <td>
<td> {% nested_tree object.region %}
{% nested_tree object.region %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Group" %}</th>
<th scope="row">{% trans "Group" %}</th> <td>
<td> {% nested_tree object.group %}
{% nested_tree object.group %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Status" %}</th>
<th scope="row">{% trans "Status" %}</th> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Tenant" %}</th>
<th scope="row">{% trans "Tenant" %}</th> <td>
<td> {% if object.tenant.group %}
{% if object.tenant.group %} {{ object.tenant.group|linkify }} /
{{ object.tenant.group|linkify }} / {% endif %}
{{ object.tenant|linkify|placeholder }}
</td>
</tr>
<tr>
<th scope="row">{% trans "Facility" %}</th>
<td>{{ object.facility|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Description" %}</th>
<td>{{ object.description|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Time Zone" %}</th>
<td>
{% if object.time_zone %}
{{ object.time_zone }} ({% trans "UTC" %} {{ object.time_zone|tzoffset }})<br />
<small class="text-muted">{% trans "Site time" %}: {% timezone object.time_zone %}{% annotated_now %}{% endtimezone %}</small>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Physical Address" %}</th>
<td class="position-relative">
{% if object.physical_address %}
{% if config.MAPS_URL %}
<div class="position-absolute top-50 end-0 translate-middle-y noprint">
<a href="{{ config.MAPS_URL }}{{ object.physical_address|urlencode }}" target="_blank" class="btn btn-primary">
<i class="mdi mdi-map-marker"></i> {% trans "Map" %}
</a>
</div>
{% endif %} {% endif %}
{{ object.tenant|linkify|placeholder }} <span>{{ object.physical_address|linebreaksbr }}</span>
</td> {% else %}
</tr> {{ ''|placeholder }}
<tr> {% endif %}
<th scope="row">{% trans "Facility" %}</th> </td>
<td>{{ object.facility|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Shipping Address" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.shipping_address|linebreaksbr|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "GPS Coordinates" %}</th>
<th scope="row">{% trans "Time Zone" %}</th> <td class="position-relative">
<td> {% if object.latitude and object.longitude %}
{% if object.time_zone %} {% if config.MAPS_URL %}
{{ object.time_zone }} ({% trans "UTC" %} {{ object.time_zone|tzoffset }})<br /> <div class="position-absolute top-50 end-0 translate-middle-y noprint">
<small class="text-muted">{% trans "Site time" %}: {% timezone object.time_zone %}{% annotated_now %}{% endtimezone %}</small> <a href="{{ config.MAPS_URL }}{{ object.latitude }},{{ object.longitude }}" target="_blank" class="btn btn-primary">
{% else %} <i class="mdi mdi-map-marker"></i> {% trans "Map It" %}
{{ ''|placeholder }} </a>
{% endif %} </div>
</td>
</tr>
<tr>
<th scope="row">{% trans "Physical Address" %}</th>
<td class="position-relative">
{% if object.physical_address %}
{% if config.MAPS_URL %}
<div class="position-absolute top-50 end-0 translate-middle-y noprint">
<a href="{{ config.MAPS_URL }}{{ object.physical_address|urlencode }}" target="_blank" class="btn btn-primary">
<i class="mdi mdi-map-marker"></i> {% trans "Map" %}
</a>
</div>
{% endif %} {% endif %}
<span>{{ object.physical_address|linebreaksbr }}</span> <span>{{ object.latitude }}, {{ object.longitude }}</span>
{% else %} {% else %}
{{ ''|placeholder }} {{ ''|placeholder }}
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
<tr> </table>
<th scope="row">{% trans "Shipping Address" %}</th>
<td>{{ object.shipping_address|linebreaksbr|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "GPS Coordinates" %}</th>
<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">
<i class="mdi mdi-map-marker"></i> {% trans "Map It" %}
</a>
</div>
{% endif %}
<span>{{ object.latitude }}, {{ object.longitude }}</span>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -24,22 +24,20 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Site Group" %}</h5> <h5 class="card-header">{% trans "Site Group" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Parent" %}</th>
<th scope="row">{% trans "Parent" %}</th> <td>{{ object.parent|linkify|placeholder }}</td>
<td>{{ object.parent|linkify|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}

View File

@ -18,32 +18,30 @@
<div class="col col-md-4"> <div class="col col-md-4">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Virtual Chassis" %}</h5> <h5 class="card-header">{% trans "Virtual Chassis" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Domain" %}</th>
<th scope="row">{% trans "Domain" %}</th> <td>{{ object.domain|placeholder }}</td>
<td>{{ object.domain|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Master" %}</th>
<th scope="row">{% trans "Master" %}</th> <td>{{ object.master|linkify }}</td>
<td>{{ object.master|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">Members</th>
<th scope="row">Members</th> <td>
<td> {% if object.member_count %}
{% if object.member_count %} <a href="{% url 'dcim:device_list' %}?virtual_chassis_id={{ object.pk }}">{{ object.member_count }}</a>
<a href="{% url 'dcim:device_list' %}?virtual_chassis_id={{ object.pk }}">{{ object.member_count }}</a> {% else %}
{% else %} {{ object.member_count }}
{{ object.member_count }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
@ -52,34 +50,34 @@
<div class="col col-md-8"> <div class="col col-md-8">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Members" %}</h5> <h5 class="card-header">{% trans "Members" %}</h5>
<div class="card-body"> <table class="table table-hover object-list">
<table class="table table-hover attr-table"> <thead>
<tr> <tr>
<th>{% trans "Device" %}</th> <th>{% trans "Device" %}</th>
<th>{% trans "Position" %}</th> <th>{% trans "Position" %}</th>
<th>{% trans "Master" %}</th> <th>{% trans "Master" %}</th>
<th>{% trans "Priority" %}</th> <th>{% trans "Priority" %}</th>
</tr> </tr>
{% for vc_member in members %} </thead>
<tr{% if vc_member == device %} class="info"{% endif %}> {% for vc_member in members %}
<td> <tr{% if vc_member == device %} class="info"{% endif %}>
{{ vc_member|linkify }} <td>
</td> {{ vc_member|linkify }}
<td> </td>
{% badge vc_member.vc_position show_empty=True %} <td>
</td> {% badge vc_member.vc_position show_empty=True %}
<td> </td>
{% if object.master == vc_member %} <td>
{% checkmark True %} {% if object.master == vc_member %}
{% endif %} {% checkmark True %}
</td> {% endif %}
<td> </td>
{{ vc_member.vc_priority|placeholder }} <td>
</td> {{ vc_member.vc_priority|placeholder }}
</tr> </td>
{% endfor %} </tr>
</table> {% endfor %}
</div> </table>
{% if perms.dcim.change_virtualchassis %} {% if perms.dcim.change_virtualchassis %}
<div class="card-footer text-end noprint"> <div class="card-footer text-end noprint">
<a href="{% url 'dcim:virtualchassis_add_member' pk=object.pk %}?site={{ object.master.site.pk }}&rack={{ object.master.rack.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary"> <a href="{% url 'dcim:virtualchassis_add_member' pk=object.pk %}?site={{ object.master.site.pk }}&rack={{ object.master.rack.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">

View File

@ -12,62 +12,58 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Virtual Device Context" %}</h5>
{% trans "Virtual Device Context" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Device" %}</th>
</tr> <td>{{ object.device|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Device" %}</th> <tr>
<td>{{ object.device|linkify }}</td> <th scope="row">{% trans "Identifier" %}</th>
</tr> <td>{{ object.identifier|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Identifier" %}</th> <tr>
<td>{{ object.identifier|placeholder }}</td> <th scope="row">{% trans "Primary IPv4" %}</th>
</tr> <td>
<tr> {% if object.primary_ip4 %}
<th scope="row">{% trans "Primary IPv4" %}</th> <a href="{{ object.primary_ip4.get_absolute_url }}" id="primary_ip4">{{ object.primary_ip4 }}</a>
<td> {% copy_content "primary_ip4" %}
{% if object.primary_ip4 %} {% else %}
<a href="{{ object.primary_ip4.get_absolute_url }}" id="primary_ip4">{{ object.primary_ip4 }}</a> <span class="text-muted"></span>
{% copy_content "primary_ip4" %} {% endif %}
{% else %} </td>
<span class="text-muted"></span> </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Primary IPv6" %}</th>
</tr> <td>
<tr> {% if object.primary_ip6 %}
<th scope="row">{% trans "Primary IPv6" %}</th> <a href="{{ object.primary_ip6.get_absolute_url }}" id="primary_ip6">{{ object.primary_ip6 }}</a>
<td> {% copy_content "primary_ip6" %}
{% if object.primary_ip6 %} {% else %}
<a href="{{ object.primary_ip6.get_absolute_url }}" id="primary_ip6">{{ object.primary_ip6 }}</a> <span class="text-muted"></span>
{% copy_content "primary_ip6" %} {% endif %}
{% else %} </td>
<span class="text-muted"></span> </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Tenant" %}</th>
</tr> <td>
<tr> {% if object.tenant.group %}
<th scope="row">{% trans "Tenant" %}</th> {{ object.tenant.group|linkify }} /
<td> {% endif %}
{% if object.tenant.group %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant.group|linkify }} / </td>
{% endif %} </tr>
{{ object.tenant|linkify|placeholder }} <tr>
</td> <th scope="row">{% trans "Interfaces" %}</th>
</tr> <td>
<tr> <a href="{% url 'dcim:interface_list' %}?vdc_id={{ object.pk }}">{{ object.interfaces.count }}</a>
<th scope="row">{% trans "Interfaces" %}</th> </td>
<td> </tr>
<a href="{% url 'dcim:interface_list' %}?vdc_id={{ object.pk }}">{{ object.interfaces.count }}</a> </table>
</td>
</tr>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -8,76 +8,72 @@
<div class="col col-md-5"> <div class="col col-md-5">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Config Context" %}</h5> <h5 class="card-header">{% trans "Config Context" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Weight" %}</th>
<th scope="row">{% trans "Weight" %}</th> <td>{{ object.weight }}</td>
<td>{{ object.weight }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Active" %}</th>
<th scope="row">{% trans "Active" %}</th> <td>{% checkmark object.is_active %}</td>
<td>{% checkmark object.is_active %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Data Source" %}</th>
<th scope="row">{% trans "Data Source" %}</th> <td>
<td> {% if object.data_source %}
{% if object.data_source %} <a href="{{ object.data_source.get_absolute_url }}">{{ object.data_source }}</a>
<a href="{{ object.data_source.get_absolute_url }}">{{ object.data_source }}</a> {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Data File" %}</th>
<th scope="row">{% trans "Data File" %}</th> <td>
<td> {% if object.data_file %}
{% if object.data_file %} <a href="{{ object.data_file.get_absolute_url }}">{{ object.data_file }}</a>
<a href="{{ object.data_file.get_absolute_url }}">{{ object.data_file }}</a> {% elif object.data_path %}
{% elif object.data_path %} <div class="float-end text-warning">
<div class="float-end text-warning"> <i class="mdi mdi-alert" title="{% trans "The data file associated with this object has been deleted" %}."></i>
<i class="mdi mdi-alert" title="{% trans "The data file associated with this object has been deleted" %}."></i> </div>
</div> {{ object.data_path }}
{{ object.data_path }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Data Synced" %}</th>
<th scope="row">{% trans "Data Synced" %}</th> <td>{{ object.data_synced|placeholder }}</td>
<td>{{ object.data_synced|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Assignment" %}</h5> <h5 class="card-header">{% trans "Assignment" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> {% for title, objects in assigned_objects %}
{% for title, objects in assigned_objects %} <tr>
<tr> <th scope="row">{{ title }}</th>
<th scope="row">{{ title }}</th> <td>
<td> <ul class="list-unstyled mb-0">
<ul class="list-unstyled mb-0"> {% for object in objects %}
{% for object in objects %} <li>{{ object|linkify }}</li>
<li>{{ object|linkify }}</li> {% empty %}
{% empty %} <li class="text-muted">{% trans "None" %}</li>
<li class="text-muted">{% trans "None" %}</li> {% endfor %}
{% endfor %} </ul>
</ul> </td>
</td> </tr>
</tr> {% endfor %}
{% endfor %} </table>
</table>
</div>
</div> </div>
</div> </div>
<div class="col col-md-7"> <div class="col col-md-7">

View File

@ -8,47 +8,45 @@
<div class="col col-md-5"> <div class="col col-md-5">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Config Template" %}</h5> <h5 class="card-header">{% trans "Config Template" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Data Source" %}</th>
<th scope="row">{% trans "Data Source" %}</th> <td>
<td> {% if object.data_source %}
{% if object.data_source %} <a href="{{ object.data_source.get_absolute_url }}">{{ object.data_source }}</a>
<a href="{{ object.data_source.get_absolute_url }}">{{ object.data_source }}</a> {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Data File" %}</th>
<th scope="row">{% trans "Data File" %}</th> <td>
<td> {% if object.data_file %}
{% if object.data_file %} <a href="{{ object.data_file.get_absolute_url }}">{{ object.data_file }}</a>
<a href="{{ object.data_file.get_absolute_url }}">{{ object.data_file }}</a> {% elif object.data_path %}
{% elif object.data_path %} <div class="float-end text-warning">
<div class="float-end text-warning"> <i class="mdi mdi-alert" title="{% trans "The data file associated with this object has been deleted" %}."></i>
<i class="mdi mdi-alert" title="{% trans "The data file associated with this object has been deleted" %}."></i> </div>
</div> {{ object.data_path }}
{{ object.data_path }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Data Synced" %}</th>
<th scope="row">{% trans "Data Synced" %}</th> <td>{{ object.data_synced|placeholder }}</td>
<td>{{ object.data_synced|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -7,127 +7,117 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Custom Field" %}</h5>
{% trans "Custom Field" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
</tr>
<tr>
<th scope="row">Type</th>
<td>
{{ object.get_type_display }}
{% if object.object_type %}({{ object.object_type.model|bettertitle }}){% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Label" %}</th>
<td>{{ object.label|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Group Name" %}</th>
<td>{{ object.group_name|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Description" %}</th>
<td>{{ object.description|markdown|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Required" %}</th>
<td>{% checkmark object.required %}</td>
</tr>
<tr>
<th scope="row">{% trans "Cloneable" %}</th>
<td>{% checkmark object.is_cloneable %}</td>
</tr>
{% if object.choice_set %}
<tr> <tr>
<th scope="row">{% trans "Name" %}</th> <th scope="row">{% trans "Choice Set" %}</th>
<td>{{ object.name }}</td> <td>{{ object.choice_set|linkify }} ({{ object.choice_set.choices|length }} choices)</td>
</tr> </tr>
<tr> {% endif %}
<th scope="row">Type</th> <tr>
<td> <th scope="row">{% trans "Default Value" %}</th>
{{ object.get_type_display }} <td>{{ object.default }}</td>
{% if object.object_type %}({{ object.object_type.model|bettertitle }}){% endif %} </tr>
</td> </table>
</tr>
<tr>
<th scope="row">{% trans "Label" %}</th>
<td>{{ object.label|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Group Name" %}</th>
<td>{{ object.group_name|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Description" %}</th>
<td>{{ object.description|markdown|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Required" %}</th>
<td>{% checkmark object.required %}</td>
</tr>
<tr>
<th scope="row">{% trans "Cloneable" %}</th>
<td>{% checkmark object.is_cloneable %}</td>
</tr>
{% if object.choice_set %}
<tr>
<th scope="row">{% trans "Choice Set" %}</th>
<td>{{ object.choice_set|linkify }} ({{ object.choice_set.choices|length }} choices)</td>
</tr>
{% endif %}
<tr>
<th scope="row">{% trans "Default Value" %}</th>
<td>{{ object.default }}</td>
</tr>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Behavior" %}</h5> <h5 class="card-header">{% trans "Behavior" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Search Weight" %}</th>
<th scope="row">{% trans "Search Weight" %}</th> <td>
<td> {% if object.search_weight %}
{% if object.search_weight %} {{ object.search_weight }}
{{ object.search_weight }} {% else %}
{% else %} <span class="text-muted">{% trans "Disabled" %}</span>
<span class="text-muted">{% trans "Disabled" %}</span> {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Filter Logic" %}</th>
<th scope="row">{% trans "Filter Logic" %}</th> <td>{{ object.get_filter_logic_display }}</td>
<td>{{ object.get_filter_logic_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Display Weight" %}</th>
<th scope="row">{% trans "Display Weight" %}</th> <td>{{ object.weight }}</td>
<td>{{ object.weight }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "UI Visible" %}</th>
<th scope="row">{% trans "UI Visible" %}</th> <td>{{ object.get_ui_visible_display }}</td>
<td>{{ object.get_ui_visible_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "UI Editable" %}</th>
<th scope="row">{% trans "UI Editable" %}</th> <td>{{ object.get_ui_editable_display }}</td>
<td>{{ object.get_ui_editable_display }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Object Types" %}</h5> <h5 class="card-header">{% trans "Object Types" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> {% for ct in object.content_types.all %}
{% for ct in object.content_types.all %} <tr>
<tr> <td>{{ ct }}</td>
<td>{{ ct }}</td> </tr>
</tr> {% endfor %}
{% endfor %} </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Validation Rules" %}</h5> <h5 class="card-header">{% trans "Validation Rules" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Minimum Value" %}</th>
<th scope="row">{% trans "Minimum Value" %}</th> <td>{{ object.validation_minimum|placeholder }}</td>
<td>{{ object.validation_minimum|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Maximum Value" %}</th>
<th scope="row">{% trans "Maximum Value" %}</th> <td>{{ object.validation_maximum|placeholder }}</td>
<td>{{ object.validation_maximum|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Regular Expression" %}</th>
<th scope="row">{% trans "Regular Expression" %}</th> <td>
<td> {% if object.validation_regex %}
{% if object.validation_regex %} <code>{{ object.validation_regex }}</code>
<code>{{ object.validation_regex }}</code> {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">Related Objects</h5> <h5 class="card-header">Related Objects</h5>

View File

@ -7,63 +7,59 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">Custom Field Choice Set</h5> <h5 class="card-header">Custom Field Choice Set</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">Name</th>
<th scope="row">Name</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">Description</th>
<th scope="row">Description</th> <td>{{ object.description|markdown|placeholder }}</td>
<td>{{ object.description|markdown|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">Base Choices</th>
<th scope="row">Base Choices</th> <td>{{ object.get_base_choices_display|placeholder }}</td>
<td>{{ object.get_base_choices_display|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">Choices</th>
<th scope="row">Choices</th> <td>{{ object.choices|length }}</td>
<td>{{ object.choices|length }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">Order Alphabetically</th>
<th scope="row">Order Alphabetically</th> <td>{% checkmark object.order_alphabetically %}</td>
<td>{% checkmark object.order_alphabetically %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">Used by</th>
<th scope="row">Used by</th> <td>
<td> <ul class="list-unstyled mb-0">
<ul class="list-unstyled mb-0"> {% for cf in object.choices_for.all %}
{% for cf in object.choices_for.all %} <li>{{ cf|linkify }}</li>
<li>{{ cf|linkify }}</li> {% endfor %}
{% endfor %} </ul>
</ul> </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">Choices ({{ object.choices|length }})</h5> <h5 class="card-header">Choices ({{ object.choices|length }})</h5>
<div class="card-body"> <table class="table table-hover">
<table class="table table-hover table-headings"> <thead>
<thead> <tr>
<tr> <th>Value</th>
<th>Value</th> <th>Label</th>
<th>Label</th> </tr>
</tr> </thead>
</thead> {% for value, label in choices %}
{% for value, label in choices %} <tr>
<tr> <td>{{ value }}</td>
<td>{{ value }}</td> <td>{{ label }}</td>
<td>{{ label }}</td> </tr>
</tr> {% endfor %}
{% endfor %} </table>
</table> {% include 'inc/paginator.html' with page=choices %}
{% include 'inc/paginator.html' with page=choices %}
</div>
</div> </div>
{% plugin_right_page object %} {% plugin_right_page object %}
</div> </div>

View File

@ -8,46 +8,42 @@
<div class="col col-md-5"> <div class="col col-md-5">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Custom Link" %}</h5> <h5 class="card-header">{% trans "Custom Link" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Enabled" %}</th>
<th scope="row">{% trans "Enabled" %}</th> <td>{% checkmark object.enabled %}</td>
<td>{% checkmark object.enabled %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Group Name" %}</th>
<th scope="row">{% trans "Group Name" %}</th> <td>{{ object.group_name|placeholder }}</td>
<td>{{ object.group_name|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Weight" %}</th>
<th scope="row">{% trans "Weight" %}</th> <td>{{ object.weight }}</td>
<td>{{ object.weight }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Button Class" %}</th>
<th scope="row">{% trans "Button Class" %}</th> <td>{{ object.get_button_class_display }}</td>
<td>{{ object.get_button_class_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "New Window" %}</th>
<th scope="row">{% trans "New Window" %}</th> <td>{% checkmark object.new_window %}</td>
<td>{% checkmark object.new_window %}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Assigned Models" %}</h5> <h5 class="card-header">{% trans "Assigned Models" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> {% for ct in object.content_types.all %}
{% for ct in object.content_types.all %} <tr>
<tr> <td>{{ ct }}</td>
<td>{{ ct }}</td> </tr>
</tr> {% endfor %}
{% endfor %} </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>

View File

@ -7,68 +7,56 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Event Rule" %}</h5>
{% trans "Event Rule" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Enabled" %}</th>
</tr> <td>{% checkmark object.enabled %}</td>
<tr> </tr>
<th scope="row">{% trans "Enabled" %}</th> <tr>
<td>{% checkmark object.enabled %}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Object Types" %}</h5>
{% trans "Object Types" %} <table class="table table-hover attr-table">
</h5> {% for ct in object.content_types.all %}
<div class="card-body"> <tr>
<table class="table table-hover attr-table"> <td>{{ ct }}</td>
{% for ct in object.content_types.all %} </tr>
<tr> {% endfor %}
<td>{{ ct }}</td> </table>
</tr>
{% endfor %}
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Events" %}</h5>
{% trans "Events" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Create" %}</th>
<table class="table table-hover attr-table"> <td>{% checkmark object.type_create %}</td>
<tr> </tr>
<th scope="row">{% trans "Create" %}</th> <tr>
<td>{% checkmark object.type_create %}</td> <th scope="row">{% trans "Update" %}</th>
</tr> <td>{% checkmark object.type_update %}</td>
<tr> </tr>
<th scope="row">{% trans "Update" %}</th> <tr>
<td>{% checkmark object.type_update %}</td> <th scope="row">{% trans "Delete" %}</th>
</tr> <td>{% checkmark object.type_delete %}</td>
<tr> </tr>
<th scope="row">{% trans "Delete" %}</th> <tr>
<td>{% checkmark object.type_delete %}</td> <th scope="row">{% trans "Job start" %}</th>
</tr> <td>{% checkmark object.type_job_start %}</td>
<tr> </tr>
<th scope="row">{% trans "Job start" %}</th> <tr>
<td>{% checkmark object.type_job_start %}</td> <th scope="row">{% trans "Job end" %}</th>
</tr> <td>{% checkmark object.type_job_end %}</td>
<tr> </tr>
<th scope="row">{% trans "Job end" %}</th> </table>
<td>{% checkmark object.type_job_end %}</td>
</tr>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>
@ -86,39 +74,35 @@
</div> </div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Action" %}</h5>
{% trans "Action" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Type" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.get_action_type_display }}</td>
<tr> </tr>
<th scope="row">{% trans "Type" %}</th> <tr>
<td>{{ object.get_action_type_display }}</td> <th scope="row">{% trans "Object" %}</th>
</tr> <td>
<tr> {% if object.action_type == 'script' %}
<th scope="row">{% trans "Object" %}</th> <a href="{% url 'extras:script' module=object.action_object.python_name name=object.action_parameters.script_name %}">
<td> {{ object.action_object }} / {{ object.action_parameters.script_name }}
{% if object.action_type == 'script' %} </a>
<a href="{% url 'extras:script' module=object.action_object.python_name name=object.action_parameters.script_name %}"> {% else %}
{{ object.action_object }} / {{ object.action_parameters.script_name }} {{ object.action_object|linkify }}
</a> {% endif %}
{% else %} </td>
{{ object.action_object|linkify }} </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Data" %}</th>
</tr> <td>
<tr> {% if object.action_data %}
<th scope="row">{% trans "Data" %}</th> <pre>{{ object.action_data|json }}</pre>
<td> {% else %}
{% if object.action_data %} {{ ''|placeholder }}
<pre>{{ object.action_data|json }}</pre> {% endif %}
{% else %} </td>
{{ ''|placeholder }} </tr>
{% endif %} </table>
</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -15,71 +15,67 @@
<div class="col col-md-5"> <div class="col col-md-5">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Export Template" %}</h5> <h5 class="card-header">{% trans "Export Template" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<th scope="row">{% trans "Name" %}</th>
<td>{{ object.name }}</td>
</tr>
<tr>
<th scope="row">{% trans "Description" %}</th>
<td>{{ object.description|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "MIME Type" %}</th>
<td>{{ object.mime_type|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "File Extension" %}</th>
<td>{{ object.file_extension|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Attachment" %}</th>
<td>{% checkmark object.as_attachment %}</td>
</tr>
<tr> <tr>
<th scope="row">{% trans "Name" %}</th> <th scope="row">{% trans "Data Source" %}</th>
<td>{{ object.name }}</td> <td>
{% if object.data_source %}
<a href="{{ object.data_source.get_absolute_url }}">{{ object.data_source }}</a>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr> </tr>
<tr> <tr>
<th scope="row">{% trans "Description" %}</th> <th scope="row">{% trans "Data File" %}</th>
<td>{{ object.description|placeholder }}</td> <td>
{% if object.data_file %}
<a href="{{ object.data_file.get_absolute_url }}">{{ object.data_file }}</a>
{% elif object.data_path %}
<div class="float-end text-warning">
<i class="mdi mdi-alert" title="{% trans "The data file associated with this object has been deleted" %}."></i>
</div>
{{ object.data_path }}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr> </tr>
<tr> <tr>
<th scope="row">{% trans "MIME Type" %}</th> <th scope="row">{% trans "Data Synced" %}</th>
<td>{{ object.mime_type|placeholder }}</td> <td>{{ object.data_synced|placeholder }}</td>
</tr> </tr>
<tr> </table>
<th scope="row">{% trans "File Extension" %}</th>
<td>{{ object.file_extension|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Attachment" %}</th>
<td>{% checkmark object.as_attachment %}</td>
</tr>
<tr>
<th scope="row">{% trans "Data Source" %}</th>
<td>
{% if object.data_source %}
<a href="{{ object.data_source.get_absolute_url }}">{{ object.data_source }}</a>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Data File" %}</th>
<td>
{% if object.data_file %}
<a href="{{ object.data_file.get_absolute_url }}">{{ object.data_file }}</a>
{% elif object.data_path %}
<div class="float-end text-warning">
<i class="mdi mdi-alert" title="{% trans "The data file associated with this object has been deleted" %}."></i>
</div>
{{ object.data_path }}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Data Synced" %}</th>
<td>{{ object.data_synced|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Assigned Models" %}</h5> <h5 class="card-header">{% trans "Assigned Models" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> {% for ct in object.content_types.all %}
{% for ct in object.content_types.all %} <tr>
<tr> <td>{{ ct }}</td>
<td>{{ ct }}</td> </tr>
</tr> {% endfor %}
{% endfor %} </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>

View File

@ -18,63 +18,59 @@
{% if job.completed %} {% if job.completed %}
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Report Methods" %}</h5> <h5 class="card-header">{% trans "Report Methods" %}</h5>
<div class="card-body"> <table class="table table-hover">
<table class="table table-hover"> {% for method, data in job.data.items %}
{% for method, data in job.data.items %} <tr>
<tr> <td class="font-monospace"><a href="#{{ method }}">{{ method }}</a></td>
<td class="font-monospace"><a href="#{{ method }}">{{ method }}</a></td> <td class="text-end report-stats">
<td class="text-end report-stats"> <span class="badge text-bg-success">{{ data.success }}</span>
<span class="badge text-bg-success">{{ data.success }}</span> <span class="badge text-bg-info">{{ data.info }}</span>
<span class="badge text-bg-info">{{ data.info }}</span> <span class="badge text-bg-warning">{{ data.warning }}</span>
<span class="badge text-bg-warning">{{ data.warning }}</span> <span class="badge text-bg-danger">{{ data.failure }}</span>
<span class="badge text-bg-danger">{{ data.failure }}</span> </td>
</td> </tr>
</tr> {% endfor %}
{% endfor %} </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Report Results" %}</h5> <h5 class="card-header">{% trans "Report Results" %}</h5>
<div class="card-body"> <table class="table table-hover report">
<table class="table table-hover report"> <thead>
<thead> <tr class="table-headings">
<tr class="table-headings"> <th>{% trans "Time" %}</th>
<th>{% trans "Time" %}</th> <th>{% trans "Level" %}</th>
<th>{% trans "Level" %}</th> <th>{% trans "Object" %}</th>
<th>{% trans "Object" %}</th> <th>{% trans "Message" %}</th>
<th>{% trans "Message" %}</th> </tr>
</thead>
<tbody>
{% for method, data in job.data.items %}
<tr>
<th colspan="4" style="font-family: monospace">
<a name="{{ method }}"></a>{{ method }}
</th>
</tr> </tr>
</thead> {% for time, level, obj, url, message in data.log %}
<tbody> <tr class="{% if level == 'failure' %}danger{% elif level %}{{ level }}{% endif %}">
{% for method, data in job.data.items %} <td>{{ time }}</td>
<tr> <td>
<th colspan="4" style="font-family: monospace"> <label class="badge text-bg-{% if level == 'failure' %}danger{% else %}{{ level }}{% endif %}">{{ level|title }}</label>
<a name="{{ method }}"></a>{{ method }} </td>
</th> <td>
{% if obj and url %}
<a href="{{ url }}">{{ obj }}</a>
{% elif obj %}
{{ obj }}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
<td class="rendered-markdown">{{ message|markdown }}</td>
</tr> </tr>
{% for time, level, obj, url, message in data.log %}
<tr class="{% if level == 'failure' %}danger{% elif level %}{{ level }}{% endif %}">
<td>{{ time }}</td>
<td>
<label class="badge text-bg-{% if level == 'failure' %}danger{% else %}{{ level }}{% endif %}">{{ level|title }}</label>
</td>
<td>
{% if obj and url %}
<a href="{{ url }}">{{ obj }}</a>
{% elif obj %}
{{ obj }}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
<td class="rendered-markdown">{{ message|markdown }}</td>
</tr>
{% endfor %}
{% endfor %} {% endfor %}
</tbody> {% endfor %}
</table> </tbody>
</div> </table>
</div> </div>
{% elif job.started %} {% elif job.started %}
{% include 'extras/inc/result_pending.html' %} {% include 'extras/inc/result_pending.html' %}

View File

@ -19,28 +19,26 @@
{% if job.completed %} {% if job.completed %}
<div class="card mb-3"> <div class="card mb-3">
<h5 class="card-header">{% trans "Script Log" %}</h5> <h5 class="card-header">{% trans "Script Log" %}</h5>
<div class="card-body"> <table class="table table-hover">
<table class="table table-hover panel-body"> <tr>
<th>{% trans "Line" %}</th>
<th>{% trans "Level" %}</th>
<th>{% trans "Message" %}</th>
</tr>
{% for log in job.data.log %}
<tr> <tr>
<th>{% trans "Line" %}</th> <td>{{ forloop.counter }}</td>
<th>{% trans "Level" %}</th> <td>{% log_level log.status %}</td>
<th>{% trans "Message" %}</th> <td class="rendered-markdown">{{ log.message|markdown }}</td>
</tr> </tr>
{% for log in job.data.log %} {% empty %}
<tr> <tr>
<td>{{ forloop.counter }}</td> <td colspan="3" class="text-center text-muted">
<td>{% log_level log.status %}</td> {% trans "No log output" %}
<td class="rendered-markdown">{{ log.message|markdown }}</td> </td>
</tr> </tr>
{% empty %} {% endfor %}
<tr> </table>
<td colspan="3" class="text-center text-muted">
{% trans "No log output" %}
</td>
</tr>
{% endfor %}
</table>
</div>
{% if execution_time %} {% if execution_time %}
<div class="card-footer text-end text-muted"> <div class="card-footer text-end text-muted">
<small>{% trans "Exec Time" %}: {{ execution_time|floatformat:3 }} {% trans "seconds" context "Unit of time" %}</small> <small>{% trans "Exec Time" %}: {{ execution_time|floatformat:3 }} {% trans "seconds" context "Unit of time" %}</small>

View File

@ -12,29 +12,25 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-5"> <div class="col col-md-5">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Journal Entry" %}</h5>
{% trans "Journal Entry" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Object" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.assigned_object|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Object" %}</th> <tr>
<td>{{ object.assigned_object|linkify }}</td> <th scope="row">{% trans "Created" %}</th>
</tr> <td>{{ object.created|annotated_date }}</td>
<tr> </tr>
<th scope="row">{% trans "Created" %}</th> <tr>
<td>{{ object.created|annotated_date }}</td> <th scope="row">{% trans "Created By" %}</th>
</tr> <td>{{ object.created_by }}</td>
<tr> </tr>
<th scope="row">{% trans "Created By" %}</th> <tr>
<td>{{ object.created_by }}</td> <th scope="row">{% trans "Kind" %}</th>
</tr> <td>{% badge object.get_kind_display bg_color=object.get_kind_color %}</td>
<tr> </tr>
<th scope="row">{% trans "Kind" %}</th> </table>
<td>{% badge object.get_kind_display bg_color=object.get_kind_color %}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -25,57 +25,53 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-5"> <div class="col col-md-5">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Change" %}</h5>
{% trans "Change" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Time" %}</th>
<table class="table table-hover attr-table"> <td>
<tr> {{ object.time|annotated_date }}
<th scope="row">{% trans "Time" %}</th> </td>
<td> </tr>
{{ object.time|annotated_date }} <tr>
</td> <th scope="row">{% trans "User" %}</th>
</tr> <td>
<tr> {% if object.user.get_full_name %}
<th scope="row">{% trans "User" %}</th> {{ object.user.get_full_name }} ({{ object.user_name }})
<td> {% else %}
{% if object.user.get_full_name %} {{ object.user_name }}
{{ object.user.get_full_name }} ({{ object.user_name }}) {% endif %}
{% else %} </td>
{{ object.user_name }} </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Action" %}</th>
</tr> <td>
<tr> {{ object.get_action_display }}
<th scope="row">{% trans "Action" %}</th> </td>
<td> </tr>
{{ object.get_action_display }} <tr>
</td> <th scope="row">{% trans "Object Type" %}</th>
</tr> <td>
<tr> {{ object.changed_object_type }}
<th scope="row">{% trans "Object Type" %}</th> </td>
<td> </tr>
{{ object.changed_object_type }} <tr>
</td> <th scope="row">{% trans "Object" %}</th>
</tr> <td>
<tr> {% if object.changed_object and object.changed_object.get_absolute_url %}
<th scope="row">{% trans "Object" %}</th> {{ object.changed_object|linkify }}
<td> {% else %}
{% if object.changed_object and object.changed_object.get_absolute_url %} {{ object.object_repr }}
{{ object.changed_object|linkify }} {% endif %}
{% else %} </td>
{{ object.object_repr }} </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Request ID" %}</th>
</tr> <td>
<tr> {{ object.request_id }}
<th scope="row">{% trans "Request ID" %}</th> </td>
<td> </tr>
{{ object.request_id }} </table>
</td>
</tr>
</table>
</div>
</div> </div>
</div> </div>
<div class="col col-md-7"> <div class="col col-md-7">

View File

@ -8,46 +8,42 @@
<div class="col col-md-5"> <div class="col col-md-5">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Saved Filter" %}</h5> <h5 class="card-header">{% trans "Saved Filter" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "User" %}</th>
<th scope="row">{% trans "User" %}</th> <td>{{ object.user|placeholder }}</td>
<td>{{ object.user|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Enabled" %}</th>
<th scope="row">{% trans "Enabled" %}</th> <td>{% checkmark object.enabled %}</td>
<td>{% checkmark object.enabled %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Shared" %}</th>
<th scope="row">{% trans "Shared" %}</th> <td>{% checkmark object.shared %}</td>
<td>{% checkmark object.shared %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Weight" %}</th>
<th scope="row">{% trans "Weight" %}</th> <td>{{ object.weight }}</td>
<td>{{ object.weight }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Assigned Models" %}</h5> <h5 class="card-header">{% trans "Assigned Models" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> {% for ct in object.content_types.all %}
{% for ct in object.content_types.all %} <tr>
<tr> <td>{{ ct }}</td>
<td>{{ ct }}</td> </tr>
</tr> {% endfor %}
{% endfor %} </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>

View File

@ -8,77 +8,69 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Tag" %}</h5>
{% trans "Tag" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover panel-body attr-table"> <td>
<tr> {{ object.name }}
<th scope="row">{% trans "Name" %}</th> </td>
<td> </tr>
{{ object.name }} <tr>
</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>
<tr> {{ object.description|placeholder }}
<th scope="row">{% trans "Description" %}</th> </td>
<td> </tr>
{{ object.description|placeholder }} <tr>
</td> <th scope="row">{% trans "Color" %}</th>
</tr> <td>
<tr> <span class="color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
<th scope="row">{% trans "Color" %}</th> </td>
<td> </tr>
<span class="color-label" style="background-color: #{{ object.color }}">&nbsp;</span> <tr>
</td> <th scope="row">{% trans "Tagged Items" %}</th>
</tr> <td>
<tr> {{ taggeditem_table.rows|length }}
<th scope="row">{% trans "Tagged Items" %}</th> </td>
<td> </tr>
{{ taggeditem_table.rows|length }} </table>
</td>
</tr>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Allowed Object Types" %}</h5> <h5 class="card-header">{% trans "Allowed Object Types" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> {% for ct in object.object_types.all %}
{% for ct in object.object_types.all %} <tr>
<tr> <td>{{ ct }}</td>
<td>{{ ct }}</td> </tr>
</tr> {% empty %}
{% empty %} <tr>
<tr> <td class="text-muted">{% trans "Any" %}</td>
<td class="text-muted">{% trans "Any" %}</td> </tr>
</tr> {% endfor %}
{% endfor %} </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Tagged Item Types" %}</h5> <h5 class="card-header">{% trans "Tagged Item Types" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover panel-body attr-table"> {% for object_type in object_types %}
{% for object_type in object_types %} <tr>
<tr> <td>{{ object_type.content_type.name|bettertitle }}</td>
<td>{{ object_type.content_type.name|bettertitle }}</td> <td>
<td> {% with viewname=object_type.content_type.model_class|validated_viewname:"list" %}
{% with viewname=object_type.content_type.model_class|validated_viewname:"list" %} {% if viewname %}
{% if viewname %} <a href="{% url viewname %}?tag={{ object.slug }}">{{ object_type.item_count }}</a>
<a href="{% url viewname %}?tag={{ object.slug }}">{{ object_type.item_count }}</a> {% else %}
{% else %} {{ object_type.item_count }}
{{ object_type.item_count }} {% endif %}
{% endif %} {% endwith %}
{% endwith %} </td>
</td> </tr>
</tr> {% endfor %}
{% endfor %} </table>
</table>
</div>
</div> </div>
{% plugin_right_page object %} {% plugin_right_page object %}
</div> </div>

View File

@ -7,63 +7,51 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Webhook" %}</h5>
{% trans "Webhook" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "HTTP Request" %}</h5>
{% trans "HTTP Request" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "HTTP Method" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.get_http_method_display }}</td>
<tr> </tr>
<th scope="row">{% trans "HTTP Method" %}</th> <tr>
<td>{{ object.get_http_method_display }}</td> <th scope="row">{% trans "Payload URL" %}</th>
</tr> <td class="font-monospace">{{ object.payload_url }}</td>
<tr> </tr>
<th scope="row">{% trans "Payload URL" %}</th> <tr>
<td class="font-monospace">{{ object.payload_url }}</td> <th scope="row">{% trans "HTTP Content Type" %}</th>
</tr> <td>{{ object.http_content_type }}</td>
<tr> </tr>
<th scope="row">{% trans "HTTP Content Type" %}</th> <tr>
<td>{{ object.http_content_type }}</td> <th scope="row">{% trans "Secret" %}</th>
</tr> <td>{{ object.secret|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Secret" %}</th> </table>
<td>{{ object.secret|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "SSL" %}</h5>
{% trans "SSL" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "SSL Verification" %}</th>
<table class="table table-hover attr-table"> <td>{% checkmark object.ssl_verification %}</td>
<tr> </tr>
<th scope="row">{% trans "SSL Verification" %}</th> <tr>
<td>{% checkmark object.ssl_verification %}</td> <th scope="row">{% trans "CA File Path" %}</th>
</tr> <td>{{ object.ca_file_path|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "CA File Path" %}</th> </table>
<td>{{ object.ca_file_path|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>

View File

@ -105,87 +105,83 @@ Context:
<div class="row my-3"> <div class="row my-3">
<div class="col col-md-12"> <div class="col col-md-12">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Field Options" %}</h5>
{% trans "Field Options" %} <table class="table">
</h5> <tr>
<div class="card-body"> <th>{% trans "Field" %}</th>
<table class="table"> <th>{% trans "Required" %}</th>
<th>{% trans "Accessor" %}</th>
<th>{% trans "Description" %}</th>
</tr>
{% for name, field in fields.items %}
<tr> <tr>
<th>{% trans "Field" %}</th> <td>
<th>{% trans "Required" %}</th> <code>{% if field.required %}<strong>{% endif %}{{ name }}{% if field.required %}</strong>{% endif %}</code>
<th>{% trans "Accessor" %}</th> </td>
<th>{% trans "Description" %}</th> <td>
</tr> {% if field.required %}
{% for name, field in fields.items %} {% checkmark True true="Required" %}
<tr> {% else %}
<td> {{ ''|placeholder }}
<code>{% if field.required %}<strong>{% endif %}{{ name }}{% if field.required %}</strong>{% endif %}</code> {% endif %}
</td> </td>
<td> <td>
{% if field.required %} {% if field.to_field_name %}
{% checkmark True true="Required" %} <code>{{ field.to_field_name }}</code>
{% else %} {% else %}
{{ ''|placeholder }} {{ ''|placeholder }}
{% endif %} {% endif %}
</td> </td>
<td> <td>
{% if field.to_field_name %} {% if field.STATIC_CHOICES %}
<code>{{ field.to_field_name }}</code> <button type="button" class="btn btn-link float-end" data-bs-toggle="modal" data-bs-target="#{{ name }}_choices">
{% else %} <i class="mdi mdi-help-circle"></i>
{{ ''|placeholder }} </button>
{% endif %} <div class="modal fade" id="{{ name }}_choices" tabindex="-1" role="dialog">
</td> <div class="modal-dialog" role="document">
<td> <div class="modal-content">
{% if field.STATIC_CHOICES %} <div class="modal-header">
<button type="button" class="btn btn-link float-end" data-bs-toggle="modal" data-bs-target="#{{ name }}_choices"> <h5 class="modal-title"><code>{{ name }}</code> {% trans "Choices" %}</h5>
<i class="mdi mdi-help-circle"></i> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</button> </div>
<div class="modal fade" id="{{ name }}_choices" tabindex="-1" role="dialog"> <div class="modal-body">
<div class="modal-dialog" role="document"> <table class="table table-striped">
<div class="modal-content"> <tr>
<div class="modal-header"> <th>{% trans "Import Value" %}</th>
<h5 class="modal-title"><code>{{ name }}</code> {% trans "Choices" %}</h5> <th>{% trans "Label" %}</th>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> </tr>
</div> {% for value, label in field.choices %}
<div class="modal-body"> {% if value %}
<table class="table table-striped"> <tr>
<tr> <td>
<th>{% trans "Import Value" %}</th> <samp>{{ value }}</samp>
<th>{% trans "Label" %}</th> </td>
</tr> <td>
{% for value, label in field.choices %} {{ label }}
{% if value %} </td>
<tr> </tr>
<td> {% endif %}
<samp>{{ value }}</samp> {% endfor %}
</td> </table>
<td>
{{ label }}
</td>
</tr>
{% endif %}
{% endfor %}
</table>
</div>
</div> </div>
</div> </div>
</div> </div>
{% endif %} </div>
{% if field.help_text %} {% endif %}
{{ field.help_text }}<br /> {% if field.help_text %}
{% elif field.label %} {{ field.help_text }}<br />
{{ field.label }}<br /> {% elif field.label %}
{% endif %} {{ field.label }}<br />
{% if field|widget_type == 'dateinput' %} {% endif %}
<small class="text-muted">{% trans "Format: YYYY-MM-DD" %}</small> {% if field|widget_type == 'dateinput' %}
{% elif field|widget_type == 'checkboxinput' %} <small class="text-muted">{% trans "Format: YYYY-MM-DD" %}</small>
<small class="text-muted">{% trans "Specify true or false" %}</small> {% elif field|widget_type == 'checkboxinput' %}
{% endif %} <small class="text-muted">{% trans "Specify true or false" %}</small>
</td> {% endif %}
</tr> </td>
{% endfor %} </tr>
</table> {% endfor %}
</div> </table>
</div> </div>
</div> </div>
</div> </div>

View File

@ -5,7 +5,7 @@
{% if heading %} {% if heading %}
<h5 class="card-header{% if panel_class %} text-{{ panel_class }}{% endif %}">{{ heading }}</h5> <h5 class="card-header{% if panel_class %} text-{{ panel_class }}{% endif %}">{{ heading }}</h5>
{% endif %} {% endif %}
<div class="card-body table-responsive"> <div class="table-responsive">
{% if table.rows %} {% if table.rows %}
{% render_table table 'inc/table.html' %} {% render_table table 'inc/table.html' %}
{% else %} {% else %}

View File

@ -5,32 +5,30 @@
{% if custom_fields %} {% if custom_fields %}
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Custom Fields" %}</h5> <h5 class="card-header">{% trans "Custom Fields" %}</h5>
<div class="card-body"> {% for group_name, fields in custom_fields.items %}
{% for group_name, fields in custom_fields.items %} {% if group_name %}
{% if group_name %} <h6>{{ group_name }}</h6>
<h6>{{ group_name }}</h6> {% endif %}
{% endif %} <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> {% for field, value in fields.items %}
{% for field, value in fields.items %} <tr>
<tr> <th scope="row">{{ field }}
<th scope="row">{{ field }} {% if field.description %}
{% if field.description %} <i
<i class="mdi mdi-information text-primary"
class="mdi mdi-information text-primary" data-bs-toggle="tooltip"
data-bs-toggle="tooltip" data-bs-placement="right"
data-bs-placement="right" title="{{ field.description|escape }}"
title="{{ field.description|escape }}" ></i>
></i> {% endif %}
{% endif %} </th>
</th> <td>
<td> {% customfield_value field value %}
{% customfield_value field value %} </td>
</td> </tr>
</tr> {% endfor %}
{% endfor %} </table>
</table> {% endfor %}
{% endfor %}
</div>
</div> </div>
{% endif %} {% endif %}
{% endwith %} {% endwith %}

View File

@ -9,43 +9,41 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Aggregate" %}</h5> <h5 class="card-header">{% trans "Aggregate" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Family" %}</th>
<th scope="row">{% trans "Family" %}</th> <td>IPv{{ object.family }}</td>
<td>IPv{{ object.family }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "RIR" %}</th>
<th scope="row">{% trans "RIR" %}</th> <td>
<td> <a href="{% url 'ipam:aggregate_list' %}?rir={{ object.rir.slug }}">{{ object.rir }}</a>
<a href="{% url 'ipam:aggregate_list' %}?rir={{ object.rir.slug }}">{{ object.rir }}</a> </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Utilization" %}</th>
<th scope="row">{% trans "Utilization" %}</th> <td>
<td> {% utilization_graph object.get_utilization %}
{% utilization_graph object.get_utilization %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Tenant" %}</th>
<th scope="row">{% trans "Tenant" %}</th> <td>
<td> {% if object.tenant.group %}
{% if object.tenant.group %} {{ object.tenant.group|linkify }} /
{{ object.tenant.group|linkify }} / {% endif %}
{% endif %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant|linkify|placeholder }} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Date Added" %}</th>
<th scope="row">{% trans "Date Added" %}</th> <td>{{ object.date_added|annotated_date|placeholder }}</td>
<td>{{ object.date_added|annotated_date|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>

View File

@ -18,33 +18,31 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "ASN" %}</h5> <h5 class="card-header">{% trans "ASN" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "AS Number" %}</th>
<th scope="row">{% trans "AS Number" %}</th> <td>{{ object.asn_with_asdot }}</td>
<td>{{ object.asn_with_asdot }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "RIR" %}</th>
<th scope="row">{% trans "RIR" %}</th> <td>
<td> <a href="{% url 'ipam:asn_list' %}?rir={{ object.rir.slug }}">{{ object.rir }}</a>
<a href="{% url 'ipam:asn_list' %}?rir={{ object.rir.slug }}">{{ object.rir }}</a> </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Tenant" %}</th>
<th scope="row">{% trans "Tenant" %}</th> <td>
<td> {% if object.tenant.group %}
{% if object.tenant.group %} {{ object.tenant.group|linkify }} /
{{ object.tenant.group|linkify }} / {% endif %}
{% endif %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant|linkify|placeholder }} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -10,37 +10,35 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "ASN Range" %}</h5> <h5 class="card-header">{% trans "ASN Range" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "RIR" %}</th>
<th scope="row">{% trans "RIR" %}</th> <td>
<td> <a href="{% url 'ipam:asnrange_list' %}?rir={{ object.rir.slug }}">{{ object.rir }}</a>
<a href="{% url 'ipam:asnrange_list' %}?rir={{ object.rir.slug }}">{{ object.rir }}</a> </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Range" %}</th>
<th scope="row">{% trans "Range" %}</th> <td>{{ object.range_as_string }}</td>
<td>{{ object.range_as_string }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Tenant" %}</th>
<th scope="row">{% trans "Tenant" %}</th> <td>
<td> {% if object.tenant.group %}
{% if object.tenant.group %} {{ object.tenant.group|linkify }} /
{{ object.tenant.group|linkify }} / {% endif %}
{% endif %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant|linkify|placeholder }} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -17,30 +17,28 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "FHRP Group" %}</h5> <h5 class="card-header">{% trans "FHRP Group" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Protocol" %}</th>
<th scope="row">{% trans "Protocol" %}</th> <td>{{ object.get_protocol_display }}</td>
<td>{{ object.get_protocol_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Group ID" %}</th>
<th scope="row">{% trans "Group ID" %}</th> <td>{{ object.group_id }}</td>
<td>{{ object.group_id }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name|placeholder }}</td>
<td>{{ object.name|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Members" %}</th>
<th scope="row">{% trans "Members" %}</th> <td>{{ member_count }}</td>
<td>{{ member_count }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/comments.html' %} {% include 'inc/panels/comments.html' %}
@ -49,18 +47,16 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Authentication" %}</h5> <h5 class="card-header">{% trans "Authentication" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Authentication Type" %}</th>
<th scope="row">{% trans "Authentication Type" %}</th> <td>{{ object.get_auth_type_display|placeholder }}</td>
<td>{{ object.get_auth_type_display|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Authentication Key" %}</th>
<th scope="row">{% trans "Authentication Key" %}</th> <td>{{ object.auth_key|placeholder }}</td>
<td>{{ object.auth_key|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %} {% plugin_right_page object %}

View File

@ -3,49 +3,47 @@
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "FHRP Groups" %}</h5> <h5 class="card-header">{% trans "FHRP Groups" %}</h5>
<div class="card-body"> <table class="table table-hover">
<table class="table table-hover table-headings"> <thead>
<thead> <tr>
<th>{% trans "Group" %}</th>
<th>{% trans "Protocol" %}</th>
<th>{% trans "Virtual IPs" %}</th>
<th>{% trans "Priority" %}</th>
<th></th>
</tr>
</thead>
<tbody>
{% for assignment in object.fhrp_group_assignments.all %}
<tr> <tr>
<th>{% trans "Group" %}</th> <td>{{ assignment.group|linkify:"group_id" }}</td>
<th>{% trans "Protocol" %}</th> <td>{{ assignment.group.get_protocol_display }}</td>
<th>{% trans "Virtual IPs" %}</th> <td>
<th>{% trans "Priority" %}</th> {% for ipaddress in assignment.group.ip_addresses.all %}
<th></th> {{ ipaddress|linkify }}{% if not forloop.last %}<br />{% endif %}
{% endfor %}
</td>
<td>{{ assignment.priority }}</td>
<td class="text-end noprint">
{% if perms.ipam.change_fhrpgroupassignment %}
<a href="{% url 'ipam:fhrpgroupassignment_edit' pk=assignment.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-warning lh-1" title="{% trans "Edit" %}">
<i class="mdi mdi-pencil" aria-hidden="true"></i>
</a>
{% endif %}
{% if perms.ipam.delete_fhrpgroupassignment %}
<a href="{% url 'ipam:fhrpgroupassignment_delete' pk=assignment.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-danger lh-1" title="{% trans "Delete" %}">
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i>
</a>
{% endif %}
</td>
</tr> </tr>
</thead> {% empty %}
<tbody> <tr>
{% for assignment in object.fhrp_group_assignments.all %} <td colspan="5" class="text-muted">{% trans "None" %}</td>
<tr> </tr>
<td>{{ assignment.group|linkify:"group_id" }}</td> {% endfor %}
<td>{{ assignment.group.get_protocol_display }}</td> </tbody>
<td> </table>
{% for ipaddress in assignment.group.ip_addresses.all %}
{{ ipaddress|linkify }}{% if not forloop.last %}<br />{% endif %}
{% endfor %}
</td>
<td>{{ assignment.priority }}</td>
<td class="text-end noprint">
{% if perms.ipam.change_fhrpgroupassignment %}
<a href="{% url 'ipam:fhrpgroupassignment_edit' pk=assignment.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-warning lh-1" title="{% trans "Edit" %}">
<i class="mdi mdi-pencil" aria-hidden="true"></i>
</a>
{% endif %}
{% if perms.ipam.delete_fhrpgroupassignment %}
<a href="{% url 'ipam:fhrpgroupassignment_delete' pk=assignment.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-danger lh-1" title="{% trans "Delete" %}">
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i>
</a>
{% endif %}
</td>
</tr>
{% empty %}
<tr>
<td colspan="5" class="text-muted">{% trans "None" %}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="card-footer text-end noprint"> <div class="card-footer text-end noprint">
{% if perms.ipam.add_fhrpgroup %} {% if perms.ipam.add_fhrpgroup %}
<a href="{% url 'ipam:fhrpgroup_add' %}?return_url={% url 'ipam:fhrpgroupassignment_add' %}%3Finterface_type={{ object|content_type_id }}%26interface_id={{ object.pk }}" class="btn btn-primary"> <a href="{% url 'ipam:fhrpgroup_add' %}?return_url={% url 'ipam:fhrpgroupassignment_add' %}%3Finterface_type={{ object|content_type_id }}%26interface_id={{ object.pk }}" class="btn btn-primary">

View File

@ -8,105 +8,101 @@
<div class="row"> <div class="row">
<div class="col col-md-4"> <div class="col col-md-4">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "IP Address" %}</h5>
{% trans "IP Address" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Family" %}</th>
<table class="table table-hover attr-table"> <td>IPv{{ object.family }}</td>
<tr> </tr>
<th scope="row">{% trans "Family" %}</th> <tr>
<td>IPv{{ object.family }}</td> <th scope="row">{% trans "VRF" %}</th>
</tr> <td>
<tr> {% if object.vrf %}
<th scope="row">{% trans "VRF" %}</th> <a href="{% url 'ipam:vrf' pk=object.vrf.pk %}">{{ object.vrf }}</a>
<td> {% else %}
{% if object.vrf %} <span>{% trans "Global" %}</span>
<a href="{% url 'ipam:vrf' pk=object.vrf.pk %}">{{ object.vrf }}</a> {% endif %}
{% else %} </td>
<span>{% trans "Global" %}</span> </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Tenant" %}</th>
</tr> <td>
<tr> {% if object.tenant.group %}
<th scope="row">{% trans "Tenant" %}</th> {{ object.tenant.group|linkify }} /
<td> {% endif %}
{% if object.tenant.group %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant.group|linkify }} / </td>
{% endif %} </tr>
{{ object.tenant|linkify|placeholder }} <tr>
</td> <th scope="row">{% trans "Status" %}</th>
</tr> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<tr> </tr>
<th scope="row">{% trans "Status" %}</th> <tr>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> <th scope="row">{% trans "Role" %}</th>
</tr> <td>
<tr> {% if object.role %}
<th scope="row">{% trans "Role" %}</th> <a href="{% url 'ipam:ipaddress_list' %}?role={{ object.role }}">{{ object.get_role_display }}</a>
<td> {% else %}
{% if object.role %}
<a href="{% url 'ipam:ipaddress_list' %}?role={{ object.role }}">{{ object.get_role_display }}</a>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "DNS Name" %}</th>
<td>{{ object.dns_name|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Description" %}</th>
<td>{{ object.description|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Assignment" %}</th>
<td>
{% if object.assigned_object %}
{% if object.assigned_object.parent_object %}
{{ object.assigned_object.parent_object|linkify }} /
{% endif %}
{{ object.assigned_object|linkify }}
{% else %}
{{ ''|placeholder }} {{ ''|placeholder }}
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th scope="row">{% trans "NAT (inside)" %}</th> <th scope="row">{% trans "DNS Name" %}</th>
<td> <td>{{ object.dns_name|placeholder }}</td>
{% if object.nat_inside %} </tr>
{{ object.nat_inside|linkify }} <tr>
{% if object.nat_inside.assigned_object %} <th scope="row">{% trans "Description" %}</th>
({{ object.nat_inside.assigned_object.parent_object|linkify }}) <td>{{ object.description|placeholder }}</td>
{% endif %} </tr>
{% else %} <tr>
{{ ''|placeholder }} <th scope="row">{% trans "Assignment" %}</th>
<td>
{% if object.assigned_object %}
{% if object.assigned_object.parent_object %}
{{ object.assigned_object.parent_object|linkify }} /
{% endif %}
{{ object.assigned_object|linkify }}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "NAT (inside)" %}</th>
<td>
{% if object.nat_inside %}
{{ object.nat_inside|linkify }}
{% if object.nat_inside.assigned_object %}
({{ object.nat_inside.assigned_object.parent_object|linkify }})
{% endif %} {% endif %}
</td> {% else %}
</tr>
<tr>
<th scope="row">{% trans "NAT (outside)" %}</th>
<td>
{% for ip in object.nat_outside.all %}
{{ ip|linkify }}
{% if ip.assigned_object %}
({{ ip.assigned_object.parent_object|linkify }})
{% endif %}<br/>
{% empty %}
{{ ''|placeholder }} {{ ''|placeholder }}
{% endfor %} {% endif %}
</td> </td>
</tr> </tr>
<tr> <tr>
<th scope="row">Primary IP</th> <th scope="row">{% trans "NAT (outside)" %}</th>
<td>{% checkmark object.is_primary_ip %}</td> <td>
</tr> {% for ip in object.nat_outside.all %}
<tr> {{ ip|linkify }}
<th scope="row">OOB IP</th> {% if ip.assigned_object %}
<td>{% checkmark object.is_oob_ip %}</td> ({{ ip.assigned_object.parent_object|linkify }})
</tr> {% endif %}<br/>
</table> {% empty %}
</div> {{ ''|placeholder }}
{% endfor %}
</td>
</tr>
<tr>
<th scope="row">Primary IP</th>
<td>{% checkmark object.is_primary_ip %}</td>
</tr>
<tr>
<th scope="row">OOB IP</th>
<td>{% checkmark object.is_oob_ip %}</td>
</tr>
</table>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}

View File

@ -5,82 +5,78 @@
{% block content %} {% block content %}
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "IP Range" %}</h5>
{% trans "IP Range" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Family" %}</th>
<table class="table table-hover attr-table"> <td>IPv{{ object.family }}</td>
<tr> </tr>
<th scope="row">{% trans "Family" %}</th> <tr>
<td>IPv{{ object.family }}</td> <th scope="row">{% trans "Starting Address" %}</th>
</tr> <td>{{ object.start_address }}</td>
<tr> </tr>
<th scope="row">{% trans "Starting Address" %}</th> <tr>
<td>{{ object.start_address }}</td> <th scope="row">{% trans "Ending Address" %}</th>
</tr> <td>{{ object.end_address }}</td>
<tr> </tr>
<th scope="row">{% trans "Ending Address" %}</th> <tr>
<td>{{ object.end_address }}</td> <th scope="row">{% trans "Size" %}</th>
</tr> <td>{{ object.size }}</td>
<tr> </tr>
<th scope="row">{% trans "Size" %}</th> <tr>
<td>{{ object.size }}</td> <th scope="row">{% trans "Utilization" %}</th>
</tr> <td>
<tr> {% if object.mark_utilized %}
<th scope="row">{% trans "Utilization" %}</th> {% utilization_graph 100 warning_threshold=0 danger_threshold=0 %}
<td> <small>({% trans "Marked fully utilized" %})</small>
{% if object.mark_utilized %} {% else %}
{% utilization_graph 100 warning_threshold=0 danger_threshold=0 %} {% utilization_graph object.utilization %}
<small>({% trans "Marked fully utilized" %})</small> {% endif %}
{% else %} </td>
{% utilization_graph object.utilization %} </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "VRF" %}</th>
</tr> <td>
<tr> {% if object.vrf %}
<th scope="row">{% trans "VRF" %}</th> {{ object.vrf|linkify }} ({{ object.vrf.rd }})
<td> {% else %}
{% if object.vrf %} <span>{% trans "Global" %}</span>
{{ object.vrf|linkify }} ({{ object.vrf.rd }}) {% endif %}
{% else %} </td>
<span>{% trans "Global" %}</span> </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Role" %}</th>
</tr> <td>{{ object.role|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Role" %}</th> <tr>
<td>{{ object.role|linkify|placeholder }}</td> <th scope="row">{% trans "Status" %}</th>
</tr> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<tr> </tr>
<th scope="row">{% trans "Status" %}</th> <tr>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> <th scope="row">{% trans "Tenant" %}</th>
</tr> <td>
<tr> {% if object.tenant.group %}
<th scope="row">{% trans "Tenant" %}</th> {{ object.tenant.group|linkify }} /
<td> {% endif %}
{% if object.tenant.group %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant.group|linkify }} / </td>
{% endif %} </tr>
{{ object.tenant|linkify|placeholder }} <tr>
</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div>
{% plugin_left_page object %}
</div>
<div class="col col-md-6">
{% include 'inc/panels/tags.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/comments.html' %}
{% plugin_right_page object %}
</div> </div>
{% plugin_left_page object %}
</div>
<div class="col col-md-6">
{% include 'inc/panels/tags.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/comments.html' %}
{% plugin_right_page object %}
</div>
</div> </div>
<div class="row"> <div class="row">
<div class="col col-md-12"> <div class="col col-md-12">
@ -88,8 +84,8 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col col-md-12"> <div class="col col-md-12">
{% plugin_full_width_page object %} {% plugin_full_width_page object %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -10,149 +10,145 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Prefix" %}</h5> <h5 class="card-header">{% trans "Prefix" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Family" %}</th>
<th scope="row">{% trans "Family" %}</th> <td>IPv{{ object.family }}</td>
<td>IPv{{ object.family }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "VRF" %}</th>
<th scope="row">{% trans "VRF" %}</th> <td>
{% if object.vrf %}
<a href="{% url 'ipam:vrf' pk=object.vrf.pk %}">{{ object.vrf }}</a>
{% else %}
<span>{% trans "Global" %}</span>
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Tenant" %}</th>
<td> <td>
{% if object.vrf %} {% if object.tenant.group %}
<a href="{% url 'ipam:vrf' pk=object.vrf.pk %}">{{ object.vrf }}</a> {{ object.tenant.group|linkify }} /
{% else %}
<span>{% trans "Global" %}</span>
{% endif %} {% endif %}
{{ object.tenant|linkify|placeholder }}
</td>
</tr>
<tr>
<th scope="row">{% trans "Aggregate" %}</th>
<td>
{% if aggregate %}
<a href="{% url 'ipam:aggregate' pk=aggregate.pk %}">{{ aggregate.prefix }}</a> ({{ aggregate.rir }})
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
{% if object.site.region %}
<tr>
<th scope="row">{% trans "Region" %}</th>
<td>
{% nested_tree object.site.region %}
</td> </td>
</tr> </tr>
<tr> {% endif %}
<th scope="row">{% trans "Tenant" %}</th> <tr>
<td> <th scope="row">{% trans "Site" %}</th>
{% if object.tenant.group %} <td>{{ object.site|linkify|placeholder }}</td>
{{ object.tenant.group|linkify }} / </tr>
{% endif %} <tr>
{{ object.tenant|linkify|placeholder }} <th scope="row">{% trans "VLAN" %}</th>
</td> <td>
</tr> {% if object.vlan %}
<tr> {% if object.vlan.group %}
<th scope="row">{% trans "Aggregate" %}</th> {{ object.vlan.group|linkify }} /
<td>
{% if aggregate %}
<a href="{% url 'ipam:aggregate' pk=aggregate.pk %}">{{ aggregate.prefix }}</a> ({{ aggregate.rir }})
{% else %}
{{ ''|placeholder }}
{% endif %} {% endif %}
</td> {{ object.vlan|linkify }}
</tr> {% else %}
{% if object.site.region %} {{ ''|placeholder }}
<tr> {% endif %}
<th scope="row">{% trans "Region" %}</th> </td>
<td> </tr>
{% nested_tree object.site.region %} <tr>
</td> <th scope="row">{% trans "Status" %}</th>
</tr> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
{% endif %} </tr>
<tr> <tr>
<th scope="row">{% trans "Site" %}</th> <th scope="row">{% trans "Role" %}</th>
<td>{{ object.site|linkify|placeholder }}</td> <td>{{ object.role|linkify|placeholder }}</td>
</tr> </tr>
<tr> <tr>
<th scope="row">{% trans "VLAN" %}</th> <th scope="row">{% trans "Description" %}</th>
<td> <td>{{ object.description|placeholder }}</td>
{% if object.vlan %} </tr>
{% if object.vlan.group %} <tr>
{{ object.vlan.group|linkify }} / <th scope="row">{% trans "Is a pool" %}</th>
{% endif %} <td>{% checkmark object.is_pool %}</td>
{{ object.vlan|linkify }} </tr>
{% else %} </table>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Status" %}</th>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
</tr>
<tr>
<th scope="row">{% trans "Role" %}</th>
<td>{{ object.role|linkify|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Description" %}</th>
<td>{{ object.description|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Is a pool" %}</th>
<td>{% checkmark object.is_pool %}</td>
</tr>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Addressing" %}</h5> <h5 class="card-header">{% trans "Addressing" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<th scope="row">{% trans "Utilization" %}</th>
<td>
{% if object.mark_utilized %}
{% utilization_graph 100 warning_threshold=0 danger_threshold=0 %}
<small>({% trans "Marked fully utilized" %})</small>
{% else %}
{% utilization_graph object.get_utilization %}
{% endif %}
</td>
</tr>
{% with child_ip_count=object.get_child_ips.count %}
<tr> <tr>
<th scope="row">{% trans "Utilization" %}</th> <th scope="row">{% trans "Child IPs" %}</th>
<td> <td>
{% if object.mark_utilized %} <a href="{% url 'ipam:prefix_ipaddresses' pk=object.pk %}">{{ child_ip_count }}</a>
{% utilization_graph 100 warning_threshold=0 danger_threshold=0 %} </td>
<small>({% trans "Marked fully utilized" %})</small> </tr>
{% endwith %}
{% with available_count=object.get_available_ips.size %}
<tr>
<th scope="row">{% trans "Available IPs" %}</th>
<td>
{# Use human-friendly words for counts greater than one million #}
{% if available_count > 1000000 %}
{{ available_count|intword }}
{% else %} {% else %}
{% utilization_graph object.get_utilization %} {{ available_count|intcomma }}
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
{% with child_ip_count=object.get_child_ips.count %} {% endwith %}
<tr> <tr>
<th scope="row">{% trans "Child IPs" %}</th> <th scope="row">{% trans "First available IP" %}</th>
<td> <td>
<a href="{% url 'ipam:prefix_ipaddresses' pk=object.pk %}">{{ child_ip_count }}</a> {% with first_available_ip=object.get_first_available_ip %}
</td> {% if first_available_ip %}
</tr> {% if perms.ipam.add_ipaddress %}
{% endwith %} <a href="{% url 'ipam:ipaddress_add' %}?address={{ first_available_ip }}{% if object.vrf %}&vrf={{ object.vrf_id }}{% endif %}">{{ first_available_ip }}</a>
{% with available_count=object.get_available_ips.size %}
<tr>
<th scope="row">{% trans "Available IPs" %}</th>
<td>
{# Use human-friendly words for counts greater than one million #}
{% if available_count > 1000000 %}
{{ available_count|intword }}
{% else %} {% else %}
{{ available_count|intcomma }} {{ first_available_ip }}
{% endif %} {% endif %}
</td> {% else %}
</tr> {{ ''|placeholder }}
{% endwith %} {% endif %}
<tr> {% endwith %}
<th scope="row">{% trans "First available IP" %}</th> </td>
<td> </tr>
{% with first_available_ip=object.get_first_available_ip %} </table>
{% if first_available_ip %} {% if object.prefix.version == 4 %}
{% if perms.ipam.add_ipaddress %} <div class="card-footer text-end">
<a href="{% url 'ipam:ipaddress_add' %}?address={{ first_available_ip }}{% if object.vrf %}&vrf={{ object.vrf_id }}{% endif %}">{{ first_available_ip }}</a> <a class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#prefix-modal">
{% else %} <i class="mdi mdi-information-outline" aria-hidden="true"></i> {% trans "Addressing Details" %}
{{ first_available_ip }} </a>
{% endif %} </div>
{% else %} {% endif %}
{{ ''|placeholder }}
{% endif %}
{% endwith %}
</td>
</tr>
</table>
{% if object.prefix.version == 4 %}
<div class="float-end">
<a class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#prefix-modal">
<i class="mdi mdi-information-outline" aria-hidden="true"></i> {% trans "Addressing Details" %}
</a>
</div>
{% endif %}
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -181,8 +177,8 @@
<h5 class="modal-title">{% trans "Prefix Details" %}</h5> <h5 class="modal-title">{% trans "Prefix Details" %}</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div> </div>
<div class="modal-body"> <div class="modal-body p-0">
<table class="table table-hover attr-table"> <table class="table table-hover attr-table m-0">
<tr> <tr>
<th scope="row">{% trans "Network Address" %}</th> <th scope="row">{% trans "Network Address" %}</th>
<td>{{ object.prefix.network }}</td> <td>{{ object.prefix.network }}</td>

View File

@ -16,25 +16,21 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "RIR" %}</h5>
{% trans "RIR" %}
</h5>
<div class="card-body">
<table class="table table-hover attr-table"> <table class="table table-hover attr-table">
<tr> <tr>
<th scope="row">{% trans "Name" %}</th> <th scope="row">{% trans "Name" %}</th>
<td>{{ object.name }}</td> <td>{{ object.name }}</td>
</tr> </tr>
<tr> <tr>
<th scope="row">{% trans "Description" %}</th> <th scope="row">{% trans "Description" %}</th>
<td>{{ object.description|placeholder }}</td> <td>{{ object.description|placeholder }}</td>
</tr> </tr>
<tr> <tr>
<th scope="row">{% trans "Private" %}</th> <th scope="row">{% trans "Private" %}</th>
<td>{% checkmark object.is_private %}</td> <td>{% checkmark object.is_private %}</td>
</tr> </tr>
</table> </table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -16,25 +16,21 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Role" %}</h5>
{% trans "Role" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Weight" %}</th>
</tr> <td>{{ object.weight }}</td>
<tr> </tr>
<th scope="row">{% trans "Weight" %}</th> </table>
<td>{{ object.weight }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -8,22 +8,20 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Route Target" %}</h5> <h5 class="card-header">{% trans "Route Target" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td class="font-monospace">{{ object.name }}</td>
<td class="font-monospace">{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Tenant" %}</th>
<th scope="row">{% trans "Tenant" %}</th> <td>{{ object.tenant|linkify|placeholder }}</td>
<td>{{ object.tenant|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -18,43 +18,39 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Service" %}</h5>
{% trans "Service" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Parent" %}</th>
</tr> <td>{{ object.parent|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Parent" %}</th> <tr>
<td>{{ object.parent|linkify }}</td> <th scope="row">{% trans "Protocol" %}</th>
</tr> <td>{{ object.get_protocol_display }}</td>
<tr> </tr>
<th scope="row">{% trans "Protocol" %}</th> <tr>
<td>{{ object.get_protocol_display }}</td> <th scope="row">{% trans "Ports" %}</th>
</tr> <td>{{ object.port_list }}</td>
<tr> </tr>
<th scope="row">{% trans "Ports" %}</th> <tr>
<td>{{ object.port_list }}</td> <th scope="row">{% trans "IP Addresses" %}</th>
</tr> <td>
<tr> {% for ipaddress in object.ipaddresses.all %}
<th scope="row">{% trans "IP Addresses" %}</th> {{ ipaddress|linkify }}<br />
<td> {% empty %}
{% for ipaddress in object.ipaddresses.all %} {{ ''|placeholder }}
{{ ipaddress|linkify }}<br /> {% endfor %}
{% empty %} </td>
{{ ''|placeholder }} </tr>
{% endfor %} <tr>
</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>

View File

@ -10,26 +10,24 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Service Template" %}</h5> <h5 class="card-header">{% trans "Service Template" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Protocol" %}</th>
<th scope="row">{% trans "Protocol" %}</th> <td>{{ object.get_protocol_display }}</td>
<td>{{ object.get_protocol_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Ports" %}</th>
<th scope="row">{% trans "Ports" %}</th> <td>{{ object.port_list }}</td>
<td>{{ object.port_list }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>

View File

@ -9,68 +9,64 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "VLAN" %}</h5>
{% trans "VLAN" %} <table class="table table-hover attr-table">
</h5> {% if object.site.region %}
<div class="card-body">
<table class="table table-hover attr-table">
{% if object.site.region %}
<tr>
<th scope="row">{% trans "Region" %}</th>
<td>
{% nested_tree object.site.region %}
</td>
</tr>
{% endif %}
<tr> <tr>
<th scope="row">{% trans "Site" %}</th> <th scope="row">{% trans "Region" %}</th>
<td>{{ object.site|linkify|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "Group" %}</th>
<td>{{ object.group|linkify|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "VLAN ID" %}</th>
<td>{{ object.vid }}</td>
</tr>
<tr>
<th scope="row">{% trans "Name" %}</th>
<td>{{ object.name }}</td>
</tr>
<tr>
<th scope="row">{% trans "Tenant" %}</th>
<td> <td>
{% if object.tenant.group %} {% nested_tree object.site.region %}
{{ object.tenant.group|linkify }} /
{% endif %}
{{ object.tenant|linkify|placeholder }}
</td> </td>
</tr> </tr>
<tr> {% endif %}
<th scope="row">{% trans "Status" %}</th> <tr>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> <th scope="row">{% trans "Site" %}</th>
</tr> <td>{{ object.site|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Role" %}</th> <tr>
<td> <th scope="row">{% trans "Group" %}</th>
{% if object.role %} <td>{{ object.group|linkify|placeholder }}</td>
<a href="{% url 'ipam:vlan_list' %}?role={{ object.role.slug }}">{{ object.role }}</a> </tr>
{% else %} <tr>
{{ ''|placeholder }} <th scope="row">{% trans "VLAN ID" %}</th>
{% endif %} <td>{{ object.vid }}</td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.name }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Tenant" %}</th>
<th scope="row">{% trans "L2VPN" %}</th> <td>
<td>{{ object.l2vpn_termination.l2vpn|linkify|placeholder }}</td> {% if object.tenant.group %}
</tr> {{ object.tenant.group|linkify }} /
</table> {% endif %}
</div> {{ object.tenant|linkify|placeholder }}
</td>
</tr>
<tr>
<th scope="row">{% trans "Status" %}</th>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
</tr>
<tr>
<th scope="row">{% trans "Role" %}</th>
<td>
{% if object.role %}
<a href="{% url 'ipam:vlan_list' %}?role={{ object.role.slug }}">{{ object.role }}</a>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">{% trans "Description" %}</th>
<td>{{ object.description|placeholder }}</td>
</tr>
<tr>
<th scope="row">{% trans "L2VPN" %}</th>
<td>{{ object.l2vpn_termination.l2vpn|linkify|placeholder }}</td>
</tr>
</table>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>

View File

@ -25,30 +25,28 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "VLAN Group" %}</h5> <h5 class="card-header">{% trans "VLAN Group" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Scope" %}</th>
<th scope="row">{% trans "Scope" %}</th> <td>{{ object.scope|linkify|placeholder }}</td>
<td>{{ object.scope|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Permitted VIDs" %}</th>
<th scope="row">{% trans "Permitted VIDs" %}</th> <td>{{ object.min_vid }} - {{ object.max_vid }}</td>
<td>{{ object.min_vid }} - {{ object.max_vid }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">Utilization</th>
<th scope="row">Utilization</th> <td>{% utilization_graph object.utilization %}</td>
<td>{% utilization_graph object.utilization %}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -10,34 +10,30 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "VRF" %}</h5>
{% trans "VRF" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Route Distinguisher" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.rd|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Route Distinguisher" %}</th> <tr>
<td>{{ object.rd|placeholder }}</td> <th scope="row">{% trans "Tenant" %}</th>
</tr> <td>
<tr> {% if object.tenant.group %}
<th scope="row">{% trans "Tenant" %}</th> {{ object.tenant.group|linkify }} /
<td> {% endif %}
{% if object.tenant.group %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant.group|linkify }} / </td>
{% endif %} </tr>
{{ object.tenant|linkify|placeholder }} <tr>
</td> <th scope="row">{% trans "Unique IP Space" %}</th>
</tr> <td>{% checkmark object.enforce_unique %}</td>
<tr> </tr>
<th scope="row">{% trans "Unique IP Space" %}</th> <tr>
<td>{% checkmark object.enforce_unique %}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -16,60 +16,58 @@
<div class="col col-md-7"> <div class="col col-md-7">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Contact" %}</h5> <h5 class="card-header">{% trans "Contact" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Group" %}</th>
<th scope="row">{% trans "Group" %}</th> <td>{{ object.group|linkify|placeholder }}</td>
<td>{{ object.group|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Title" %}</th>
<th scope="row">{% trans "Title" %}</th> <td>{{ object.title|placeholder }}</td>
<td>{{ object.title|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Phone" %}</th>
<th scope="row">{% trans "Phone" %}</th> <td>
<td> {% if object.phone %}
{% if object.phone %} <a href="tel:{{ object.phone }}">{{ object.phone }}</a>
<a href="tel:{{ object.phone }}">{{ object.phone }}</a> {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Email" %}</th>
<th scope="row">{% trans "Email" %}</th> <td>
<td> {% if object.email %}
{% if object.email %} <a href="mailto:{{ object.email }}">{{ object.email }}</a>
<a href="mailto:{{ object.email }}">{{ object.email }}</a> {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Address" %}</th>
<th scope="row">{% trans "Address" %}</th> <td>{{ object.address|linebreaksbr|placeholder }}</td>
<td>{{ object.address|linebreaksbr|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Link" %}</th>
<th scope="row">{% trans "Link" %}</th> <td>
<td> {% if object.link %}
{% if object.link %} <a href="{{ object.link }}">{{ object.link }}</a>
<a href="{{ object.link }}">{{ object.link }}</a> {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -15,25 +15,21 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Contact Group" %}</h5>
{% trans "Contact Group" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Parent" %}</th>
</tr> <td>{{ object.parent|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Parent" %}</th> </table>
<td>{{ object.parent|linkify|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -13,18 +13,16 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Contact Role" %}</h5> <h5 class="card-header">{% trans "Contact Role" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -15,18 +15,16 @@
<div class="col col-md-7"> <div class="col col-md-7">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Tenant" %}</h5> <h5 class="card-header">{% trans "Tenant" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Group" %}</th>
<th scope="row">{% trans "Group" %}</th> <td>{{ object.group|linkify|placeholder }}</td>
<td>{{ object.group|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -23,25 +23,21 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Tenant Group" %}</h5>
{% trans "Tenant Group" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Parent" %}</th>
</tr> <td>{{ object.parent|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Parent" %}</th> </table>
<td>{{ object.parent|linkify|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -12,14 +12,12 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Group" %}</h5> <h5 class="card-header">{% trans "Group" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">

View File

@ -12,45 +12,41 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Permission" %}</h5> <h5 class="card-header">{% trans "Permission" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Enabled" %}</th>
<th scope="row">{% trans "Enabled" %}</th> <td>{% checkmark object.enabled %}</td>
<td>{% checkmark object.enabled %}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Actions" %}</h5> <h5 class="card-header">{% trans "Actions" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "View" %}</th>
<th scope="row">{% trans "View" %}</th> <td>{% checkmark object.can_view %}</td>
<td>{% checkmark object.can_view %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Add" %}</th>
<th scope="row">{% trans "Add" %}</th> <td>{% checkmark object.can_add %}</td>
<td>{% checkmark object.can_add %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Change" %}</th>
<th scope="row">{% trans "Change" %}</th> <td>{% checkmark object.can_change %}</td>
<td>{% checkmark object.can_change %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Delete" %}</th>
<th scope="row">{% trans "Delete" %}</th> <td>{% checkmark object.can_delete %}</td>
<td>{% checkmark object.can_delete %}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Constraints" %}</h5> <h5 class="card-header">{% trans "Constraints" %}</h5>

View File

@ -12,44 +12,42 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Token" %}</h5> <h5 class="card-header">{% trans "Token" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Key" %}</th>
<th scope="row">{% trans "Key" %}</th> <td>{% if settings.ALLOW_TOKEN_RETRIEVAL %}{{ object.key }}{% else %}{{ object.partial }}{% endif %}</td>
<td>{% if settings.ALLOW_TOKEN_RETRIEVAL %}{{ object.key }}{% else %}{{ object.partial }}{% endif %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "User" %}</th>
<th scope="row">{% trans "User" %}</th> <td>
<td> <a href="{% url 'users:netboxuser' pk=object.user.pk %}">{{ object.user }}</a>
<a href="{% url 'users:netboxuser' pk=object.user.pk %}">{{ object.user }}</a> </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Write enabled" %}</th>
<th scope="row">{% trans "Write enabled" %}</th> <td>{% checkmark object.write_enabled %}</td>
<td>{% checkmark object.write_enabled %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Created" %}</th>
<th scope="row">{% trans "Created" %}</th> <td>{{ object.created|annotated_date }}</td>
<td>{{ object.created|annotated_date }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Expires" %}</th>
<th scope="row">{% trans "Expires" %}</th> <td>{{ object.expires|placeholder }}</td>
<td>{{ object.expires|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Last used" %}</th>
<th scope="row">{% trans "Last used" %}</th> <td>{{ object.last_used|placeholder }}</td>
<td>{{ object.last_used|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Allowed IPs" %}</th>
<th scope="row">{% trans "Allowed IPs" %}</th> <td>{{ object.allowed_ips|join:", "|placeholder }}</td>
<td>{{ object.allowed_ips|join:", "|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -12,38 +12,36 @@
<div class="col-md-6"> <div class="col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "User" %}</h5> <h5 class="card-header">{% trans "User" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Username" %}</th>
<th scope="row">{% trans "Username" %}</th> <td>{{ object.username }}</td>
<td>{{ object.username }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Full Name" %}</th>
<th scope="row">{% trans "Full Name" %}</th> <td>{{ object.get_full_name|placeholder }}</td>
<td>{{ object.get_full_name|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Email" %}</th>
<th scope="row">{% trans "Email" %}</th> <td>{{ object.email|placeholder }}</td>
<td>{{ object.email|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Account Created" %}</th>
<th scope="row">{% trans "Account Created" %}</th> <td>{{ object.date_joined|annotated_date }}</td>
<td>{{ object.date_joined|annotated_date }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Active" %}</th>
<th scope="row">{% trans "Active" %}</th> <td>{% checkmark object.is_active %}</td>
<td>{% checkmark object.is_active %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Staff" %}</th>
<th scope="row">{% trans "Staff" %}</th> <td>{% checkmark object.is_staff %}</td>
<td>{% checkmark object.is_staff %}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Superuser" %}</th>
<th scope="row">{% trans "Superuser" %}</th> <td>{% checkmark object.is_superuser %}</td>
<td>{% checkmark object.is_superuser %}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
</div> </div>
<div class="col-md-6"> <div class="col-md-6">

View File

@ -7,46 +7,42 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Cluster" %}</h5>
{% trans "Cluster" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Type" %}</th>
</tr> <td>{{ object.type|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Type" %}</th> <tr>
<td>{{ object.type|linkify }}</td> <th scope="row">{% trans "Status" %}</th>
</tr> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<tr> </tr>
<th scope="row">{% trans "Status" %}</th> <tr>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Group" %}</th>
</tr> <td>{{ object.group|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Group" %}</th> <tr>
<td>{{ object.group|linkify|placeholder }}</td> <th scope="row">{% trans "Tenant" %}</th>
</tr> <td>
<tr> {% if object.tenant.group %}
<th scope="row">{% trans "Tenant" %}</th> {{ object.tenant.group|linkify }} /
<td> {% endif %}
{% if object.tenant.group %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant.group|linkify }} / </td>
{% endif %} </tr>
{{ object.tenant|linkify|placeholder }} <tr>
</td> <th scope="row">{% trans "Site" %}</th>
</tr> <td>{{ object.site|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Site" %}</th> </table>
<td>{{ object.site|linkify|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/comments.html' %} {% include 'inc/panels/comments.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}
@ -54,34 +50,32 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Allocated Resources" %}</h5> <h5 class="card-header">{% trans "Allocated Resources" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row"><i class="mdi mdi-gauge"></i> {% trans "Virtual CPUs" %}</th>
<th scope="row"><i class="mdi mdi-gauge"></i> {% trans "Virtual CPUs" %}</th> <td>{{ vcpus_sum|placeholder }}</td>
<td>{{ vcpus_sum|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row"><i class="mdi mdi-chip"></i> {% trans "Memory" %}</th>
<th scope="row"><i class="mdi mdi-chip"></i> {% trans "Memory" %}</th> <td>
<td> {% if memory_sum %}
{% if memory_sum %} {{ memory_sum|humanize_megabytes }}
{{ memory_sum|humanize_megabytes }} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row"><i class="mdi mdi-harddisk"></i> {% trans "Disk Space" %}</th>
<th scope="row"><i class="mdi mdi-harddisk"></i> {% trans "Disk Space" %}</th> <td>
<td> {% if disk_sum %}
{% if disk_sum %} {{ disk_sum }} {% trans "GB" context "Abbreviation for gigabyte" %}
{{ disk_sum }} {% trans "GB" context "Abbreviation for gigabyte" %} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}

View File

@ -16,21 +16,17 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Cluster Group" %}</h5>
{% trans "Cluster Group" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> </table>
<td>{{ object.description|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -16,27 +16,23 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Cluster Type" %}</h5>
{% trans "Cluster Type" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover card-body attr-table"> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Clusters" %}</th>
</tr> <td>
<tr> <a href="{% url 'virtualization:cluster_list' %}?type_id={{ object.pk }}">{{ object.clusters.count }}</a>
<th scope="row">{% trans "Clusters" %}</th> </td>
<td> </tr>
<a href="{% url 'virtualization:cluster_list' %}?type_id={{ object.pk }}">{{ object.clusters.count }}</a> </table>
</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -16,32 +16,30 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Virtual Disk" %}</h5> <h5 class="card-header">{% trans "Virtual Disk" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Virtual Machine" %}</th>
<th scope="row">{% trans "Virtual Machine" %}</th> <td>{{ object.virtual_machine|linkify }}</td>
<td>{{ object.virtual_machine|linkify }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row"><i class="mdi mdi-harddisk"></i> {% trans "Size" %}</th>
<th scope="row"><i class="mdi mdi-harddisk"></i> {% trans "Size" %}</th> <td>
<td> {% if object.size %}
{% if object.size %} {{ object.size }} {% trans "GB" context "Abbreviation for gigabyte" %}
{{ object.size }} {% trans "GB" context "Abbreviation for gigabyte" %} {% else %}
{% else %} {{ ''|placeholder }}
{{ ''|placeholder }} {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -9,78 +9,74 @@
<div class="row my-3"> <div class="row my-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Virtual Machine" %}</h5>
{% trans "Virtual Machine" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Name" %}</th>
<table class="table table-hover attr-table"> <td>{{ object }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object }}</td> <th scope="row">{% trans "Status" %}</th>
</tr> <td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
<tr> </tr>
<th scope="row">{% trans "Status" %}</th> <tr>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td> <th scope="row">{% trans "Role" %}</th>
</tr> <td>{{ object.role|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Role" %}</th> <tr>
<td>{{ object.role|linkify|placeholder }}</td> <th scope="row">{% trans "Platform" %}</th>
</tr> <td>{{ object.platform|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Platform" %}</th> <tr>
<td>{{ object.platform|linkify|placeholder }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }}</td> <th scope="row">{% trans "Tenant" %}</th>
</tr> <td>
<tr> {% if object.tenant.group %}
<th scope="row">{% trans "Tenant" %}</th> {{ object.tenant.group|linkify }} /
<td> {% endif %}
{% if object.tenant.group %} {{ object.tenant|linkify|placeholder }}
{{ object.tenant.group|linkify }} / </td>
{% endif %} </tr>
{{ object.tenant|linkify|placeholder }} <tr>
</td> <th scope="row">{% trans "Config Template" %}</th>
</tr> <td>{{ object.config_template|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Config Template" %}</th> <tr>
<td>{{ object.config_template|linkify|placeholder }}</td> <th scope="row">{% trans "Primary IPv4" %}</th>
</tr> <td>
<tr> {% if object.primary_ip4 %}
<th scope="row">{% trans "Primary IPv4" %}</th> <a href="{% url 'ipam:ipaddress' pk=object.primary_ip4.pk %}" id="primary_ip4">{{ object.primary_ip4.address.ip }}</a>
<td> {% if object.primary_ip4.nat_inside %}
{% if object.primary_ip4 %} ({% trans "NAT for" %} <a href="{{ object.primary_ip4.nat_inside.get_absolute_url }}">{{ object.primary_ip4.nat_inside.address.ip }}</a>)
<a href="{% url 'ipam:ipaddress' pk=object.primary_ip4.pk %}" id="primary_ip4">{{ object.primary_ip4.address.ip }}</a> {% elif object.primary_ip4.nat_outside.exists %}
{% if object.primary_ip4.nat_inside %} ({% 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 %})
({% trans "NAT for" %} <a href="{{ object.primary_ip4.nat_inside.get_absolute_url }}">{{ object.primary_ip4.nat_inside.address.ip }}</a>) {% endif %}
{% elif object.primary_ip4.nat_outside.exists %} {% copy_content "primary_ip4" %}
({% 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 %}) {% else %}
{% endif %} {{ ''|placeholder }}
{% copy_content "primary_ip4" %} {% endif %}
{% else %} </td>
{{ ''|placeholder }} </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Primary IPv6" %}</th>
</tr> <td>
<tr> {% if object.primary_ip6 %}
<th scope="row">{% trans "Primary IPv6" %}</th> <a href="{% url 'ipam:ipaddress' pk=object.primary_ip6.pk %}" id="primary_ip6">{{ object.primary_ip6.address.ip }}</a>
<td> {% if object.primary_ip6.nat_inside %}
{% if object.primary_ip6 %} ({% trans "NAT for" %} <a href="{{ object.primary_ip6.nat_inside.get_absolute_url }}">{{ object.primary_ip6.nat_inside.address.ip }}</a>)
<a href="{% url 'ipam:ipaddress' pk=object.primary_ip6.pk %}" id="primary_ip6">{{ object.primary_ip6.address.ip }}</a> {% elif object.primary_ip6.nat_outside.exists %}
{% if object.primary_ip6.nat_inside %} ({% 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 %})
({% trans "NAT for" %} <a href="{{ object.primary_ip6.nat_inside.get_absolute_url }}">{{ object.primary_ip6.nat_inside.address.ip }}</a>) {% endif %}
{% elif object.primary_ip6.nat_outside.exists %} {% copy_content "primary_ip6" %}
({% 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 %}) {% else %}
{% endif %} {{ ''|placeholder }}
{% copy_content "primary_ip6" %} {% endif %}
{% else %} </td>
{{ ''|placeholder }} </tr>
{% endif %} </table>
</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
@ -90,68 +86,64 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Cluster" %}</h5> <h5 class="card-header">{% trans "Cluster" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Site" %}</th>
<th scope="row">{% trans "Site" %}</th> <td>
<td> {{ object.site|linkify|placeholder }}
{{ object.site|linkify|placeholder }} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Cluster" %}</th>
<th scope="row">{% trans "Cluster" %}</th> <td>
<td> {% if object.cluster.group %}
{% if object.cluster.group %} {{ object.cluster.group|linkify }} /
{{ object.cluster.group|linkify }} / {% endif %}
{% endif %} {{ object.cluster|linkify|placeholder }}
{{ object.cluster|linkify|placeholder }} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Cluster Type" %}</th>
<th scope="row">{% trans "Cluster Type" %}</th> <td>{{ object.cluster.type }}</td>
<td>{{ object.cluster.type }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Device" %}</th>
<th scope="row">{% trans "Device" %}</th> <td>
<td> {{ object.device|linkify|placeholder }}
{{ object.device|linkify|placeholder }} </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Resources" %}</h5> <h5 class="card-header">{% trans "Resources" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row"><i class="mdi mdi-gauge"></i> {% trans "Virtual CPUs" %}</th>
<th scope="row"><i class="mdi mdi-gauge"></i> {% trans "Virtual CPUs" %}</th> <td>{{ object.vcpus|placeholder }}</td>
<td>{{ object.vcpus|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row"><i class="mdi mdi-chip"></i> {% trans "Memory" %}</th>
<th scope="row"><i class="mdi mdi-chip"></i> {% trans "Memory" %}</th> <td>
<td> {% if object.memory %}
{% if object.memory %} {{ object.memory|humanize_megabytes }}
{{ object.memory|humanize_megabytes }}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">
<i class="mdi mdi-harddisk"></i> {% trans "Disk Space" %}
</th>
<td>
{% if object.disk %}
{{ object.disk }} {% trans "GB" context "Abbreviation for gigabyte" %}
{% else %} {% else %}
{{ ''|placeholder }} {{ ''|placeholder }}
{% endif %} {% endif %}
</td> </td>
</tr> </tr>
</table> <tr>
</div> <th scope="row">
<i class="mdi mdi-harddisk"></i> {% trans "Disk Space" %}
</th>
<td>
{% if object.disk %}
{{ object.disk }} {% trans "GB" context "Abbreviation for gigabyte" %}
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
</table>
</div> </div>
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Services" %}</h5> <h5 class="card-header">{% trans "Services" %}</h5>

View File

@ -9,22 +9,20 @@
<div class="col-5"> <div class="col-5">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "Config Template" %}</h5> <h5 class="card-header">{% trans "Config Template" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Config Template" %}</th>
<th scope="row">{% trans "Config Template" %}</th> <td>{{ config_template|linkify|placeholder }}</td>
<td>{{ config_template|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Data Source" %}</th>
<th scope="row">{% trans "Data Source" %}</th> <td>{{ config_template.data_file.source|linkify|placeholder }}</td>
<td>{{ config_template.data_file.source|linkify|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Data File" %}</th>
<th scope="row">{% trans "Data File" %}</th> <td>{{ config_template.data_file|linkify|placeholder }}</td>
<td>{{ config_template.data_file|linkify|placeholder }}</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
</div> </div>
<div class="col-7"> <div class="col-7">

View File

@ -15,63 +15,59 @@
<div class="row mb-3"> <div class="row mb-3">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header"> <h5 class="card-header">{% trans "Interface" %}</h5>
{% trans "Interface" %} <table class="table table-hover attr-table">
</h5> <tr>
<div class="card-body"> <th scope="row">{% trans "Virtual Machine" %}</th>
<table class="table table-hover attr-table"> <td>{{ object.virtual_machine|linkify }}</td>
<tr> </tr>
<th scope="row">{% trans "Virtual Machine" %}</th> <tr>
<td>{{ object.virtual_machine|linkify }}</td> <th scope="row">{% trans "Name" %}</th>
</tr> <td>{{ object.name }}</td>
<tr> </tr>
<th scope="row">{% trans "Name" %}</th> <tr>
<td>{{ object.name }}</td> <th scope="row">{% trans "Enabled" %}</th>
</tr> <td>
<tr> {% if object.enabled %}
<th scope="row">{% trans "Enabled" %}</th> <span class="text-success"><i class="mdi mdi-check-bold"></i></span>
<td> {% else %}
{% if object.enabled %} <span class="text-danger"><i class="mdi mdi-close"></i></span>
<span class="text-success"><i class="mdi mdi-check-bold"></i></span> {% endif %}
{% else %} </td>
<span class="text-danger"><i class="mdi mdi-close"></i></span> </tr>
{% endif %} <tr>
</td> <th scope="row">{% trans "Parent" %}</th>
</tr> <td>{{ object.parent|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Parent" %}</th> <tr>
<td>{{ object.parent|linkify|placeholder }}</td> <th scope="row">{% trans "Bridge" %}</th>
</tr> <td>{{ object.bridge|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Bridge" %}</th> <tr>
<td>{{ object.bridge|linkify|placeholder }}</td> <th scope="row">{% trans "VRF" %}</th>
</tr> <td>{{ object.vrf|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "VRF" %}</th> <tr>
<td>{{ object.vrf|linkify|placeholder }}</td> <th scope="row">{% trans "Description" %}</th>
</tr> <td>{{ object.description|placeholder }} </td>
<tr> </tr>
<th scope="row">{% trans "Description" %}</th> <tr>
<td>{{ object.description|placeholder }} </td> <th scope="row">{% trans "MTU" %}</th>
</tr> <td>{{ object.mtu|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "MTU" %}</th> <tr>
<td>{{ object.mtu|placeholder }}</td> <th scope="row">{% trans "MAC Address" %}</th>
</tr> <td><span class="font-monospace">{{ object.mac_address|placeholder }}</span></td>
<tr> </tr>
<th scope="row">{% trans "MAC Address" %}</th> <tr>
<td><span class="font-monospace">{{ object.mac_address|placeholder }}</span></td> <th scope="row">{% trans "802.1Q Mode" %}</th>
</tr> <td>{{ object.get_mode_display|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "802.1Q Mode" %}</th> <tr>
<td>{{ object.get_mode_display|placeholder }}</td> <th scope="row">{% trans "Tunnel" %}</th>
</tr> <td>{{ object.tunnel_termination.tunnel|linkify|placeholder }}</td>
<tr> </tr>
<th scope="row">{% trans "Tunnel" %}</th> </table>
<td>{{ object.tunnel_termination.tunnel|linkify|placeholder }}</td>
</tr>
</table>
</div>
</div> </div>
{% include 'inc/panels/tags.html' %} {% include 'inc/panels/tags.html' %}
{% plugin_left_page object %} {% plugin_left_page object %}

View File

@ -8,41 +8,39 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "IKE Policy" %}</h5> <h5 class="card-header">{% trans "IKE Policy" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "IKE Version" %}</th>
<th scope="row">{% trans "IKE Version" %}</th> <td>{{ object.get_version_display }}</td>
<td>{{ object.get_version_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Mode" %}</th>
<th scope="row">{% trans "Mode" %}</th> <td>{{ object.get_mode_display }}</td>
<td>{{ object.get_mode_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Pre-Shared Key" %}</th>
<th scope="row">{% trans "Pre-Shared Key" %}</th> <td>
<td> <span id="secret" class="font-monospace" data-secret="{{ object.preshared_key }}">{{ object.preshared_key|placeholder }}</span>
<span id="secret" class="font-monospace" data-secret="{{ object.preshared_key }}">{{ object.preshared_key|placeholder }}</span> {% if object.preshared_key %}
{% if object.preshared_key %} <button type="button" class="btn btn-primary toggle-secret float-end" data-bs-toggle="button">{% trans "Show Secret" %}</button>
<button type="button" class="btn btn-primary toggle-secret float-end" data-bs-toggle="button">{% trans "Show Secret" %}</button> {% endif %}
{% endif %} </td>
</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "IPSec Profiles" %}</th>
<th scope="row">{% trans "IPSec Profiles" %}</th> <td>
<td> <a href="{% url 'vpn:ipsecprofile_list' %}?ike_policy_id={{ object.pk }}">{{ object.ipsec_profiles.count }}</a>
<a href="{% url 'vpn:ipsecprofile_list' %}?ike_policy_id={{ object.pk }}">{{ object.ipsec_profiles.count }}</a> </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>

View File

@ -8,44 +8,42 @@
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">{% trans "IKE Proposal" %}</h5> <h5 class="card-header">{% trans "IKE Proposal" %}</h5>
<div class="card-body"> <table class="table table-hover attr-table">
<table class="table table-hover attr-table"> <tr>
<tr> <th scope="row">{% trans "Name" %}</th>
<th scope="row">{% trans "Name" %}</th> <td>{{ object.name }}</td>
<td>{{ object.name }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Description" %}</th>
<th scope="row">{% trans "Description" %}</th> <td>{{ object.description|placeholder }}</td>
<td>{{ object.description|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Authentication method" %}</th>
<th scope="row">{% trans "Authentication method" %}</th> <td>{{ object.get_authentication_method_display }}</td>
<td>{{ object.get_authentication_method_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Encryption algorithm" %}</th>
<th scope="row">{% trans "Encryption algorithm" %}</th> <td>{{ object.get_encryption_algorithm_display }}</td>
<td>{{ object.get_encryption_algorithm_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "Authentication algorithm" %}</th>
<th scope="row">{% trans "Authentication algorithm" %}</th> <td>{{ object.get_authentication_algorithm_display }}</td>
<td>{{ object.get_authentication_algorithm_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "DH group" %}</th>
<th scope="row">{% trans "DH group" %}</th> <td>{{ object.get_group_display }}</td>
<td>{{ object.get_group_display }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "SA lifetime (seconds)" %}</th>
<th scope="row">{% trans "SA lifetime (seconds)" %}</th> <td>{{ object.sa_lifetime|placeholder }}</td>
<td>{{ object.sa_lifetime|placeholder }}</td> </tr>
</tr> <tr>
<tr> <th scope="row">{% trans "IKE Policies" %}</th>
<th scope="row">{% trans "IKE Policies" %}</th> <td>
<td> <a href="{% url 'vpn:ikepolicy_list' %}?proposal_id={{ object.pk }}">{{ object.ike_policies.count }}</a>
<a href="{% url 'vpn:ikepolicy_list' %}?proposal_id={{ object.pk }}">{{ object.ike_policies.count }}</a> </td>
</td> </tr>
</tr> </table>
</table>
</div>
</div> </div>
{% plugin_left_page object %} {% plugin_left_page object %}
</div> </div>

Some files were not shown because too many files have changed in this diff Show More