adds db annotation to calculate utilization

This commit is contained in:
Abhimanyu Saharan 2023-05-13 03:23:26 +05:30
parent dfb9235822
commit d6fda266d4
6 changed files with 22 additions and 26 deletions

View File

@ -218,7 +218,7 @@ class VLANGroupSerializer(NetBoxModelSerializer):
scope_id = serializers.IntegerField(allow_null=True, required=False, default=None)
scope = serializers.SerializerMethodField(read_only=True)
vlan_count = serializers.IntegerField(read_only=True)
utilization = serializers.CharField(source='get_utilization', read_only=True)
utilization = serializers.CharField(read_only=True)
class Meta:
model = VLANGroup

View File

@ -1,5 +1,6 @@
from django.core.exceptions import ObjectDoesNotExist, PermissionDenied
from django.db import transaction
from django.db.models import F
from django.shortcuts import get_object_or_404
from django_pglocks import advisory_lock
from drf_spectacular.utils import extend_schema
@ -146,7 +147,8 @@ class FHRPGroupAssignmentViewSet(NetBoxModelViewSet):
class VLANGroupViewSet(NetBoxModelViewSet):
queryset = VLANGroup.objects.annotate(
vlan_count=count_related(VLAN, 'group')
vlan_count=count_related(VLAN, 'group'),
utilization=count_related(VLAN, 'group') / (F('max_vid') - F('min_vid') + 1.0) * 100
).prefetch_related('tags')
serializer_class = serializers.VLANGroupSerializer
filterset_class = filtersets.VLANGroupFilterSet

View File

@ -114,15 +114,6 @@ class VLANGroup(OrganizationalModel):
return available_vids[0]
return None
def get_utilization(self):
"""
Return the percentage of utilization for this vlan group.
"""
assigned_vlan = VLAN.objects.filter(group=self.id).count()
if assigned_vlan != 0:
return round(assigned_vlan / (self.max_vid - self.min_vid + 1) * 100, 2)
return 0.0
class VLAN(PrimaryModel):
"""

View File

@ -70,7 +70,7 @@ class VLANGroupTable(NetBoxTable):
url_params={'group_id': 'pk'},
verbose_name='VLANs'
)
get_utilization = columns.UtilizationColumn(
utilization = columns.UtilizationColumn(
orderable=False,
verbose_name='Utilization'
)
@ -85,9 +85,9 @@ class VLANGroupTable(NetBoxTable):
model = VLANGroup
fields = (
'pk', 'id', 'name', 'scope_type', 'scope', 'min_vid', 'max_vid', 'vlan_count', 'slug', 'description',
'tags', 'created', 'last_updated', 'actions', 'get_utilization',
'tags', 'created', 'last_updated', 'actions', 'utilization',
)
default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'get_utilization', 'description')
default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'utilization', 'description')
#

View File

@ -1,5 +1,5 @@
from django.contrib.contenttypes.models import ContentType
from django.db.models import Prefetch
from django.db.models import F, Prefetch
from django.db.models.expressions import RawSQL
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
@ -877,8 +877,9 @@ class IPAddressBulkDeleteView(generic.BulkDeleteView):
class VLANGroupListView(generic.ObjectListView):
queryset = VLANGroup.objects.annotate(
vlan_count=count_related(VLAN, 'group')
)
vlan_count=count_related(VLAN, 'group'),
utilization=count_related(VLAN, 'group') / (F('max_vid') - F('min_vid') + 1.0) * 100
).prefetch_related('tags')
filterset = filtersets.VLANGroupFilterSet
filterset_form = forms.VLANGroupFilterForm
table = tables.VLANGroupTable
@ -886,7 +887,9 @@ class VLANGroupListView(generic.ObjectListView):
@register_model_view(VLANGroup)
class VLANGroupView(generic.ObjectView):
queryset = VLANGroup.objects.all()
queryset = VLANGroup.objects.annotate(
utilization=count_related(VLAN, 'group') / (F('max_vid') - F('min_vid') + 1.0) * 100
).prefetch_related('tags')
def get_extra_context(self, request, instance):
related_models = (
@ -929,8 +932,9 @@ class VLANGroupBulkImportView(generic.BulkImportView):
class VLANGroupBulkEditView(generic.BulkEditView):
queryset = VLANGroup.objects.annotate(
vlan_count=count_related(VLAN, 'group')
)
vlan_count=count_related(VLAN, 'group'),
utilization=count_related(VLAN, 'group') / (F('max_vid') - F('min_vid') + 1.0) * 100
).prefetch_related('tags')
filterset = filtersets.VLANGroupFilterSet
table = tables.VLANGroupTable
form = forms.VLANGroupBulkEditForm
@ -938,8 +942,9 @@ class VLANGroupBulkEditView(generic.BulkEditView):
class VLANGroupBulkDeleteView(generic.BulkDeleteView):
queryset = VLANGroup.objects.annotate(
vlan_count=count_related(VLAN, 'group')
)
vlan_count=count_related(VLAN, 'group'),
utilization=count_related(VLAN, 'group') / (F('max_vid') - F('min_vid') + 1.0) * 100
).prefetch_related('tags')
filterset = filtersets.VLANGroupFilterSet
table = tables.VLANGroupTable

View File

@ -43,10 +43,8 @@
<td>{{ object.min_vid }} - {{ object.max_vid }}</td>
</tr>
<tr>
<th scope="row">VLANs</th>
<td>
<a href="{% url 'ipam:vlan_list' %}?group_id={{ object.pk }}">{{ vlans_count }}</a>
</td>
<th scope="row">Utilization</th>
<td>{% utilization_graph object.utilization %}</td>
</tr>
</table>
</div>