diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 2cee436d7..288fa5753 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -2,7 +2,9 @@ import django_tables2 as tables from dcim.models import Region, Site, SiteGroup from tenancy.tables import TenantColumn -from utilities.tables import BaseTable, ButtonsColumn, ChoiceFieldColumn, MPTTColumn, TagColumn, ToggleColumn +from utilities.tables import ( + BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn, +) __all__ = ( 'RegionTable', @@ -20,7 +22,9 @@ class RegionTable(BaseTable): name = MPTTColumn( linkify=True ) - site_count = tables.Column( + site_count = LinkedCountColumn( + viewname='dcim:site_list', + url_params={'region_id': 'pk'}, verbose_name='Sites' ) actions = ButtonsColumn(Region) @@ -40,7 +44,9 @@ class SiteGroupTable(BaseTable): name = MPTTColumn( linkify=True ) - site_count = tables.Column( + site_count = LinkedCountColumn( + viewname='dcim:site_list', + url_params={'group_id': 'pk'}, verbose_name='Sites' ) actions = ButtonsColumn(SiteGroup) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index bdfa5129d..d892c0823 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -116,15 +116,26 @@ class RegionView(generic.ObjectView): queryset = Region.objects.all() def get_extra_context(self, request, instance): + child_regions = Region.objects.add_related_count( + Region.objects.all(), + Site, + 'region', + 'site_count', + cumulative=True + ).restrict(request.user, 'view').filter( + parent__in=instance.get_descendants(include_self=True) + ) + child_regions_table = tables.RegionTable(child_regions) + sites = Site.objects.restrict(request.user, 'view').filter( region=instance ) - sites_table = tables.SiteTable(sites) sites_table.columns.hide('region') paginate_table(sites_table, request) return { + 'child_regions_table': child_regions_table, 'sites_table': sites_table, } @@ -190,15 +201,26 @@ class SiteGroupView(generic.ObjectView): queryset = SiteGroup.objects.all() def get_extra_context(self, request, instance): + child_groups = SiteGroup.objects.add_related_count( + SiteGroup.objects.all(), + Site, + 'group', + 'site_count', + cumulative=True + ).restrict(request.user, 'view').filter( + parent__in=instance.get_descendants(include_self=True) + ) + child_groups_table = tables.SiteGroupTable(child_groups) + sites = Site.objects.restrict(request.user, 'view').filter( group=instance ) - sites_table = tables.SiteTable(sites) sites_table.columns.hide('group') paginate_table(sites_table, request) return { + 'child_groups_table': child_groups_table, 'sites_table': sites_table, } diff --git a/netbox/templates/dcim/region.html b/netbox/templates/dcim/region.html index c79336962..1e2d395dd 100644 --- a/netbox/templates/dcim/region.html +++ b/netbox/templates/dcim/region.html @@ -44,10 +44,23 @@ + {% include 'inc/custom_fields_panel.html' %} {% plugin_left_page object %}