mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-19 09:53:34 -06:00
Closes #7600: Include count of available IPs on prefix view
This commit is contained in:
parent
9c9fcaf42f
commit
f2aa35d3d2
@ -5,6 +5,7 @@
|
|||||||
### Enhancements
|
### Enhancements
|
||||||
|
|
||||||
* [#6782](https://github.com/netbox-community/netbox/issues/6782) - Enable the inclusion of custom links in tables
|
* [#6782](https://github.com/netbox-community/netbox/issues/6782) - Enable the inclusion of custom links in tables
|
||||||
|
* [#7600](https://github.com/netbox-community/netbox/issues/7600) - Include count of available IPs on prefix view
|
||||||
* [#8100](https://github.com/netbox-community/netbox/issues/8100) - Add "other" choice for FHRP group protocol
|
* [#8100](https://github.com/netbox-community/netbox/issues/8100) - Add "other" choice for FHRP group protocol
|
||||||
* [#8175](https://github.com/netbox-community/netbox/issues/8175) - Display parent object when attaching an image
|
* [#8175](https://github.com/netbox-community/netbox/issues/8175) - Display parent object when attaching an image
|
||||||
|
|
||||||
|
@ -418,7 +418,7 @@ class PrefixView(generic.ObjectView):
|
|||||||
).filter(
|
).filter(
|
||||||
prefix__net_contains=str(instance.prefix)
|
prefix__net_contains=str(instance.prefix)
|
||||||
).prefetch_related(
|
).prefetch_related(
|
||||||
'site', 'role'
|
'site', 'role', 'tenant'
|
||||||
)
|
)
|
||||||
parent_prefix_table = tables.PrefixTable(
|
parent_prefix_table = tables.PrefixTable(
|
||||||
list(parent_prefixes),
|
list(parent_prefixes),
|
||||||
|
@ -4,127 +4,160 @@
|
|||||||
|
|
||||||
{% 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">Prefix</h5>
|
||||||
Prefix
|
<div class="card-body">
|
||||||
</h5>
|
<table class="table table-hover attr-table">
|
||||||
<div class="card-body">
|
<tr>
|
||||||
<table class="table table-hover attr-table">
|
<th scope="row">Family</th>
|
||||||
<tr>
|
<td>IPv{{ object.family }}</td>
|
||||||
<th scope="row">Family</th>
|
</tr>
|
||||||
<td>IPv{{ object.family }}</td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">VRF</th>
|
||||||
<tr>
|
<td>
|
||||||
<th scope="row">VRF</th>
|
{% if object.vrf %}
|
||||||
<td>
|
<a href="{% url 'ipam:vrf' pk=object.vrf.pk %}">{{ object.vrf }}</a> ({{ object.vrf.rd }})
|
||||||
{% if object.vrf %}
|
{% else %}
|
||||||
<a href="{% url 'ipam:vrf' pk=object.vrf.pk %}">{{ object.vrf }}</a> ({{ object.vrf.rd }})
|
<span>Global</span>
|
||||||
{% else %}
|
{% endif %}
|
||||||
<span>Global</span>
|
</td>
|
||||||
{% endif %}
|
</tr>
|
||||||
</td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">Tenant</th>
|
||||||
<tr>
|
<td>
|
||||||
<th scope="row">Tenant</th>
|
{% if object.tenant %}
|
||||||
<td>
|
{% if object.tenant.group %}
|
||||||
{% if object.tenant %}
|
<a href="{{ object.tenant.group.get_absolute_url }}">{{ object.tenant.group }}</a> /
|
||||||
{% if object.tenant.group %}
|
{% endif %}
|
||||||
<a href="{{ object.tenant.group.get_absolute_url }}">{{ object.tenant.group }}</a> /
|
<a href="{{ object.tenant.get_absolute_url }}">{{ object.tenant }}</a>
|
||||||
{% endif %}
|
{% else %}
|
||||||
<a href="{{ object.tenant.get_absolute_url }}">{{ object.tenant }}</a>
|
<span class="text-muted">None</span>
|
||||||
{% else %}
|
{% endif %}
|
||||||
<span class="text-muted">None</span>
|
</td>
|
||||||
{% endif %}
|
</tr>
|
||||||
</td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">Aggregate</th>
|
||||||
<tr>
|
<td>
|
||||||
<th scope="row">Aggregate</th>
|
{% if aggregate %}
|
||||||
<td>
|
<a href="{% url 'ipam:aggregate' pk=aggregate.pk %}">{{ aggregate.prefix }}</a> ({{ aggregate.rir }})
|
||||||
{% if aggregate %}
|
{% else %}
|
||||||
<a href="{% url 'ipam:aggregate' pk=aggregate.pk %}">{{ aggregate.prefix }}</a> ({{ aggregate.rir }})
|
<span class="text-warning">None</span>
|
||||||
{% else %}
|
{% endif %}
|
||||||
<span class="text-warning">None</span>
|
</td>
|
||||||
{% endif %}
|
</tr>
|
||||||
</td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">Site</th>
|
||||||
<tr>
|
<td>
|
||||||
<th scope="row">Site</th>
|
{% if object.site %}
|
||||||
<td>
|
{% if object.site.region %}
|
||||||
{% if object.site %}
|
<a href="{{ object.site.region.get_absolute_url }}">{{ object.site.region }}</a> /
|
||||||
{% if object.site.region %}
|
{% endif %}
|
||||||
<a href="{{ object.site.region.get_absolute_url }}">{{ object.site.region }}</a> /
|
<a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a>
|
||||||
{% endif %}
|
{% else %}
|
||||||
<a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a>
|
<span class="text-muted">None</span>
|
||||||
{% else %}
|
{% endif %}
|
||||||
<span class="text-muted">None</span>
|
</td>
|
||||||
{% endif %}
|
</tr>
|
||||||
</td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">VLAN</th>
|
||||||
<tr>
|
<td>
|
||||||
<th scope="row">VLAN</th>
|
{% if object.vlan %}
|
||||||
<td>
|
{% if object.vlan.group %}
|
||||||
{% if object.vlan %}
|
<a href="{{ object.vlan.group.get_absolute_url }}">{{ object.vlan.group }}</a> /
|
||||||
{% if object.vlan.group %}
|
{% endif %}
|
||||||
<a href="{{ object.vlan.group.get_absolute_url }}">{{ object.vlan.group }}</a> /
|
<a href="{% url 'ipam:vlan' pk=object.vlan.pk %}">{{ object.vlan }}</a>
|
||||||
{% endif %}
|
{% else %}
|
||||||
<a href="{% url 'ipam:vlan' pk=object.vlan.pk %}">{{ object.vlan }}</a>
|
<span class="text-muted">None</span>
|
||||||
{% else %}
|
{% endif %}
|
||||||
<span class="text-muted">None</span>
|
</td>
|
||||||
{% endif %}
|
</tr>
|
||||||
</td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">Status</th>
|
||||||
<tr>
|
<td>
|
||||||
<th scope="row">Status</th>
|
<span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
|
||||||
<td>
|
</td>
|
||||||
<span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
|
</tr>
|
||||||
</td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">Role</th>
|
||||||
<tr>
|
<td>
|
||||||
<th scope="row">Role</th>
|
{% if object.role %}
|
||||||
<td>
|
<a href="{{ object.role.get_absolute_url }}">{{ object.role }}</a>
|
||||||
{% if object.role %}
|
{% else %}
|
||||||
<a href="{{ object.role.get_absolute_url }}">{{ object.role }}</a>
|
<span class="text-muted">None</span>
|
||||||
{% else %}
|
{% endif %}
|
||||||
<span class="text-muted">None</span>
|
</td>
|
||||||
{% endif %}
|
</tr>
|
||||||
</td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">Description</th>
|
||||||
<tr>
|
<td>{{ object.description|placeholder }}</td>
|
||||||
<th scope="row">Description</th>
|
</tr>
|
||||||
<td>{{ object.description|placeholder }}</td>
|
<tr>
|
||||||
</tr>
|
<th scope="row">Is a pool</th>
|
||||||
<tr>
|
<td>
|
||||||
<th scope="row">Is a pool</th>
|
{% if object.is_pool %}
|
||||||
<td>
|
<i class="mdi mdi-check-bold text-success" title="Yes"></i>
|
||||||
{% if object.is_pool %}
|
{% else %}
|
||||||
<i class="mdi mdi-check-bold text-success" title="Yes"></i>
|
<i class="mdi mdi-close-thick text-danger" title="No"></i>
|
||||||
{% else %}
|
{% endif %}
|
||||||
<i class="mdi mdi-close-thick text-danger" title="No"></i>
|
</td>
|
||||||
{% endif %}
|
</tr>
|
||||||
</td>
|
</table>
|
||||||
</tr>
|
</div>
|
||||||
<tr>
|
|
||||||
<th scope="row">Utilization</th>
|
|
||||||
<td>
|
|
||||||
{% if object.mark_utilized %}
|
|
||||||
{% utilization_graph 100 warning_threshold=0 danger_threshold=0 %}
|
|
||||||
<small>(Marked fully utilized)</small>
|
|
||||||
{% else %}
|
|
||||||
{% utilization_graph object.get_utilization %}
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% plugin_left_page object %}
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col col-md-6">
|
{% plugin_left_page object %}
|
||||||
{% include 'inc/panels/custom_fields.html' %}
|
</div>
|
||||||
{% include 'inc/panels/tags.html' %}
|
<div class="col col-md-6">
|
||||||
{% plugin_right_page object %}
|
<div class="card">
|
||||||
|
<h5 class="card-header">Addressing</h5>
|
||||||
|
<div class="card-body">
|
||||||
|
<table class="table table-hover attr-table">
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Utilization</th>
|
||||||
|
<td>
|
||||||
|
{% if object.mark_utilized %}
|
||||||
|
{% utilization_graph 100 warning_threshold=0 danger_threshold=0 %}
|
||||||
|
<small>(Marked fully utilized)</small>
|
||||||
|
{% else %}
|
||||||
|
{% utilization_graph object.get_utilization %}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% with child_ip_count=object.get_child_ips.count %}
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Child IPs</th>
|
||||||
|
<td>
|
||||||
|
<a href="{% url 'ipam:prefix_ipaddresses' pk=object.pk %}">{{ child_ip_count }}</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">Available IPs</th>
|
||||||
|
<td>{{ object.get_available_ips|length }}</td>
|
||||||
|
</tr>
|
||||||
|
{% endwith %}
|
||||||
|
<tr>
|
||||||
|
<td>First available IP</td>
|
||||||
|
<td>
|
||||||
|
{% with first_available_ip=object.get_first_available_ip %}
|
||||||
|
{% if first_available_ip %}
|
||||||
|
{% if perms.ipam.add_ipaddress %}
|
||||||
|
<a href="{% url 'ipam:ipaddress_add' %}?address={{ first_available_ip }}">{{ first_available_ip }}</a>
|
||||||
|
{% else %}
|
||||||
|
{{ first_available_ip }}
|
||||||
|
{% endif %}
|
||||||
|
{% else %}
|
||||||
|
<span class="text-muted">None</span>
|
||||||
|
{% endif %}
|
||||||
|
{% endwith %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% include 'inc/panels/custom_fields.html' %}
|
||||||
|
{% include 'inc/panels/tags.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">
|
||||||
|
Loading…
Reference in New Issue
Block a user