1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Fixes: #5450 - Added Coalesce to viewsets for the _count functions

This commit is contained in:
Daniel Sheppard
2020-12-15 12:50:28 -06:00
committed by GitHub
parent 67f9e16905
commit 3c2b2f26b9
8 changed files with 49 additions and 41 deletions

View File

@@ -3,6 +3,7 @@ from collections import OrderedDict
from django.conf import settings
from django.db.models import F
from django.db.models.functions import Coalesce
from django.http import HttpResponseForbidden, HttpResponse
from django.shortcuts import get_object_or_404
from drf_yasg import openapi
@@ -119,12 +120,12 @@ class SiteViewSet(CustomFieldModelViewSet):
queryset = Site.objects.prefetch_related(
'region', 'tenant', 'tags'
).annotate(
device_count=get_subquery(Device, 'site'),
rack_count=get_subquery(Rack, 'site'),
prefix_count=get_subquery(Prefix, 'site'),
vlan_count=get_subquery(VLAN, 'site'),
circuit_count=get_subquery(Circuit, 'terminations__site'),
virtualmachine_count=get_subquery(VirtualMachine, 'cluster__site'),
device_count=Coalesce(get_subquery(Device, 'site'), 0),
rack_count=Coalesce(get_subquery(Rack, 'site'), 0),
prefix_count=Coalesce(get_subquery(Prefix, 'site'), 0),
vlan_count=Coalesce(get_subquery(VLAN, 'site'), 0),
circuit_count=Coalesce(get_subquery(Circuit, 'terminations__site'), 0),
virtualmachine_count=Coalesce(get_subquery(VirtualMachine, 'cluster__site'), 0),
)
serializer_class = serializers.SiteSerializer
filterset_class = filters.SiteFilterSet
@@ -152,7 +153,7 @@ class RackGroupViewSet(ModelViewSet):
class RackRoleViewSet(ModelViewSet):
queryset = RackRole.objects.annotate(
rack_count=get_subquery(Rack, 'role')
rack_count=Coalesce(get_subquery(Rack, 'role'), 0)
)
serializer_class = serializers.RackRoleSerializer
filterset_class = filters.RackRoleFilterSet
@@ -166,8 +167,8 @@ class RackViewSet(CustomFieldModelViewSet):
queryset = Rack.objects.prefetch_related(
'site', 'group__site', 'role', 'tenant', 'tags'
).annotate(
device_count=get_subquery(Device, 'rack'),
powerfeed_count=get_subquery(PowerFeed, 'rack')
device_count=Coalesce(get_subquery(Device, 'rack'), 0),
powerfeed_count=Coalesce(get_subquery(PowerFeed, 'rack'), 0)
)
serializer_class = serializers.RackSerializer
filterset_class = filters.RackFilterSet
@@ -240,9 +241,9 @@ class RackReservationViewSet(ModelViewSet):
class ManufacturerViewSet(ModelViewSet):
queryset = Manufacturer.objects.annotate(
devicetype_count=get_subquery(DeviceType, 'manufacturer'),
inventoryitem_count=get_subquery(InventoryItem, 'manufacturer'),
platform_count=get_subquery(Platform, 'manufacturer')
devicetype_count=Coalesce(get_subquery(DeviceType, 'manufacturer'), 0),
inventoryitem_count=Coalesce(get_subquery(InventoryItem, 'manufacturer'), 0),
platform_count=Coalesce(get_subquery(Platform, 'manufacturer'), 0)
)
serializer_class = serializers.ManufacturerSerializer
filterset_class = filters.ManufacturerFilterSet
@@ -254,7 +255,7 @@ class ManufacturerViewSet(ModelViewSet):
class DeviceTypeViewSet(CustomFieldModelViewSet):
queryset = DeviceType.objects.prefetch_related('manufacturer', 'tags').annotate(
device_count=get_subquery(Device, 'device_type')
device_count=Coalesce(get_subquery(Device, 'device_type'), 0)
)
serializer_class = serializers.DeviceTypeSerializer
filterset_class = filters.DeviceTypeFilterSet
@@ -318,8 +319,8 @@ class DeviceBayTemplateViewSet(ModelViewSet):
class DeviceRoleViewSet(ModelViewSet):
queryset = DeviceRole.objects.annotate(
device_count=get_subquery(Device, 'device_role'),
virtualmachine_count=get_subquery(VirtualMachine, 'role')
device_count=Coalesce(get_subquery(Device, 'device_role'), 0),
virtualmachine_count=Coalesce(get_subquery(VirtualMachine, 'role'), 0)
)
serializer_class = serializers.DeviceRoleSerializer
filterset_class = filters.DeviceRoleFilterSet
@@ -331,8 +332,8 @@ class DeviceRoleViewSet(ModelViewSet):
class PlatformViewSet(ModelViewSet):
queryset = Platform.objects.annotate(
device_count=get_subquery(Device, 'platform'),
virtualmachine_count=get_subquery(VirtualMachine, 'platform')
device_count=Coalesce(get_subquery(Device, 'platform'), 0),
virtualmachine_count=Coalesce(get_subquery(VirtualMachine, 'platform'), 0)
)
serializer_class = serializers.PlatformSerializer
filterset_class = filters.PlatformFilterSet
@@ -596,7 +597,7 @@ class CableViewSet(ModelViewSet):
class VirtualChassisViewSet(ModelViewSet):
queryset = VirtualChassis.objects.prefetch_related('tags').annotate(
member_count=get_subquery(Device, 'virtual_chassis')
member_count=Coalesce(get_subquery(Device, 'virtual_chassis'), 0)
)
serializer_class = serializers.VirtualChassisSerializer
filterset_class = filters.VirtualChassisFilterSet
@@ -610,7 +611,7 @@ class PowerPanelViewSet(ModelViewSet):
queryset = PowerPanel.objects.prefetch_related(
'site', 'rack_group'
).annotate(
powerfeed_count=get_subquery(PowerFeed, 'power_panel')
powerfeed_count=Coalesce(get_subquery(PowerFeed, 'power_panel'), 0)
)
serializer_class = serializers.PowerPanelSerializer
filterset_class = filters.PowerPanelFilterSet