import pytz from rest_framework.generics import ( ListAPIView, RetrieveAPIView, CreateAPIView ) from django.utils.timezone import timedelta, datetime from rest_framework import filters from rest_framework.pagination import PageNumberPagination from django_filters.rest_framework import DjangoFilterBackend from rest_framework.permissions import IsAuthenticated from rest_framework.filters import SearchFilter, OrderingFilter from django.db.models import Q from counter.mixins.role import RoleMixin, DeviceListMixin from ..models import Mosquito, MosqPost, DeviceTempLog from .pagination import PostLimitOffsetPagination, PostPageNumberPagination from .serializers import ( MosqListSerializer, MosqPostListSerializer, DeviceTempLogSerializer, ) class DeviceLogPagination(PageNumberPagination): page_size = 10 page_size_query_param = 'limit' page_query_param = 'page' max_page_size = 1000 class MosquitoListAPIView(ListAPIView): serializer_class = MosqListSerializer permission_classes = [IsAuthenticated] filter_backends = [SearchFilter, OrderingFilter] pagination_class = PostLimitOffsetPagination search_fields = ['name', 'device_id', 'region'] def get_queryset(self, *args, **kwargs): queryset_list = Mosquito.objects.all() query = self.request.GET.get('q') if query: queryset_list = queryset_list.filter( Q(name__icontains=query) | Q(device_id__icontains=query) | Q(region__icontains=query) ).distinct() return queryset_list class MosquitoPostListAPIView(ListAPIView): serializer_class = MosqPostListSerializer permission_classes = [IsAuthenticated, ] filter_backends = [SearchFilter, OrderingFilter] pagination_class = PostLimitOffsetPagination search_fields = ['mosq__name', 'mosq__region'] def get_queryset(self, *args, **kwargs): queryset_list = MosqPost.objects.all() query = self.request.GET.get('q') if query: queryset_list = queryset_list.filter( Q(mosq__name__contains=query) | Q(mosq__region=query) ).distinct() return queryset_list class DeviceTempLogListAPIView(ListAPIView, RoleMixin, DeviceListMixin): serializer_class = DeviceTempLogSerializer permission_classes = [IsAuthenticated] filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter) pagination_class = DeviceLogPagination search_fields = ['device_id'] filterset_fields = ['device_id'] ordering_fields = ['-last_time'] def get_queryset(self, *args, **kwargs): user_roles = self.get_role() queryset = DeviceTempLog.objects.get_queryset().order_by('-create_time') if 'staff' in user_roles or 'admin' 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) last_day = self.request.GET.get('last_day') if last_day == '1': t = datetime.now().replace(tzinfo=pytz.timezone('UTC')) - timedelta(days=1) queryset = queryset.filter(last_time__gte=t).filter(last_time__minute=0) return queryset