diff --git a/apps/counter/api/views.py b/apps/counter/api/views.py index 19bedd9..7fb8a4b 100644 --- a/apps/counter/api/views.py +++ b/apps/counter/api/views.py @@ -1,5 +1,6 @@ +import re import pytz -from datetime import datetime, time +from datetime import datetime, time, timedelta from django.db.models import Sum, Max from django.core.cache import cache from rest_framework.generics import ( @@ -27,6 +28,7 @@ from .serializers import ( from ..mixins.role import RoleMixin, DeviceListMixin from ..models import DeviceCount, DeviceInfo from mosquito.models import MosqPostStatistic, DevicePostStatistic +from mosquito.models import DeviceInfo as CelexDeviceInfo class DeviceLogListAPIView(ListAPIView, RoleMixin, DeviceListMixin): @@ -38,14 +40,32 @@ class DeviceLogListAPIView(ListAPIView, RoleMixin, DeviceListMixin): def get_queryset(self, *args, **kwargs): user_roles = self.get_role() + device = self.request.GET.get('device') + start = self.request.GET.get('start') + end = self.request.GET.get('end') queryset = DeviceCount.objects.get_queryset().order_by('-data_time') if 'staff' in user_roles or 'manager' in user_roles: device_list = self.get_device_list() device_ids = [query.device_id for query in device_list if query.org == self.request.user.org] queryset = queryset.filter(device_id__in=device_ids) - device_id = self.request.GET.get('device_id') - if device_id: - queryset = queryset.filter(device_id__icontains=device_id) + if device: + # device_id or device_name + qs = queryset.filter(device_id__icontains=device) + if qs.count() > 0: + queryset = qs + else: + qs = CelexDeviceInfo.objects.filter(device_name__contains=device) + device_ids = [device.device_id for device in qs] + queryset = queryset.filter(device_id__in=device_ids) + if start and end: + t_pattern = re.compile(r'^2\d{3}-\d{1,2}-\d{1,2}$') + start_m = t_pattern.match(start) + end_m = t_pattern.match(end) + if not start_m or not end_m: + return Response({'detail': 'start or end must be format "yyyy-mm-dd"'}) + start = datetime.strptime(start, '%Y-%m-%d') + end = datetime.strptime(end, '%Y-%m-%d') + queryset = queryset.filter(data_time__gte=start, data_time__lt=end + timedelta(days=1)) return queryset