Merge branch 'feature' into issue_9536

This commit is contained in:
Jeremy Stretch
2022-06-23 10:35:27 -04:00
committed by GitHub
182 changed files with 3327 additions and 1107 deletions

View File

@@ -45,6 +45,10 @@
<th scope="row">Install Date</th>
<td>{{ object.install_date|annotated_date|placeholder }}</td>
</tr>
<tr>
<th scope="row">Termination Date</th>
<td>{{ object.termination_date|annotated_date|placeholder }}</td>
</tr>
<tr>
<th scope="row">Commit Rate</th>
<td>{{ object.commit_rate|humanize_speed|placeholder }}</td>

View File

@@ -10,7 +10,7 @@
{% if termination_a %}
{{ termination_a.site }} {% if termination_a.interface %}- {{ termination_a.interface.device }} {{ termination_a.interface }}{% endif %}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</li>
<li>
@@ -18,7 +18,7 @@
{% if termination_z %}
{{ termination_z.site }} {% if termination_z.interface %}- {{ termination_z.interface.device }} {{ termination_z.interface }}{% endif %}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</li>
</ul>

View File

@@ -94,7 +94,7 @@
{% elif termination.port_speed %}
{{ termination.port_speed|humanize_speed }}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -50,7 +50,7 @@
{% if object.portal_url %}
<a href="{{ object.portal_url }}">{{ object.portal_url }}</a>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -40,7 +40,7 @@
{% if object.color %}
<span class="color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -50,7 +50,7 @@
{% if object.length %}
{{ object.length|floatformat }} {{ object.get_length_unit_display }}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -23,7 +23,7 @@
{% endfor %}
{{ object.site.region|linkify }}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -40,7 +40,7 @@
{% endfor %}
{{ object.location|linkify }}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -50,7 +50,7 @@
{% if object.rack %}
<a href="{% url 'dcim:rack' pk=object.rack.pk %}">{{ object.rack }}</a>
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -69,7 +69,7 @@
{% elif object.rack and object.device_type.u_height %}
<span class="badge bg-warning">Not racked</span>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -180,7 +180,7 @@
(NAT: {{ object.primary_ip4.nat_outside.address.ip|linkify }})
{% endif %}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -195,7 +195,7 @@
(NAT: {{ object.primary_ip6.nat_outside.address.ip|linkify }})
{% endif %}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -54,7 +54,7 @@
{% if object.vm_role %}
<a href="{% url 'virtualization:virtualmachine_list' %}?role_id={{ object.pk }}">{{ virtualmachine_count }}</a>
{% else %}
&mdash;
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -55,7 +55,7 @@
<img src="{{ object.front_image.url }}" alt="{{ object.front_image.name }}" class="img-fluid" />
</a>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -67,7 +67,7 @@
<img src="{{ object.rear_image.url }}" alt="{{ object.rear_image.name }}" class="img-fluid" />
</a>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -69,6 +69,14 @@
<th scope="row">Description</th>
<td>{{ object.description|placeholder }} </td>
</tr>
<tr>
<th scope="row">PoE Mode</th>
<td>{{ object.get_poe_mode_display|placeholder }}</td>
</tr>
<tr>
<th scope="row">PoE Mode</th>
<td>{{ object.get_poe_type_display|placeholder }}</td>
</tr>
<tr>
<th scope="row">802.1Q Mode</th>
<td>{{ object.get_mode_display|placeholder }}</td>
@@ -321,7 +329,7 @@
{% if object.rf_channel_frequency %}
{{ object.rf_channel_frequency|simplify_decimal }} MHz
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
{% if peer %}
@@ -329,7 +337,7 @@
{% if peer.rf_channel_frequency %}
{{ peer.rf_channel_frequency|simplify_decimal }} MHz
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
{% endif %}
@@ -340,7 +348,7 @@
{% if object.rf_channel_width %}
{{ object.rf_channel_width|simplify_decimal }} MHz
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
{% if peer %}
@@ -348,7 +356,7 @@
{% if peer.rf_channel_width %}
{{ peer.rf_channel_width|simplify_decimal }} MHz
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
{% endif %}

