From 41af9c890007693106c7f6637a3f61b9fe24925e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 31 Oct 2016 16:44:00 -0400 Subject: [PATCH] Fixes #660: Correct calculation of utilized space for rack list display --- netbox/dcim/models.py | 6 ++---- netbox/dcim/tables.py | 9 ++++----- netbox/dcim/views.py | 6 ++---- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index 99640bfbb..b20f22940 100644 --- a/netbox/dcim/models.py +++ b/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) diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 3576729b4..6c138b446 100644 --- a/netbox/dcim/tables.py +++ b/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): diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index c08f9147b..7f4bbeade 100644 --- a/netbox/dcim/views.py +++ b/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