From f2aa35d3d2b33fe2c6deacce58b48585e67cb344 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Wed, 29 Dec 2021 09:59:25 -0500 Subject: [PATCH] Closes #7600: Include count of available IPs on prefix view --- docs/release-notes/version-3.1.md | 1 + netbox/ipam/views.py | 2 +- netbox/templates/ipam/prefix.html | 271 +++++++++++++++++------------- 3 files changed, 154 insertions(+), 120 deletions(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 2f8f9fa35..da9346207 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -5,6 +5,7 @@ ### Enhancements * [#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 * [#8175](https://github.com/netbox-community/netbox/issues/8175) - Display parent object when attaching an image diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 4a4aef28f..317caeaf2 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -418,7 +418,7 @@ class PrefixView(generic.ObjectView): ).filter( prefix__net_contains=str(instance.prefix) ).prefetch_related( - 'site', 'role' + 'site', 'role', 'tenant' ) parent_prefix_table = tables.PrefixTable( list(parent_prefixes), diff --git a/netbox/templates/ipam/prefix.html b/netbox/templates/ipam/prefix.html index eaea4e1ec..c7c0a441e 100644 --- a/netbox/templates/ipam/prefix.html +++ b/netbox/templates/ipam/prefix.html @@ -4,127 +4,160 @@ {% block content %}
-
-
-
- Prefix -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FamilyIPv{{ object.family }}
VRF - {% if object.vrf %} - {{ object.vrf }} ({{ object.vrf.rd }}) - {% else %} - Global - {% endif %} -
Tenant - {% if object.tenant %} - {% if object.tenant.group %} - {{ object.tenant.group }} / - {% endif %} - {{ object.tenant }} - {% else %} - None - {% endif %} -
Aggregate - {% if aggregate %} - {{ aggregate.prefix }} ({{ aggregate.rir }}) - {% else %} - None - {% endif %} -
Site - {% if object.site %} - {% if object.site.region %} - {{ object.site.region }} / - {% endif %} - {{ object.site }} - {% else %} - None - {% endif %} -
VLAN - {% if object.vlan %} - {% if object.vlan.group %} - {{ object.vlan.group }} / - {% endif %} - {{ object.vlan }} - {% else %} - None - {% endif %} -
Status - {{ object.get_status_display }} -
Role - {% if object.role %} - {{ object.role }} - {% else %} - None - {% endif %} -
Description{{ object.description|placeholder }}
Is a pool - {% if object.is_pool %} - - {% else %} - - {% endif %} -
Utilization - {% if object.mark_utilized %} - {% utilization_graph 100 warning_threshold=0 danger_threshold=0 %} - (Marked fully utilized) - {% else %} - {% utilization_graph object.get_utilization %} - {% endif %} -
-
-
- {% plugin_left_page object %} +
+
+
Prefix
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FamilyIPv{{ object.family }}
VRF + {% if object.vrf %} + {{ object.vrf }} ({{ object.vrf.rd }}) + {% else %} + Global + {% endif %} +
Tenant + {% if object.tenant %} + {% if object.tenant.group %} + {{ object.tenant.group }} / + {% endif %} + {{ object.tenant }} + {% else %} + None + {% endif %} +
Aggregate + {% if aggregate %} + {{ aggregate.prefix }} ({{ aggregate.rir }}) + {% else %} + None + {% endif %} +
Site + {% if object.site %} + {% if object.site.region %} + {{ object.site.region }} / + {% endif %} + {{ object.site }} + {% else %} + None + {% endif %} +
VLAN + {% if object.vlan %} + {% if object.vlan.group %} + {{ object.vlan.group }} / + {% endif %} + {{ object.vlan }} + {% else %} + None + {% endif %} +
Status + {{ object.get_status_display }} +
Role + {% if object.role %} + {{ object.role }} + {% else %} + None + {% endif %} +
Description{{ object.description|placeholder }}
Is a pool + {% if object.is_pool %} + + {% else %} + + {% endif %} +
+
-
- {% include 'inc/panels/custom_fields.html' %} - {% include 'inc/panels/tags.html' %} - {% plugin_right_page object %} + {% plugin_left_page object %} +
+
+
+
Addressing
+
+ + + + + + {% with child_ip_count=object.get_child_ips.count %} + + + + + + + + + {% endwith %} + + + + +
Utilization + {% if object.mark_utilized %} + {% utilization_graph 100 warning_threshold=0 danger_threshold=0 %} + (Marked fully utilized) + {% else %} + {% utilization_graph object.get_utilization %} + {% endif %} +
Child IPs + {{ child_ip_count }} +
Available IPs{{ object.get_available_ips|length }}
First available IP + {% with first_available_ip=object.get_first_available_ip %} + {% if first_available_ip %} + {% if perms.ipam.add_ipaddress %} + {{ first_available_ip }} + {% else %} + {{ first_available_ip }} + {% endif %} + {% else %} + None + {% endif %} + {% endwith %} +
+
+ {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% plugin_right_page object %} +