View File

@@ -43,6 +43,10 @@
<th scope="row">Parent</th>
<td>{{ object.parent|linkify|placeholder }}</td>
</tr>
<tr>
<th scope="row">Status</th>
<td>{% badge object.get_status_display bg_color=object.get_status_color %}</td>
</tr>
<tr>
<th scope="row">Tenant</th>
<td>

View File

@@ -18,25 +18,25 @@
</button>
<ul class="dropdown-menu" aria-labeled-by="add-components">
{% if perms.dcim.add_consoleport %}
<li><a class="dropdown-item" href="{% url 'dcim:consoleport_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}">Console Ports</a></li>
<li><a class="dropdown-item" href="{% url 'dcim:consoleport_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.device.pk %}">Console Ports</a></li>
{% endif %}
{% if perms.dcim.add_consoleserverport %}
<li><a class="dropdown-item" href="{% url 'dcim:consoleserverport_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}">Console Server Ports</a></li>
<li><a class="dropdown-item" href="{% url 'dcim:consoleserverport_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.device.pk %}">Console Server Ports</a></li>
{% endif %}
{% if perms.dcim.add_powerport %}
<li><a class="dropdown-item" href="{% url 'dcim:powerport_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}">Power Ports</a></li>
<li><a class="dropdown-item" href="{% url 'dcim:powerport_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_powerports' pk=object.device.pk %}">Power Ports</a></li>
{% endif %}
{% if perms.dcim.add_poweroutlet %}
<li><a class="dropdown-item" href="{% url 'dcim:poweroutlet_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}">Power Outlets</a></li>
<li><a class="dropdown-item" href="{% url 'dcim:poweroutlet_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.device.pk %}">Power Outlets</a></li>
{% endif %}
{% if perms.dcim.add_interface %}
<li><a class="dropdown-item" href="{% url 'dcim:interface_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}">Interfaces</a></li>
<li><a class="dropdown-item" href="{% url 'dcim:interface_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.device.pk %}">Interfaces</a></li>
{% endif %}
{% if perms.dcim.add_frontport %}
<li><a class="dropdown-item" href="{% url 'dcim:frontport_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}">Front Ports</a></li>
<li><a class="dropdown-item" href="{% url 'dcim:frontport_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_frontports' pk=object.device.pk %}">Front Ports</a></li>
{% endif %}
{% if perms.dcim.add_rearport %}
<li><a class="dropdown-item" href="{% url 'dcim:rearport_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}">Rear Ports</a></li>
<li><a class="dropdown-item" href="{% url 'dcim:rearport_add' %}?device={{ object.device.pk }}&module={{ object.pk }}&return_url={% url 'dcim:device_rearports' pk=object.device.pk %}">Rear Ports</a></li>
{% endif %}
</ul>
</div>

View File

@@ -44,7 +44,7 @@
{% if object.connected_endpoint %}
{{ object.connected_endpoint.device|linkify }} ({{ object.connected_endpoint }})
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -44,7 +44,7 @@
</tr>
<tr>
<th scope="row">Power Port</th>
<td>{{ object.power_port }}</td>
<td>{{ object.power_port|linkify|placeholder }}</td>
</tr>
<tr>
<th scope="row">Feed Leg</th>

View File

