diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index df7985d82..8cce25e95 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -134,12 +134,13 @@ class LocationSerializer(NestedGroupModelSerializer): site = NestedSiteSerializer() parent = NestedLocationSerializer(required=False, allow_null=True) rack_count = serializers.IntegerField(read_only=True) + device_count = serializers.IntegerField(read_only=True) class Meta: model = Location fields = [ 'id', 'url', 'display', 'name', 'slug', 'site', 'parent', 'description', 'custom_fields', 'created', - 'last_updated', 'rack_count', '_depth', + 'last_updated', 'rack_count', 'device_count', '_depth', ] diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 6aa4fd484..25d52f8a9 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -146,7 +146,13 @@ class SiteViewSet(CustomFieldModelViewSet): class LocationViewSet(CustomFieldModelViewSet): 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', @@ -174,7 +180,7 @@ class RackRoleViewSet(CustomFieldModelViewSet): class RackViewSet(CustomFieldModelViewSet): queryset = Rack.objects.prefetch_related( - 'site', 'location__site', 'role', 'tenant', 'tags' + 'site', 'location', 'role', 'tenant', 'tags' ).annotate( device_count=count_related(Device, 'rack'), powerfeed_count=count_related(PowerFeed, 'rack') diff --git a/netbox/dcim/models/sites.py b/netbox/dcim/models/sites.py index 3f2c209c3..ce9f7b4f8 100644 --- a/netbox/dcim/models/sites.py +++ b/netbox/dcim/models/sites.py @@ -315,6 +315,7 @@ class Location(NestedGroupModel): ) csv_headers = ['site', 'parent', 'name', 'slug', 'description'] + clone_fields = ['site', 'parent', 'description'] class Meta: ordering = ['site', 'name'] diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 171d0702e..728888e5a 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -272,6 +272,13 @@ class SiteView(generic.ObjectView): 'location', 'rack_count', cumulative=True + ) + locations = Location.objects.add_related_count( + locations, + Device, + 'location', + 'device_count', + cumulative=True ).restrict(request.user, 'view').filter(site=instance) return { diff --git a/netbox/templates/dcim/location.html b/netbox/templates/dcim/location.html index c12c9f533..8fc465a6b 100644 --- a/netbox/templates/dcim/location.html +++ b/netbox/templates/dcim/location.html @@ -26,6 +26,10 @@ Description {{ object.description|placeholder }} + + Site + {{ object.site }} + Parent diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index b68fc1f02..e0c707a49 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -210,12 +210,22 @@ Locations + + + + + + {% for location in locations %} + + - {% endfor %} - - - - -
LocationRacksDevices
- {{ location }} + {{ location }} + + {{ location.rack_count }} + {{ location.device_count }} {{ location.rack_count }} @@ -223,15 +233,6 @@
All racks{{ stats.rack_count }} - - - -