Browse Source

Potential fix for #419: Ditch annotation in favor of discrete queries to gather Tenant stats

Jeremy Stretch 8 years ago
parent
commit
72690bfd0a
2 changed files with 23 additions and 18 deletions
  1. 8 8
      netbox/templates/tenancy/tenant.html
  2. 15 10
      netbox/tenancy/views.py

+ 8 - 8
netbox/templates/tenancy/tenant.html

@@ -93,35 +93,35 @@
             </div>
             <div class="row panel-body">
                 <div class="col-md-4 text-center">
-                    <h2><a href="{% url 'dcim:site_list' %}?tenant={{ tenant.slug }}" class="btn {% if tenant.site_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ tenant.site_count }}</a></h2>
+                    <h2><a href="{% url 'dcim:site_list' %}?tenant={{ tenant.slug }}" class="btn {% if stats.site_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ stats.site_count }}</a></h2>
                     <p>Sites</p>
                 </div>
                 <div class="col-md-4 text-center">
-                    <h2><a href="{% url 'dcim:rack_list' %}?tenant={{ tenant.slug }}" class="btn {% if tenant.rack_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ tenant.rack_count }}</a></h2>
+                    <h2><a href="{% url 'dcim:rack_list' %}?tenant={{ tenant.slug }}" class="btn {% if stats.rack_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ stats.rack_count }}</a></h2>
                     <p>Racks</p>
                 </div>
                 <div class="col-md-4 text-center">
-                    <h2><a href="{% url 'dcim:device_list' %}?tenant={{ tenant.slug }}" class="btn {% if tenant.device_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ tenant.device_count }}</a></h2>
+                    <h2><a href="{% url 'dcim:device_list' %}?tenant={{ tenant.slug }}" class="btn {% if stats.device_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ stats.device_count }}</a></h2>
                     <p>Devices</p>
                 </div>
                 <div class="col-md-4 text-center">
-                    <h2><a href="{% url 'ipam:vrf_list' %}?tenant={{ tenant.slug }}" class="btn {% if tenant.vrf_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ tenant.vrf_count }}</a></h2>
+                    <h2><a href="{% url 'ipam:vrf_list' %}?tenant={{ tenant.slug }}" class="btn {% if stats.vrf_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ stats.vrf_count }}</a></h2>
                     <p>VRFs</p>
                 </div>
                 <div class="col-md-4 text-center">
-                    <h2><a href="{% url 'ipam:prefix_list' %}?tenant={{ tenant.slug }}" class="btn {% if tenant.prefix_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ tenant.prefix_count }}</a></h2>
+                    <h2><a href="{% url 'ipam:prefix_list' %}?tenant={{ tenant.slug }}" class="btn {% if stats.prefix_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ stats.prefix_count }}</a></h2>
                     <p>Prefixes</p>
                 </div>
                 <div class="col-md-4 text-center">
-                    <h2><a href="{% url 'ipam:ipaddress_list' %}?tenant={{ tenant.slug }}" class="btn {% if tenant.ipaddress_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ tenant.ipaddress_count }}</a></h2>
+                    <h2><a href="{% url 'ipam:ipaddress_list' %}?tenant={{ tenant.slug }}" class="btn {% if stats.ipaddress_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ stats.ipaddress_count }}</a></h2>
                     <p>IP addresses</p>
                 </div>
                 <div class="col-md-4 text-center">
-                    <h2><a href="{% url 'ipam:vlan_list' %}?tenant={{ tenant.slug }}" class="btn {% if tenant.vlan_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ tenant.vlan_count }}</a></h2>
+                    <h2><a href="{% url 'ipam:vlan_list' %}?tenant={{ tenant.slug }}" class="btn {% if stats.vlan_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ stats.vlan_count }}</a></h2>
                     <p>VLANs</p>
                 </div>
                 <div class="col-md-4 text-center">
-                    <h2><a href="{% url 'circuits:circuit_list' %}?tenant={{ tenant.slug }}" class="btn {% if tenant.circuit_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ tenant.circuit_count }}</a></h2>
+                    <h2><a href="{% url 'circuits:circuit_list' %}?tenant={{ tenant.slug }}" class="btn {% if stats.circuit_count %}btn-primary{% else %}btn-default{% endif %} btn-lg">{{ stats.circuit_count }}</a></h2>
                     <p>Circuits</p>
                 </div>
             </div>

+ 15 - 10
netbox/tenancy/views.py

@@ -2,6 +2,9 @@ from django.contrib.auth.mixins import PermissionRequiredMixin
 from django.db.models import Count
 from django.shortcuts import get_object_or_404, render
 
+from circuits.models import Circuit
+from dcim.models import Site, Rack, Device
+from ipam.models import IPAddress, Prefix, VLAN, VRF
 from utilities.views import (
     BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
 )
@@ -50,19 +53,21 @@ class TenantListView(ObjectListView):
 
 def tenant(request, slug):
 
-    tenant = get_object_or_404(Tenant.objects.annotate(
-        site_count=Count('sites', distinct=True),
-        rack_count=Count('racks', distinct=True),
-        device_count=Count('devices', distinct=True),
-        vrf_count=Count('vrfs', distinct=True),
-        prefix_count=Count('prefixes', distinct=True),
-        ipaddress_count=Count('ip_addresses', distinct=True),
-        vlan_count=Count('vlans', distinct=True),
-        circuit_count=Count('circuits', distinct=True),
-    ), slug=slug)
+    tenant = get_object_or_404(Tenant, slug=slug)
+    stats = {
+        'site_count': Site.objects.filter(tenant=tenant).count(),
+        'rack_count': Rack.objects.filter(tenant=tenant).count(),
+        'device_count': Device.objects.filter(tenant=tenant).count(),
+        'vrf_count': VRF.objects.filter(tenant=tenant).count(),
+        'prefix_count': Prefix.objects.filter(tenant=tenant).count(),
+        'ipaddress_count': IPAddress.objects.filter(tenant=tenant).count(),
+        'vlan_count': VLAN.objects.filter(tenant=tenant).count(),
+        'circuit_count': Circuit.objects.filter(tenant=tenant).count(),
+    }
 
     return render(request, 'tenancy/tenant.html', {
         'tenant': tenant,
+        'stats': stats,
     })