@@ -53,7 +53,7 @@
{% endfor %}
{{ object.location|linkify }}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -115,7 +115,7 @@
{% if object.type %}
{{ object.get_type_display }}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -133,7 +133,7 @@
{% if object.outer_width %}
<span>{{ object.outer_width }} {{ object.get_outer_unit_display }}</span>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -143,7 +143,7 @@
{% if object.outer_depth %}
<span>{{ object.outer_depth }} {{ object.get_outer_unit_display }}</span>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -34,7 +34,7 @@
{% endfor %}
{{ object.region|linkify }}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -47,7 +47,7 @@
{% endfor %}
{{ object.group|linkify }}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -79,7 +79,7 @@
{{ object.time_zone }} (UTC {{ object.time_zone|tzoffset }})<br />
<small class="text-muted">Site time: {% timezone object.time_zone %}{% annotated_now %}{% endtimezone %}</small>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -94,7 +94,7 @@
</div>
<span>{{ object.physical_address|linebreaksbr }}</span>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -113,7 +113,7 @@
</div>
<span>{{ object.latitude }}, {{ object.longitude }}</span>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -15,74 +15,70 @@
{% block content %}
<div class="row">
<div class="col col-md-4">
<div class="card">
<h5 class="card-header">
Virtual Chassis
</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Domain</th>
<td>{{ object.domain|placeholder }}</td>
</tr>
<tr>
<th scope="row">Master</th>
<td>{{ object.master|linkify }}</td>
</tr>
</table>
</div>
</div>
{% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %}
{% plugin_left_page object %}
<div class="card">
<h5 class="card-header">Virtual Chassis</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Domain</th>
<td>{{ object.domain|placeholder }}</td>
</tr>
<tr>
<th scope="row">Master</th>
<td>{{ object.master|linkify }}</td>
</tr>
</table>
</div>
</div>
{% include 'inc/panels/custom_fields.html' %}
{% include 'inc/panels/tags.html' %}
{% plugin_left_page object %}
</div>
<div class="col col-md-8">
<div class="card">
<h5 class="card-header">
Members
</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th>Device</th>
<th>Position</th>
<th>Master</th>
<th>Priority</th>
</tr>
{% for vc_member in members %}
<tr{% if vc_member == device %} class="info"{% endif %}>
<td>
{{ vc_member|linkify }}
</td>
<td>
{% badge vc_member.vc_position show_empty=True %}
</td>
<td>
{% if object.master == vc_member %}
{% checkmark True %}
{% endif %}
</td>
<td>
{{ vc_member.vc_priority|placeholder }}
</td>
</tr>
{% endfor %}
</table>
</div>
{% if perms.dcim.change_virtualchassis %}
<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 }}" class="btn btn-primary btn-sm">
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Member
</a>
</div>
{% endif %}
<div class="card">
<h5 class="card-header">Members</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th>Device</th>
<th>Position</th>
<th>Master</th>
<th>Priority</th>
</tr>
{% for vc_member in members %}
<tr{% if vc_member == device %} class="info"{% endif %}>
<td>
{{ vc_member|linkify }}
</td>
<td>
{% badge vc_member.vc_position show_empty=True %}
</td>
<td>
{% if object.master == vc_member %}
{% checkmark True %}
{% endif %}
</td>
<td>
{{ vc_member.vc_priority|placeholder }}
</td>
</tr>
{% endfor %}
</table>
</div>
{% plugin_right_page object %}
{% if perms.dcim.change_virtualchassis %}
<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 btn-sm">
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Member
</a>
</div>
{% endif %}
</div>
{% plugin_right_page object %}
</div>
</div>
<div class="row">
<div class="col col-md-12">
{% plugin_full_width_page object %}
</div>
<div class="col col-md-12">
{% plugin_full_width_page object %}
</div>
</div>
{% endblock %}

View File

@@ -57,7 +57,7 @@
{% if device.rack %}
{{ device.rack }} / {{ device.position }}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
<td>{{ device.serial|placeholder }}</td>

View File

@@ -1,37 +0,0 @@
{% extends 'generic/object_edit.html' %}
{% load form_helpers %}
{% block form %}
<div class="card">
<h5 class="card-header">Config Context</h5>
<div class="card-body">
{% render_field form.name %}
{% render_field form.weight %}
{% render_field form.description %}
{% render_field form.is_active %}
</div>
</div>
<div class="card">
<h5 class="card-header">Assignment</h5>
<div class="card-body">
{% render_field form.regions %}
{% render_field form.site_groups %}
{% render_field form.sites %}
{% render_field form.device_types %}
{% render_field form.roles %}
{% render_field form.platforms %}
{% render_field form.cluster_types %}
{% render_field form.cluster_groups %}
{% render_field form.clusters %}
{% render_field form.tenant_groups %}
{% render_field form.tenants %}
{% render_field form.tags %}
</div>
</div>
<div class="card">
<h5 class="card-header">Data</h5>
<div class="card-body">
{% render_field form.data %}
</div>
</div>
{% endblock %}

