From 0edf9b17f65636aa36275c8b35f68553226f3989 Mon Sep 17 00:00:00 2001 From: Will Irvine Date: Sat, 13 Nov 2021 13:27:49 +1300 Subject: [PATCH 01/37] Closes #7665 add new boolen for filtering assigned prefixes, adjust current filter for avaliabile prefixes to only return avaliable --- netbox/ipam/utils.py | 7 +------ netbox/ipam/views.py | 19 +++++++++++++++---- .../templates/ipam/inc/toggle_available.html | 11 +++++++++++ 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/netbox/ipam/utils.py b/netbox/ipam/utils.py index 0e79e7f78..888a2ad17 100644 --- a/netbox/ipam/utils.py +++ b/netbox/ipam/utils.py @@ -13,12 +13,7 @@ def add_available_prefixes(parent, prefix_list): available_prefixes = netaddr.IPSet(parent) ^ netaddr.IPSet([p.prefix for p in prefix_list]) available_prefixes = [Prefix(prefix=p, status=None) for p in available_prefixes.iter_cidrs()] - # Concatenate and sort complete list of children - prefix_list = list(prefix_list) + available_prefixes - prefix_list.sort(key=lambda p: p.prefix) - - return prefix_list - + return available_prefixes def add_available_ipaddresses(prefix, ipaddress_list, is_pool=False): """ diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index c24a80124..300f2f6d7 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -393,14 +393,24 @@ class PrefixPrefixesView(generic.ObjectView): template_name = 'ipam/prefix/prefixes.html' def get_extra_context(self, request, instance): - # Child prefixes table - child_prefixes = instance.get_child_prefixes().restrict(request.user, 'view').prefetch_related( + # Initial pull of currently assigned child prefixes + child_prefixes_assigned = instance.get_child_prefixes().restrict(request.user, 'view').prefetch_related( 'site', 'vlan', 'role', ) + # List to append filtered prefixes to + child_prefixes = [] + # Add available prefixes to the table if requested - if child_prefixes and request.GET.get('show_available', 'true') == 'true': - child_prefixes = add_available_prefixes(instance.prefix, child_prefixes) + if child_prefixes_assigned and request.GET.get('show_available', 'true') == 'true': + child_prefixes = child_prefixes + add_available_prefixes(instance.prefix, child_prefixes_assigned) + + # Add assigned prefixes to the table if requested + if child_prefixes_assigned and request.GET.get('show_assigned', 'true') == 'true': + child_prefixes = child_prefixes + list(child_prefixes_assigned) + + # Sort child prefixes after additions + child_prefixes.sort(key=lambda p: p.prefix) table = tables.PrefixTable(child_prefixes, user=request.user, exclude=('utilization',)) if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'): @@ -422,6 +432,7 @@ class PrefixPrefixesView(generic.ObjectView): 'active_tab': 'prefixes', 'first_available_prefix': instance.get_first_available_prefix(), 'show_available': request.GET.get('show_available', 'true') == 'true', + 'show_assigned': request.GET.get('show_assigned', 'true') == 'true', } diff --git a/netbox/templates/ipam/inc/toggle_available.html b/netbox/templates/ipam/inc/toggle_available.html index 234218a01..f0d286128 100644 --- a/netbox/templates/ipam/inc/toggle_available.html +++ b/netbox/templates/ipam/inc/toggle_available.html @@ -1,5 +1,16 @@ {% load helpers %} +{% if show_assigned is not None %} +
+ + Show Assigned + + + Hide Assigned + +
+{% endif %} + {% if show_available is not None %}
From 641a9bc6c56a214737b673add3f3de9efb9b9671 Mon Sep 17 00:00:00 2001 From: Will Irvine Date: Sat, 13 Nov 2021 15:26:07 +1300 Subject: [PATCH 02/37] pep8 compliance --- netbox/ipam/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/ipam/utils.py b/netbox/ipam/utils.py index 888a2ad17..c457dc068 100644 --- a/netbox/ipam/utils.py +++ b/netbox/ipam/utils.py @@ -15,6 +15,7 @@ def add_available_prefixes(parent, prefix_list): return available_prefixes + def add_available_ipaddresses(prefix, ipaddress_list, is_pool=False): """ Annotate ranges of available IP addresses within a given prefix. If is_pool is True, the first and last IP will be From 80048bfa2b259b1f3dad5bf7ddefc7c1254ccd6a Mon Sep 17 00:00:00 2001 From: Will Irvine Date: Sat, 13 Nov 2021 16:42:38 +1300 Subject: [PATCH 03/37] Make the same changes for aggregate views as these use the same adjusted functions --- netbox/ipam/views.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 300f2f6d7..fc64eb73b 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -213,7 +213,7 @@ class AggregateView(generic.ObjectView): def get_extra_context(self, request, instance): # Find all child prefixes contained by this aggregate - child_prefixes = Prefix.objects.restrict(request.user, 'view').filter( + child_prefixes_assigned = Prefix.objects.restrict(request.user, 'view').filter( prefix__net_contained_or_equal=str(instance.prefix) ).prefetch_related( 'site', 'role' @@ -221,9 +221,19 @@ class AggregateView(generic.ObjectView): 'prefix' ) + # List to append filtered prefixes to + child_prefixes = [] + # Add available prefixes to the table if requested - if request.GET.get('show_available', 'true') == 'true': - child_prefixes = add_available_prefixes(instance.prefix, child_prefixes) + if child_prefixes_assigned and request.GET.get('show_available', 'true') == 'true': + child_prefixes = child_prefixes + add_available_prefixes(instance.prefix, child_prefixes_assigned) + + # Add assigned prefixes to the table if requested + if child_prefixes_assigned and request.GET.get('show_assigned', 'true') == 'true': + child_prefixes = child_prefixes + list(child_prefixes_assigned) + + # Sort child prefixes after additions + child_prefixes.sort(key=lambda p: p.prefix) prefix_table = tables.PrefixTable(child_prefixes, exclude=('utilization',)) if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'): @@ -242,6 +252,7 @@ class AggregateView(generic.ObjectView): 'permissions': permissions, 'bulk_querystring': f'within={instance.prefix}', 'show_available': request.GET.get('show_available', 'true') == 'true', + 'show_assigned': request.GET.get('show_assigned', 'true') == 'true', } From dcfd332cbfb2817b91ec744933291a718b3ebbdd Mon Sep 17 00:00:00 2001 From: Will Irvine Date: Wed, 1 Dec 2021 19:24:44 +1300 Subject: [PATCH 04/37] Moved filtering logic to utils, adjusted show buttons --- netbox/ipam/utils.py | 26 +++++++++--- netbox/ipam/views.py | 40 +++++-------------- .../templates/ipam/inc/toggle_available.html | 26 +++++------- 3 files changed, 38 insertions(+), 54 deletions(-) diff --git a/netbox/ipam/utils.py b/netbox/ipam/utils.py index c457dc068..3ec910ede 100644 --- a/netbox/ipam/utils.py +++ b/netbox/ipam/utils.py @@ -4,16 +4,30 @@ from .constants import * from .models import Prefix, VLAN -def add_available_prefixes(parent, prefix_list): +def add_requested_prefixes(parent, prefix_list, request): """ - Create fake Prefix objects for all unallocated space within a prefix. + Return a list of requested prefixes using show_available, show_assigned filters. + If avalible prefixes are requested, create fake Prefix objects for all unallocated space within a prefix """ - # Find all unallocated space - available_prefixes = netaddr.IPSet(parent) ^ netaddr.IPSet([p.prefix for p in prefix_list]) - available_prefixes = [Prefix(prefix=p, status=None) for p in available_prefixes.iter_cidrs()] + child_prefixes = [] - return available_prefixes + # Add available prefixes to the table if requested + if prefix_list and request.GET.get('show_available', 'true') == 'true': + + # Find all unallocated space, add fake Prefix objects to child_prefixes. + available_prefixes = netaddr.IPSet(parent) ^ netaddr.IPSet([p.prefix for p in prefix_list]) + available_prefixes = [Prefix(prefix=p, status=None) for p in available_prefixes.iter_cidrs()] + child_prefixes = child_prefixes + available_prefixes + + # Add assigned prefixes to the table if requested + if prefix_list and request.GET.get('show_assigned', 'true') == 'true': + child_prefixes = child_prefixes + list(prefix_list) + + # Sort child prefixes after additions + child_prefixes.sort(key=lambda p: p.prefix) + + return child_prefixes def add_available_ipaddresses(prefix, ipaddress_list, is_pool=False): diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index fc64eb73b..337c5cf8f 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -11,7 +11,7 @@ from virtualization.models import VirtualMachine, VMInterface from . import filtersets, forms, tables from .constants import * from .models import * -from .utils import add_available_ipaddresses, add_available_prefixes, add_available_vlans +from .utils import add_available_ipaddresses, add_requested_prefixes, add_available_vlans # @@ -212,8 +212,8 @@ class AggregateView(generic.ObjectView): queryset = Aggregate.objects.all() def get_extra_context(self, request, instance): - # Find all child prefixes contained by this aggregate - child_prefixes_assigned = Prefix.objects.restrict(request.user, 'view').filter( + # Find all child prefixes contained in this aggregate + prefix_list = Prefix.objects.restrict(request.user, 'view').filter( prefix__net_contained_or_equal=str(instance.prefix) ).prefetch_related( 'site', 'role' @@ -221,19 +221,8 @@ class AggregateView(generic.ObjectView): 'prefix' ) - # List to append filtered prefixes to - child_prefixes = [] - - # Add available prefixes to the table if requested - if child_prefixes_assigned and request.GET.get('show_available', 'true') == 'true': - child_prefixes = child_prefixes + add_available_prefixes(instance.prefix, child_prefixes_assigned) - - # Add assigned prefixes to the table if requested - if child_prefixes_assigned and request.GET.get('show_assigned', 'true') == 'true': - child_prefixes = child_prefixes + list(child_prefixes_assigned) - - # Sort child prefixes after additions - child_prefixes.sort(key=lambda p: p.prefix) + # Return List of requested Prefixes + child_prefixes = add_requested_prefixes(instance.prefix, prefix_list, request) prefix_table = tables.PrefixTable(child_prefixes, exclude=('utilization',)) if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'): @@ -404,24 +393,13 @@ class PrefixPrefixesView(generic.ObjectView): template_name = 'ipam/prefix/prefixes.html' def get_extra_context(self, request, instance): - # Initial pull of currently assigned child prefixes - child_prefixes_assigned = instance.get_child_prefixes().restrict(request.user, 'view').prefetch_related( + # Find all child prefixes contained in this prefix + prefix_list = instance.get_child_prefixes().restrict(request.user, 'view').prefetch_related( 'site', 'vlan', 'role', ) - # List to append filtered prefixes to - child_prefixes = [] - - # Add available prefixes to the table if requested - if child_prefixes_assigned and request.GET.get('show_available', 'true') == 'true': - child_prefixes = child_prefixes + add_available_prefixes(instance.prefix, child_prefixes_assigned) - - # Add assigned prefixes to the table if requested - if child_prefixes_assigned and request.GET.get('show_assigned', 'true') == 'true': - child_prefixes = child_prefixes + list(child_prefixes_assigned) - - # Sort child prefixes after additions - child_prefixes.sort(key=lambda p: p.prefix) + # Return List of requested Prefixes + child_prefixes = add_requested_prefixes(instance.prefix, prefix_list, request) table = tables.PrefixTable(child_prefixes, user=request.user, exclude=('utilization',)) if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'): diff --git a/netbox/templates/ipam/inc/toggle_available.html b/netbox/templates/ipam/inc/toggle_available.html index f0d286128..15ea19c98 100644 --- a/netbox/templates/ipam/inc/toggle_available.html +++ b/netbox/templates/ipam/inc/toggle_available.html @@ -1,23 +1,15 @@ {% load helpers %} -{% if show_assigned is not None %} +{% if show_assigned or show_available is not None %} -{% endif %} - -{% if show_available is not None %} - -{% endif %} +{% endif %} \ No newline at end of file From ca07a886747f59f17b1034af3fa14acb14fa3065 Mon Sep 17 00:00:00 2001 From: Will Irvine Date: Thu, 2 Dec 2021 10:47:19 +1300 Subject: [PATCH 05/37] fix spelling... --- netbox/templates/ipam/inc/toggle_available.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/templates/ipam/inc/toggle_available.html b/netbox/templates/ipam/inc/toggle_available.html index 15ea19c98..6c5b3319e 100644 --- a/netbox/templates/ipam/inc/toggle_available.html +++ b/netbox/templates/ipam/inc/toggle_available.html @@ -6,10 +6,10 @@ Show Assigned - Show Avaliable + Show Available Show All
-{% endif %} \ No newline at end of file +{% endif %} From 13414dcd25e2587bcf3c0f4fcc081dca176385d4 Mon Sep 17 00:00:00 2001 From: William Irvine <32685892+WillIrvine@users.noreply.github.com> Date: Tue, 7 Dec 2021 10:13:54 +1300 Subject: [PATCH 06/37] pep8 compliance... --- netbox/ipam/views.py | 1 - 1 file changed, 1 deletion(-) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 46d0131d4..8f0610cc1 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -18,7 +18,6 @@ from .models import ASN from .utils import add_available_ipaddresses, add_requested_prefixes, add_available_vlans - # # VRFs # From b6d93b7c5b39d4f778eda6b221c6ec3d5ac21362 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 13 Dec 2021 12:10:03 -0500 Subject: [PATCH 07/37] Changelog for #7665 --- docs/release-notes/version-3.1.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index 0224b9c15..b65a2a776 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -1,5 +1,13 @@ # NetBox v3.1 +## v3.1.2 (FUTURE) + +### Enhancements + +* [#7665](https://github.com/netbox-community/netbox/issues/7665) - Add toggle to show only available child prefixes + +--- + ## v3.1.1 (2021-12-13) ### Enhancements From afc866eee4d5fca5ff29e5c95f25b7384174da6c Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 13 Dec 2021 12:15:43 -0500 Subject: [PATCH 08/37] #7665: Refactored add_requested_prefixes(); removed button icons --- netbox/ipam/utils.py | 16 ++++++++++------ netbox/ipam/views.py | 16 ++++++++++------ netbox/templates/ipam/inc/toggle_available.html | 12 ++++++------ 3 files changed, 26 insertions(+), 18 deletions(-) diff --git a/netbox/ipam/utils.py b/netbox/ipam/utils.py index 3ec910ede..97da9e4fe 100644 --- a/netbox/ipam/utils.py +++ b/netbox/ipam/utils.py @@ -4,16 +4,20 @@ from .constants import * from .models import Prefix, VLAN -def add_requested_prefixes(parent, prefix_list, request): - """ - Return a list of requested prefixes using show_available, show_assigned filters. - If avalible prefixes are requested, create fake Prefix objects for all unallocated space within a prefix +def add_requested_prefixes(parent, prefix_list, show_available=True, show_assigned=True): """ + Return a list of requested prefixes using show_available, show_assigned filters. If available prefixes are + requested, create fake Prefix objects for all unallocated space within a prefix. + :param parent: Parent Prefix instance + :param prefix_list: Child prefixes list + :param show_available: Include available prefixes. + :param show_assigned: Show assigned prefixes. + """ child_prefixes = [] # Add available prefixes to the table if requested - if prefix_list and request.GET.get('show_available', 'true') == 'true': + if prefix_list and show_available: # Find all unallocated space, add fake Prefix objects to child_prefixes. available_prefixes = netaddr.IPSet(parent) ^ netaddr.IPSet([p.prefix for p in prefix_list]) @@ -21,7 +25,7 @@ def add_requested_prefixes(parent, prefix_list, request): child_prefixes = child_prefixes + available_prefixes # Add assigned prefixes to the table if requested - if prefix_list and request.GET.get('show_assigned', 'true') == 'true': + if prefix_list and show_assigned: child_prefixes = child_prefixes + list(prefix_list) # Sort child prefixes after additions diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 8f0610cc1..e2a6be7fe 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -285,7 +285,9 @@ class AggregateView(generic.ObjectView): ) # Return List of requested Prefixes - child_prefixes = add_requested_prefixes(instance.prefix, prefix_list, request) + show_available = bool(request.GET.get('show_available', 'true') == 'true') + show_assigned = bool(request.GET.get('show_assigned', 'true') == 'true') + child_prefixes = add_requested_prefixes(instance.prefix, prefix_list, show_available, show_assigned) prefix_table = tables.PrefixTable(child_prefixes, exclude=('utilization',)) if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'): @@ -303,8 +305,8 @@ class AggregateView(generic.ObjectView): 'prefix_table': prefix_table, 'permissions': permissions, 'bulk_querystring': f'within={instance.prefix}', - 'show_available': request.GET.get('show_available', 'true') == 'true', - 'show_assigned': request.GET.get('show_assigned', 'true') == 'true', + 'show_available': show_available, + 'show_assigned': show_assigned, } @@ -462,7 +464,9 @@ class PrefixPrefixesView(generic.ObjectView): ) # Return List of requested Prefixes - child_prefixes = add_requested_prefixes(instance.prefix, prefix_list, request) + show_available = bool(request.GET.get('show_available', 'true') == 'true') + show_assigned = bool(request.GET.get('show_assigned', 'true') == 'true') + child_prefixes = add_requested_prefixes(instance.prefix, prefix_list, show_available, show_assigned) table = tables.PrefixTable(child_prefixes, user=request.user, exclude=('utilization',)) if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'): @@ -483,8 +487,8 @@ class PrefixPrefixesView(generic.ObjectView): 'bulk_querystring': bulk_querystring, 'active_tab': 'prefixes', 'first_available_prefix': instance.get_first_available_prefix(), - 'show_available': request.GET.get('show_available', 'true') == 'true', - 'show_assigned': request.GET.get('show_assigned', 'true') == 'true', + 'show_available': show_available, + 'show_assigned': show_assigned, } diff --git a/netbox/templates/ipam/inc/toggle_available.html b/netbox/templates/ipam/inc/toggle_available.html index 6c5b3319e..ccdc45668 100644 --- a/netbox/templates/ipam/inc/toggle_available.html +++ b/netbox/templates/ipam/inc/toggle_available.html @@ -2,14 +2,14 @@ {% if show_assigned or show_available is not None %} {% endif %} From dc1331e736c0317ebc52af64416906b176f4e2c7 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 13 Dec 2021 13:42:59 -0500 Subject: [PATCH 09/37] Fixes #7674: Fix inadvertent application of device type context to virtual machines --- docs/release-notes/version-3.1.md | 4 ++++ netbox/extras/querysets.py | 8 +++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index b65a2a776..83dffd121 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -6,6 +6,10 @@ * [#7665](https://github.com/netbox-community/netbox/issues/7665) - Add toggle to show only available child prefixes +### Bug Fixes + +* [#7674](https://github.com/netbox-community/netbox/issues/7674) - Fix inadvertent application of device type context to virtual machines + --- ## v3.1.1 (2021-12-13) diff --git a/netbox/extras/querysets.py b/netbox/extras/querysets.py index be5ae6416..59d16fff8 100644 --- a/netbox/extras/querysets.py +++ b/netbox/extras/querysets.py @@ -22,7 +22,7 @@ class ConfigContextQuerySet(RestrictedQuerySet): # Device type assignment is relevant only for Devices device_type = getattr(obj, 'device_type', None) - # Cluster assignment is relevant only for VirtualMachines + # Get assigned Cluster and ClusterGroup, if any cluster = getattr(obj, 'cluster', None) cluster_group = getattr(cluster, 'group', None) @@ -67,11 +67,8 @@ class ConfigContextModelQuerySet(RestrictedQuerySet): Includes a method which appends an annotation of aggregated config context JSON data objects. This is implemented as a subquery which performs all the joins necessary to filter relevant config context objects. This offers a substantial performance gain over ConfigContextQuerySet.get_for_object() when dealing with - multiple objects. - - This allows the annotation to be entirely optional. + multiple objects. This allows the annotation to be entirely optional. """ - def annotate_config_context_data(self): """ Attach the subquery annotation to the base queryset @@ -123,6 +120,7 @@ class ConfigContextModelQuerySet(RestrictedQuerySet): elif self.model._meta.model_name == 'virtualmachine': base_query.add((Q(roles=OuterRef('role')) | Q(roles=None)), Q.AND) base_query.add((Q(sites=OuterRef('cluster__site')) | Q(sites=None)), Q.AND) + base_query.add(Q(device_types=None), Q.AND) region_field = 'cluster__site__region' sitegroup_field = 'cluster__site__group' From c50dc1eb353cd79da88a4379b96a39529835656e Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 13 Dec 2021 15:36:51 -0500 Subject: [PATCH 10/37] Standardize usage of table template --- netbox/templates/circuits/circuittype.html | 5 +- netbox/templates/circuits/provider.html | 5 +- .../templates/circuits/providernetwork.html | 5 +- .../templates/dcim/device/consoleports.html | 4 +- .../dcim/device/consoleserverports.html | 4 +- netbox/templates/dcim/device/devicebays.html | 4 +- netbox/templates/dcim/device/frontports.html | 4 +- netbox/templates/dcim/device/interfaces.html | 4 +- netbox/templates/dcim/device/inventory.html | 4 +- .../templates/dcim/device/poweroutlets.html | 4 +- netbox/templates/dcim/device/powerports.html | 4 +- netbox/templates/dcim/device/rearports.html | 4 +- netbox/templates/dcim/devicerole.html | 5 +- netbox/templates/dcim/interface.html | 2 +- netbox/templates/dcim/location.html | 5 +- netbox/templates/dcim/manufacturer.html | 5 +- netbox/templates/dcim/platform.html | 5 +- netbox/templates/dcim/powerpanel.html | 2 +- netbox/templates/dcim/rackrole.html | 5 +- netbox/templates/dcim/region.html | 9 ++- netbox/templates/dcim/sitegroup.html | 9 ++- netbox/templates/extras/object_changelog.html | 4 +- netbox/templates/extras/object_journal.html | 4 +- .../generic/object_bulk_add_component.html | 5 +- .../templates/generic/object_bulk_delete.html | 5 +- .../templates/generic/object_bulk_edit.html | 5 +- .../templates/generic/object_bulk_remove.html | 5 +- netbox/templates/inc/panel_table.html | 8 +- netbox/templates/inc/table.html | 76 +++++++++---------- netbox/templates/ipam/asn.html | 5 +- netbox/templates/ipam/fhrpgroup.html | 4 +- netbox/templates/ipam/ipaddress.html | 4 +- netbox/templates/ipam/rir.html | 5 +- netbox/templates/ipam/role.html | 5 +- netbox/templates/ipam/vlangroup.html | 2 +- netbox/templates/tenancy/contact.html | 2 +- netbox/templates/tenancy/contactgroup.html | 9 ++- netbox/templates/tenancy/contactrole.html | 5 +- netbox/templates/tenancy/tenantgroup.html | 5 +- .../virtualization/clustergroup.html | 5 +- .../templates/virtualization/clustertype.html | 5 +- .../virtualmachine/interfaces.html | 4 +- .../templates/virtualization/vminterface.html | 2 +- netbox/templates/wireless/wirelesslan.html | 5 +- .../templates/wireless/wirelesslangroup.html | 5 +- 45 files changed, 167 insertions(+), 115 deletions(-) diff --git a/netbox/templates/circuits/circuittype.html b/netbox/templates/circuits/circuittype.html index 57737a6d1..67b6d2d86 100644 --- a/netbox/templates/circuits/circuittype.html +++ b/netbox/templates/circuits/circuittype.html @@ -1,6 +1,7 @@ {% extends 'generic/object.html' %} {% load helpers %} {% load plugins %} +{% load render_table from django_tables2 %} {% block content %}
@@ -42,8 +43,8 @@
Circuits
-
- {% include 'inc/table.html' with table=circuits_table %} +
+ {% render_table circuits_table 'inc/table.html' %}
{% if perms.circuits.add_circuit %}