mirror of https://github.com/jumpserver/jumpserver
perf: asset api
parent
d11422957a
commit
a3b0439be5
|
@ -0,0 +1 @@
|
||||||
|
from .asset import *
|
|
@ -0,0 +1,81 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
|
||||||
|
from django.db.models import Count, Q, F
|
||||||
|
from django.http import JsonResponse
|
||||||
|
from django.utils import timezone
|
||||||
|
from rest_framework.views import APIView
|
||||||
|
|
||||||
|
from assets.const import AllTypes, Connectivity, Category
|
||||||
|
from assets.models import Asset
|
||||||
|
from common.permissions import IsValidLicense
|
||||||
|
from common.utils import lazyproperty
|
||||||
|
from rbac.permissions import RBACPermission
|
||||||
|
|
||||||
|
__all__ = ['AssetStatisticApi']
|
||||||
|
|
||||||
|
|
||||||
|
class AssetStatisticApi(APIView):
|
||||||
|
http_method_names = ['get']
|
||||||
|
# TODO: Define the required RBAC permissions for this API
|
||||||
|
rbac_perms = {
|
||||||
|
'GET': 'assets.view_asset',
|
||||||
|
}
|
||||||
|
permission_classes = [RBACPermission, IsValidLicense]
|
||||||
|
|
||||||
|
@lazyproperty
|
||||||
|
def base_qs(self):
|
||||||
|
return Asset.objects.only(
|
||||||
|
'id', 'platform', 'zone', 'connectivity', 'created_time'
|
||||||
|
)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _group_stats(queryset, alias, key, label_map=None):
|
||||||
|
grouped = (
|
||||||
|
queryset
|
||||||
|
.values(**{alias: F(key)})
|
||||||
|
.annotate(total=Count('id'))
|
||||||
|
)
|
||||||
|
|
||||||
|
data = [
|
||||||
|
{
|
||||||
|
alias: val,
|
||||||
|
'total': cnt,
|
||||||
|
**({'label': label_map.get(val, val)} if label_map else {})
|
||||||
|
}
|
||||||
|
for val, cnt in grouped.values_list(alias, 'total')
|
||||||
|
]
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
def get(self, request, *args, **kwargs):
|
||||||
|
qs = self.base_qs
|
||||||
|
|
||||||
|
stats = qs.aggregate(
|
||||||
|
total=Count('id'),
|
||||||
|
active=Count('id', filter=Q(is_active=True)),
|
||||||
|
connected=Count('id', filter=Q(connectivity=Connectivity.OK)),
|
||||||
|
)
|
||||||
|
|
||||||
|
by_type = self._group_stats(
|
||||||
|
qs, 'type', 'platform__type', dict(AllTypes.choices()),
|
||||||
|
)
|
||||||
|
|
||||||
|
by_category = self._group_stats(
|
||||||
|
qs, 'category', 'platform__category', dict(Category.choices())
|
||||||
|
)
|
||||||
|
|
||||||
|
by_zone = self._group_stats(
|
||||||
|
qs, 'zone', 'zone__name'
|
||||||
|
)
|
||||||
|
|
||||||
|
week_start = timezone.now() + timezone.timedelta(days=7)
|
||||||
|
assets_added_this_week = qs.filter(date_created__gte=week_start).count()
|
||||||
|
payload = {
|
||||||
|
**stats,
|
||||||
|
'assets_by_platform_type': by_type,
|
||||||
|
'assets_by_category': by_category,
|
||||||
|
'assets_by_zone': by_zone,
|
||||||
|
'assets_added_this_week': assets_added_this_week,
|
||||||
|
}
|
||||||
|
return JsonResponse(payload, status=200)
|
Loading…
Reference in New Issue