View File

@@ -19,6 +19,10 @@
<th scope="row">Label</th>
<td>{{ object.label|placeholder }}</td>
</tr>
<tr>
<th scope="row">Group Name</th>
<td>{{ object.group_name|placeholder }}</td>
</tr>
<tr>
<th scope="row">Type</th>
<td>
@@ -38,6 +42,14 @@
<th scope="row">Weight</th>
<td>{{ object.weight }}</td>
</tr>
<tr>
<th scope="row">Filter Logic</th>
<td>{{ object.get_filter_logic_display }}</td>
</tr>
<tr>
<th scope="row">UI Visibility</th>
<td>{{ object.get_ui_visibility_display }}</td>
</tr>
</table>
</div>
</div>
@@ -57,14 +69,10 @@
{% if object.choices %}
{{ object.choices|join:", " }}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">Filter Logic</th>
<td>{{ object.get_filter_logic_display }}</td>
</tr>
</table>
</div>
</div>
@@ -105,7 +113,7 @@
{% if object.validation_regex %}
<code>{{ object.validation_regex }}</code>
{% else %}
&mdash;
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -57,7 +57,7 @@
{% elif obj %}
{{ obj }}
{% else %}
<span class="muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
<td class="rendered-markdown">{{ message|markdown }}</td>

View File

@@ -76,14 +76,14 @@ Context:
{% if field.required %}
{% checkmark True true="Required" %}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
<td>
{% if field.to_field_name %}
<code>{{ field.to_field_name }}</code>
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
<td>

View File

@@ -1,49 +1,54 @@
{% load helpers %}
{% with custom_fields=object.get_custom_fields %}
{% if custom_fields %}
<div class="card">
<h5 class="card-header">Custom Fields</h5>
<div class="card-body">
<table class="table table-hover attr-table">
{% for field, value in custom_fields.items %}
<tr>
<td>
<span title="{{ field.description|escape }}">{{ field }}</span>
</td>
<td>
{% if field.type == 'integer' and value is not None %}
{{ value }}
{% elif field.type == 'longtext' and value %}
{{ value|markdown }}
{% elif field.type == 'boolean' and value == True %}
{% checkmark value true="True" %}
{% elif field.type == 'boolean' and value == False %}
{% checkmark value false="False" %}
{% elif field.type == 'url' and value %}
<a href="{{ value }}">{{ value|truncatechars:70 }}</a>
{% elif field.type == 'json' and value %}
<pre>{{ value|json }}</pre>
{% elif field.type == 'multiselect' and value %}
{{ value|join:", " }}
{% elif field.type == 'object' and value %}
{{ value|linkify }}
{% elif field.type == 'multiobject' and value %}
{% for obj in value %}
{{ obj|linkify }}{% if not forloop.last %}<br />{% endif %}
{% endfor %}
{% elif value %}
{{ value }}
{% elif field.required %}
<span class="text-warning">Not defined</span>
{% else %}
<span class="text-muted">&mdash;</span>
{% endif %}
</td>
</tr>
{% with custom_fields=object.get_custom_fields_by_group %}
{% if custom_fields %}
<div class="card">
<h5 class="card-header">Custom Fields</h5>
<div class="card-body">
{% for group_name, fields in custom_fields.items %}
{% if group_name %}
<h6><strong>{{ group_name }}</strong></h6>
{% endif %}
<table class="table table-hover attr-table">
{% for field, value in fields.items %}
<tr>
<td>
<span title="{{ field.description|escape }}">{{ field }}</span>
</td>
<td>
{% if field.type == 'integer' and value is not None %}
{{ value }}
{% elif field.type == 'longtext' and value %}
{{ value|markdown }}
{% elif field.type == 'boolean' and value == True %}
{% checkmark value true="True" %}
{% elif field.type == 'boolean' and value == False %}
{% checkmark value false="False" %}
{% elif field.type == 'url' and value %}
<a href="{{ value }}">{{ value|truncatechars:70 }}</a>
{% elif field.type == 'json' and value %}
<pre>{{ value|json }}</pre>
{% elif field.type == 'multiselect' and value %}
{{ value|join:", " }}
{% elif field.type == 'object' and value %}
{{ value|linkify }}
{% elif field.type == 'multiobject' and value %}
{% for obj in value %}
{{ obj|linkify }}{% if not forloop.last %}<br />{% endif %}
{% endfor %}
</table>
</div>
</div>
{% endif %}
{% elif value %}
{{ value }}
{% elif field.required %}
<span class="text-warning"><i class="mdi mdi-alert"></i> Not defined</span>
{% else %}
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
{% endfor %}
</table>
{% endfor %}
</div>
</div>
{% endif %}
{% endwith %}

