diff --git a/apps/counter/api/serializers.py b/apps/counter/api/serializers.py index fe725fa..0acdbda 100644 --- a/apps/counter/api/serializers.py +++ b/apps/counter/api/serializers.py @@ -68,3 +68,40 @@ 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 77fb69d..73dbf23 100644 --- a/apps/counter/api/urls.py +++ b/apps/counter/api/urls.py @@ -1,9 +1,14 @@ from django.urls import path -from .views import DeviceLogListAPIView, DeviceInfoListAPIView +from .views import ( + DeviceLogListAPIView, + DeviceInfoListAPIView, + DeviceLogStatisticAPIView, +) app_name = 'counter-api' urlpatterns = [ path('logs/', DeviceLogListAPIView.as_view(), name='logs'), path('device/', DeviceInfoListAPIView.as_view(), name='device'), + path('logs/statistic', DeviceLogStatisticAPIView.as_view(), name='logs-statistic'), ] \ No newline at end of file diff --git a/apps/counter/api/views.py b/apps/counter/api/views.py index 03d4385..d2eb58b 100644 --- a/apps/counter/api/views.py +++ b/apps/counter/api/views.py @@ -4,11 +4,17 @@ from rest_framework.generics import ( CreateAPIView ) from rest_framework.views import APIView +from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from rest_framework.filters import SearchFilter, OrderingFilter from mosquito.api.pagination import PostLimitOffsetPagination, PostPageNumberPagination -from .serializers import DeviceCountSerializer, DeviceInfoSerializer +from .serializers import ( + DeviceCountSerializer, + DeviceInfoSerializer, + DeviceLogStatisticSerializer, + DeviceInfoStatisticSerializer +) from ..models import DeviceCount, DeviceInfo @@ -30,5 +36,10 @@ class DeviceInfoListAPIView(ListAPIView): queryset = DeviceInfo.objects.all() -# class DeviceLogStatisticAPIView(APIView): -# pass \ No newline at end of file +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