diff --git a/apps/mosquito/api/serializers.py b/apps/mosquito/api/serializers.py index 0a5b403..e6834ba 100644 --- a/apps/mosquito/api/serializers.py +++ b/apps/mosquito/api/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from mosquito.models import Mosquito, MosqPost +from mosquito.models import Mosquito, MosqPost, DeviceTempLog from smart.api.serializers import SmartPushListSerializer @@ -32,3 +32,10 @@ class MosqPostListSerializer(serializers.ModelSerializer): def get_region(self, obj): return obj.mosq.region + + +class DeviceTempLogSerializer(serializers.ModelSerializer): + + class Meta: + model = DeviceTempLog + fields = '__all__' diff --git a/apps/mosquito/api/urls.py b/apps/mosquito/api/urls.py index b298350..d94165d 100644 --- a/apps/mosquito/api/urls.py +++ b/apps/mosquito/api/urls.py @@ -1,9 +1,14 @@ from django.urls import path, re_path -from .views import MosquitoListAPIView, MosquitoPostListAPIView +from .views import ( + MosquitoListAPIView, + MosquitoPostListAPIView, + DeviceTempLogListAPIView, +) app_name = 'mosq-api' urlpatterns = [ path('', MosquitoListAPIView.as_view(), name='list'), path('post/', MosquitoPostListAPIView.as_view(), name='post'), + path('temp/', DeviceTempLogListAPIView.as_view(), name='temp-hum'), ] \ No newline at end of file diff --git a/apps/mosquito/api/views.py b/apps/mosquito/api/views.py index cfaf83c..e1401b8 100644 --- a/apps/mosquito/api/views.py +++ b/apps/mosquito/api/views.py @@ -3,13 +3,28 @@ from rest_framework.generics import ( RetrieveAPIView, CreateAPIView ) +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 ..models import Mosquito, MosqPost +from counter.mixins.role import RoleMixin, DeviceListMixin +from ..models import Mosquito, MosqPost, DeviceTempLog from .pagination import PostLimitOffsetPagination, PostPageNumberPagination -from .serializers import MosqListSerializer, MosqPostListSerializer +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): @@ -33,7 +48,7 @@ class MosquitoListAPIView(ListAPIView): class MosquitoPostListAPIView(ListAPIView): serializer_class = MosqPostListSerializer - permission_classes = [IsAuthenticated,] + permission_classes = [IsAuthenticated, ] filter_backends = [SearchFilter, OrderingFilter] pagination_class = PostLimitOffsetPagination search_fields = ['mosq__name', 'mosq__region'] @@ -47,3 +62,29 @@ class MosquitoPostListAPIView(ListAPIView): 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_list = 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_list = queryset_list.filter(device_id__in=device_ids) + # device_id = self.request.GET.get('device_id') + + # if device_id: + # queryset_list = queryset_list.filter(device_id__icontains=device_id) + + return queryset_list + diff --git a/mosqkiller/settings.py b/mosqkiller/settings.py index ab40a2b..5fea0e3 100644 --- a/mosqkiller/settings.py +++ b/mosqkiller/settings.py @@ -41,6 +41,7 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', + 'django_filters', 'corsheaders', 'accounts', 'mosquito',