View File

@@ -52,7 +52,7 @@
{% if object.role %}
<a href="{% url 'ipam:ipaddress_list' %}?role={{ object.role }}">{{ object.get_role_display }}</a>
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -73,7 +73,7 @@
{% endif %}
{{ object.assigned_object|linkify }}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -86,13 +86,19 @@
({{ object.nat_inside.assigned_object.parent_object|linkify }})
{% endif %}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
<tr>
<th scope="row">NAT (outside)</th>
<td>{{ object.nat_outside|linkify|placeholder }}</td>
<th scope="row">Outside NAT IPs</th>
<td>
{% for ip in object.nat_outside.all %}
{{ ip|linkify }}<br/>
{% empty %}
{{ ''|placeholder }}
{% endfor %}
</td>
</tr>
</table>
</div>
@@ -128,6 +134,24 @@
<div class="my-3">
{% include 'inc/panel_table.html' with table=related_ips_table heading='Related IP Addresses' %}
</div>
<div class="card">
<h5 class="card-header">
Services
</h5>
<div class="card-body">
{% if services %}
<table class="table table-hover">
{% for service in services %}
{% include 'ipam/inc/service.html' %}
{% endfor %}
</table>
{% else %}
<div class="text-muted">
None
</div>
{% endif %}
</div>
</div>
{% plugin_right_page object %}
</div>
</div>

View File

@@ -39,7 +39,7 @@
{% if aggregate %}
<a href="{% url 'ipam:aggregate' pk=aggregate.pk %}">{{ aggregate.prefix }}</a> ({{ aggregate.rir }})
{% else %}
<span class="text-warning">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -52,7 +52,7 @@
{% endif %}
{{ object.site|linkify }}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -65,7 +65,7 @@
{% endif %}
{{ object.vlan|linkify }}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -138,7 +138,7 @@
{{ first_available_ip }}
{% endif %}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
{% endwith %}
</td>

View File

@@ -45,7 +45,7 @@
{% if ipranges_count %}
<a href="{% url 'ipam:iprange_list' %}?role_id={{ object.pk }}">{{ ipranges_count }}</a>
{% else %}
&mdash;
{{ ''|placeholder }}
{% endif %}
{% endwith %}
</td>
@@ -57,7 +57,7 @@
{% if vlans_count %}
<a href="{% url 'ipam:vlan_list' %}?role_id={{ object.pk }}">{{ vlans_count }}</a>
{% else %}
&mdash;
{{ ''|placeholder }}
{% endif %}
{% endwith %}
</td>

View File

@@ -44,7 +44,7 @@
{% for ipaddress in object.ipaddresses.all %}
{{ ipaddress|linkify }}<br />
{% empty %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endfor %}
</td>
</tr>

View File

