From 05d8a06cd5f62052d4ed35015906f7ca43a2b0e5 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 8 Apr 2021 10:08:50 -0400 Subject: [PATCH] Closes #6109: Add device counts to locations table --- docs/release-notes/version-2.11.md | 4 ++++ netbox/dcim/tables/racks.py | 34 +++--------------------------- netbox/dcim/tables/sites.py | 33 ++++++++++++++++++++++++++++- netbox/dcim/views.py | 10 +++++++-- 4 files changed, 47 insertions(+), 34 deletions(-) diff --git a/docs/release-notes/version-2.11.md b/docs/release-notes/version-2.11.md index 9de6d2356..8183431bc 100644 --- a/docs/release-notes/version-2.11.md +++ b/docs/release-notes/version-2.11.md @@ -2,6 +2,10 @@ ## v2.11.0 (FUTURE) +### Enhancements (from Beta) + +* [#6109](https://github.com/netbox-community/netbox/issues/6109) - Add device counts to locations table + ### Bug Fixes (from Beta) * [#6100](https://github.com/netbox-community/netbox/issues/6100) - Fix VM interfaces table "add interfaces" link diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index b549bad10..3a63eef1e 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -1,49 +1,21 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from dcim.models import Rack, Location, RackReservation, RackRole +from dcim.models import Rack, RackReservation, RackRole from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MPTTColumn, - TagColumn, ToggleColumn, UtilizationColumn, + BaseTable, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, TagColumn, + ToggleColumn, UtilizationColumn, ) -from .template_code import LOCATION_ELEVATIONS __all__ = ( 'RackTable', 'RackDetailTable', - 'LocationTable', 'RackReservationTable', 'RackRoleTable', ) -# -# Locations -# - -class LocationTable(BaseTable): - pk = ToggleColumn() - name = MPTTColumn( - linkify=True - ) - site = tables.Column( - linkify=True - ) - rack_count = tables.Column( - verbose_name='Racks' - ) - actions = ButtonsColumn( - model=Location, - prepend_template=LOCATION_ELEVATIONS - ) - - class Meta(BaseTable.Meta): - model = Location - fields = ('pk', 'name', 'site', 'rack_count', 'description', 'slug', 'actions') - default_columns = ('pk', 'name', 'site', 'rack_count', 'description', 'actions') - - # # Rack roles # diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 288fa5753..b7d46eba5 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -1,12 +1,14 @@ import django_tables2 as tables -from dcim.models import Region, Site, SiteGroup +from dcim.models import Location, Region, Site, SiteGroup from tenancy.tables import TenantColumn from utilities.tables import ( BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn, ) +from .template_code import LOCATION_ELEVATIONS __all__ = ( + 'LocationTable', 'RegionTable', 'SiteTable', 'SiteGroupTable', @@ -86,3 +88,32 @@ class SiteTable(BaseTable): 'contact_email', 'tags', ) default_columns = ('pk', 'name', 'status', 'facility', 'region', 'group', 'tenant', 'asn', 'description') + + +# +# Locations +# + +class LocationTable(BaseTable): + pk = ToggleColumn() + name = MPTTColumn( + linkify=True + ) + site = tables.Column( + linkify=True + ) + rack_count = tables.Column( + verbose_name='Racks' + ) + device_count = tables.Column( + verbose_name='Devices' + ) + actions = ButtonsColumn( + model=Location, + prepend_template=LOCATION_ELEVATIONS + ) + + class Meta(BaseTable.Meta): + model = Location + fields = ('pk', 'name', 'site', 'rack_count', 'device_count', 'description', 'slug', 'actions') + default_columns = ('pk', 'name', 'site', 'rack_count', 'device_count', 'description', 'actions') diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index d892c0823..467382a7b 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -338,12 +338,18 @@ class SiteBulkDeleteView(generic.BulkDeleteView): # -# Rack groups +# Locations # class LocationListView(generic.ObjectListView): queryset = Location.objects.add_related_count( - Location.objects.all(), + Location.objects.add_related_count( + Location.objects.all(), + Device, + 'location', + 'device_count', + cumulative=True + ), Rack, 'location', 'rack_count',