Browse Source

Fixes #660: Correct calculation of utilized space for rack list display

Jeremy Stretch 8 years ago
parent
commit
41af9c8900
3 changed files with 8 additions and 13 deletions
  1. 2 4
      netbox/dcim/models.py
  2. 4 5
      netbox/dcim/tables.py
  3. 2 4
      netbox/dcim/views.py

+ 2 - 4
netbox/dcim/models.py

@@ -488,7 +488,7 @@ class Rack(CreatedUpdatedModel, CustomFieldModel):
         """
 
         # Gather all devices which consume U space within the rack
-        devices = self.devices.select_related().filter(position__gte=1).exclude(pk__in=exclude)
+        devices = self.devices.select_related('device_type').filter(position__gte=1).exclude(pk__in=exclude)
 
         # Initialize the rack unit skeleton
         units = range(1, self.u_height + 1)
@@ -518,9 +518,7 @@ class Rack(CreatedUpdatedModel, CustomFieldModel):
         """
         Determine the utilization rate of the rack and return it as a percentage.
         """
-        if self.u_consumed is None:
-                self.u_consumed = 0
-        u_available = self.u_height - self.u_consumed
+        u_available = len(self.get_available_units())
         return int(float(self.u_height - u_available) / self.u_height * 100)
 
 

+ 4 - 5
netbox/dcim/tables.py

@@ -72,7 +72,7 @@ STATUS_ICON = """
 
 UTILIZATION_GRAPH = """
 {% load helpers %}
-{% utilization_graph record.get_utilization %}
+{% utilization_graph value %}
 """
 
 
@@ -148,13 +148,12 @@ class RackTable(BaseTable):
     role = tables.TemplateColumn(RACK_ROLE, verbose_name='Role')
     u_height = tables.TemplateColumn("{{ record.u_height }}U", verbose_name='Height')
     devices = tables.Column(accessor=Accessor('device_count'), verbose_name='Devices')
-    u_consumed = tables.TemplateColumn("{{ record.u_consumed|default:'0' }}U", verbose_name='Used')
-    utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
+    get_utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
 
     class Meta(BaseTable.Meta):
         model = Rack
-        fields = ('pk', 'name', 'site', 'group', 'facility_id', 'tenant', 'role', 'u_height', 'devices', 'u_consumed',
-                  'utilization')
+        fields = ('pk', 'name', 'site', 'group', 'facility_id', 'tenant', 'role', 'u_height', 'devices',
+                  'get_utilization')
 
 
 class RackImportTable(BaseTable):

+ 2 - 4
netbox/dcim/views.py

@@ -7,8 +7,7 @@ from django.contrib.auth.decorators import permission_required
 from django.contrib.auth.mixins import PermissionRequiredMixin
 from django.core.exceptions import ValidationError
 from django.core.urlresolvers import reverse
-from django.db.models import Count, Sum
-from django.db.models.functions import Coalesce
+from django.db.models import Count
 from django.http import HttpResponseRedirect
 from django.shortcuts import get_object_or_404, redirect, render
 from django.utils.http import urlencode
@@ -181,8 +180,7 @@ class RackRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 
 class RackListView(ObjectListView):
     queryset = Rack.objects.select_related('site', 'group', 'tenant', 'role').prefetch_related('devices__device_type')\
-        .annotate(device_count=Count('devices', distinct=True),
-                  u_consumed=Coalesce(Sum('devices__device_type__u_height'), 0))
+        .annotate(device_count=Count('devices', distinct=True))
     filter = filters.RackFilter
     filter_form = forms.RackFilterForm
     table = tables.RackTable