@@ -21,7 +21,7 @@
{% endif %}
{{ object.site|linkify }}
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -56,7 +56,7 @@
{% if object.role %}
<a href="{% url 'ipam:vlan_list' %}?role={{ object.role.slug }}">{{ object.role }}</a>
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -35,7 +35,7 @@
{% if object.phone %}
<a href="tel:{{ object.phone }}">{{ object.phone }}</a>
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -45,7 +45,7 @@
{% if object.email %}
<a href="mailto:{{ object.email }}">{{ object.email }}</a>
{% else %}
<span class="text-muted">None</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -77,6 +77,10 @@
<h2><a href="{% url 'ipam:prefix_list' %}?tenant_id={{ object.pk }}" class="stat-btn btn {% if stats.prefix_count %}btn-primary{% else %}btn-outline-dark{% endif %} btn-lg">{{ stats.prefix_count }}</a></h2>
<p>Prefixes</p>
</div>
<div class="col col-md-4 text-center">
<h2><a href="{% url 'ipam:iprange_list' %}?tenant_id={{ object.pk }}" class="stat-btn btn {% if stats.iprange_count %}btn-primary{% else %}btn-outline-dark{% endif %} btn-lg">{{ stats.iprange_count }}</a></h2>
<p>IP Ranges</p>
</div>
<div class="col col-md-4 text-center">
<h2><a href="{% url 'ipam:ipaddress_list' %}?tenant_id={{ object.pk }}" class="stat-btn btn {% if stats.ipaddress_count %}btn-primary{% else %}btn-outline-dark{% endif %} btn-lg">{{ stats.ipaddress_count }}</a></h2>
<p>IP addresses</p>

View File

@@ -50,7 +50,14 @@
<span class="badge bg-danger">Disabled</span>
{% endif %}
</div>
</div>
<div class="col col-md-3">
<small class="text-muted">Allowed Source IPs</small><br />
{% if token.allowed_ips %}
{{ token.allowed_ips|join:', ' }}
{% else %}
<span>Any</span>
{% endif %}
</div> </div>
{% if token.description %}
<br /><span>{{ token.description }}</span>
{% endif %}

View File

@@ -21,7 +21,7 @@
{% if request.user.first_name or request.user.last_name %}
{{ request.user.first_name }} {{ request.user.last_name }}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -49,7 +49,7 @@
(NAT: <a href="{{ object.primary_ip4.nat_outside.get_absolute_url }}">{{ object.primary_ip4.nat_outside.address.ip }}</a>)
{% endif %}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -64,7 +64,7 @@
(NAT: <a href="{{ object.primary_ip6.nat_outside.get_absolute_url }}">{{ object.primary_ip6.nat_outside.address.ip }}</a>)
{% endif %}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -78,31 +78,39 @@
</div>
<div class="col col-md-6">
<div class="card">
<h5 class="card-header">
Cluster
</h5>
<h5 class="card-header">Cluster</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
<th scope="row">Site</th>
<td>
{{ object.site|linkify|placeholder }}
</td>
</tr>
<tr>
<th scope="row">Cluster</th>
<td>
{% if object.cluster.group %}
{{ object.cluster.group|linkify }} /
{% endif %}
{{ object.cluster|linkify }}
{{ object.cluster|linkify|placeholder }}
</td>
</tr>
<tr>
<th scope="row">Cluster Type</th>
<td>{{ object.cluster.type }}</td>
</tr>
<tr>
<th scope="row">Device</th>
<td>
{{ object.device|linkify|placeholder }}
</td>
</tr>
</table>
</div>
</div>
<div class="card">
<h5 class="card-header">
Resources
</h5>
<h5 class="card-header">Resources</h5>
<div class="card-body">
<table class="table table-hover attr-table">
<tr>
@@ -115,7 +123,7 @@
{% if object.memory %}
{{ object.memory|humanize_megabytes }}
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -125,7 +133,7 @@
{% if object.disk %}
{{ object.disk }} GB
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>

View File

@@ -33,7 +33,7 @@
{% if interface.rf_channel_frequency %}
{{ interface.rf_channel_frequency|simplify_decimal }} MHz
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>
@@ -43,7 +43,7 @@
{% if interface.rf_channel_width %}
{{ interface.rf_channel_width|simplify_decimal }} MHz
{% else %}
<span class="text-muted">&mdash;</span>
{{ ''|placeholder }}
{% endif %}
</td>
</tr>