From 5caa3442e98362421bc5df763d439f9778cec29d Mon Sep 17 00:00:00 2001 From: xianfuxing Date: Thu, 9 Aug 2018 14:12:23 +0800 Subject: [PATCH] =?UTF-8?q?#=20=E5=AE=8C=E5=96=84=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/counter/api/serializers.py | 40 ++------------------------------- apps/counter/api/urls.py | 2 ++ apps/counter/api/views.py | 26 ++++++++++++++++----- 3 files changed, 25 insertions(+), 43 deletions(-) diff --git a/apps/counter/api/serializers.py b/apps/counter/api/serializers.py index 0acdbda..bb47364 100644 --- a/apps/counter/api/serializers.py +++ b/apps/counter/api/serializers.py @@ -1,4 +1,5 @@ -from django.utils import timezone +import pytz +from datetime import datetime, time from django.db.models import Sum from rest_framework import serializers from counter.models import DeviceCount, DeviceInfo @@ -68,40 +69,3 @@ class DeviceInfoSerializer(serializers.ModelSerializer): if obj.last_offline_time: return obj.last_offline_time.strftime('%Y-%m-%d %H:%M:%S') return None - - -class DeviceLogStatisticSerializer(serializers.ModelSerializer): - total_count = serializers.SerializerMethodField() - daily_count = serializers.SerializerMethodField() - - class Meta: - model = DeviceCount - fields = [ - 'total_count', - 'daily_count', - ] - - def get_total_count(self, obj): - return obj.objects.aggregate(total=Sum('count'))['total'] - - def get_daily_count(self, obj): - today = timezone.datetime.now().date() - return obj.objects.filter(data_time__gt=today).aggregate(total=Sum('count'))['total'] - - -class DeviceInfoStatisticSerializer(serializers.ModelSerializer): - online_count = serializers.SerializerMethodField() - offline_count = serializers.SerializerMethodField() - - class Meta: - model = DeviceInfo - fields = [ - 'online_count', - 'offline_count' - ] - - def get_online_count(self, obj): - return obj.objects.filter(online=1).count()['total'] - - def get_offline_count(self, obj): - return obj.objects.filter(online=0).count()['total'] diff --git a/apps/counter/api/urls.py b/apps/counter/api/urls.py index 73dbf23..c385839 100644 --- a/apps/counter/api/urls.py +++ b/apps/counter/api/urls.py @@ -3,6 +3,7 @@ from .views import ( DeviceLogListAPIView, DeviceInfoListAPIView, DeviceLogStatisticAPIView, + DeviceInfoStatisticAPIView ) @@ -11,4 +12,5 @@ urlpatterns = [ path('logs/', DeviceLogListAPIView.as_view(), name='logs'), path('device/', DeviceInfoListAPIView.as_view(), name='device'), path('logs/statistic', DeviceLogStatisticAPIView.as_view(), name='logs-statistic'), + path('device/statistic', DeviceInfoStatisticAPIView.as_view(), name='device-statistic'), ] \ No newline at end of file diff --git a/apps/counter/api/views.py b/apps/counter/api/views.py index d2eb58b..89d06f4 100644 --- a/apps/counter/api/views.py +++ b/apps/counter/api/views.py @@ -1,3 +1,6 @@ +import pytz +from datetime import datetime, time +from django.db.models import Sum from rest_framework.generics import ( ListAPIView, RetrieveAPIView, @@ -12,8 +15,6 @@ from mosquito.api.pagination import PostLimitOffsetPagination, PostPageNumberPag from .serializers import ( DeviceCountSerializer, DeviceInfoSerializer, - DeviceLogStatisticSerializer, - DeviceInfoStatisticSerializer ) from ..models import DeviceCount, DeviceInfo @@ -37,9 +38,24 @@ class DeviceInfoListAPIView(ListAPIView): class DeviceLogStatisticAPIView(APIView): - serializer_class = DeviceLogStatisticSerializer permission_classes = [IsAuthenticated] def get(self, request, *args, **kwargs): - serializer = self.serializer_class(DeviceCount) - return Response(serializer.data) \ No newline at end of file + tz = pytz.timezone("UTC") + today = datetime.now(tz).date() + midnight = tz.localize(datetime.combine(today, time(0, 0)), is_dst=None) + total_count = DeviceCount.objects.aggregate(total=Sum('count'))['total'] + daily_count = DeviceCount.objects.filter( + data_time__gt=midnight).aggregate(total=Sum('count'))['total'] + data = {'total_count': total_count, 'daily_count': daily_count} + return Response(data) + + +class DeviceInfoStatisticAPIView(APIView): + permission_classes = [IsAuthenticated] + + def get(self, request, *args, **kwargs): + online_count = DeviceInfo.objects.filter(online=1).count() + offline_count = DeviceInfo.objects.filter(online=0).count() + data = {'online_count': online_count, 'offline_count': offline_count} + return Response(data)