diff --git a/apps/counter/api/mobile/serializers.py b/apps/counter/api/mobile/serializers.py index 594a11d..5cdd7fd 100644 --- a/apps/counter/api/mobile/serializers.py +++ b/apps/counter/api/mobile/serializers.py @@ -2,12 +2,14 @@ from typing import Optional from rest_framework import serializers from counter.models import DeviceCount, DeviceInfo from mosquito.models import DeviceInfo as MosquitoDeviceInfo +from geopy.geocoders import Nominatim class DeviceInfoMobileSerializer(serializers.ModelSerializer): device_name = serializers.SerializerMethodField() status = serializers.SerializerMethodField() coordinate = serializers.SerializerMethodField() + # location = serializers.SerializerMethodField() class Meta: model = DeviceInfo @@ -16,12 +18,14 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer): 'device_name', 'status', 'coordinate', + # 'location', ] def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.latest = None self.cur_device = None + self.geolocator = Nominatim(user_agent="geoapiExercises") def get_device_name(self, obj) -> Optional[str]: qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id) @@ -40,3 +44,13 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer): if lon and lat: return [lon, lat] return None + + # TODO: 作为定时任务 + # def get_location(self, obj): + # if self.cur_device: + # lon, lat = [self.cur_device.longitude, self.cur_device.latitude] + # if lon and lat: + # location = self.geolocator.reverse("{},{}".format(lat, lon)) + # address = location.raw['address'] + # return address + # return None diff --git a/apps/counter/api/mobile/views.py b/apps/counter/api/mobile/views.py index 4faa67a..1bf365d 100644 --- a/apps/counter/api/mobile/views.py +++ b/apps/counter/api/mobile/views.py @@ -1,9 +1,11 @@ +from rest_framework import status from rest_framework.filters import ( SearchFilter, OrderingFilter ) from rest_framework.generics import ListAPIView from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response from counter.models import DeviceInfo from .serializers import DeviceInfoMobileSerializer @@ -18,6 +20,19 @@ class DeviceInfoMobileListAPIView(ListAPIView, RoleMixin): pagination_class = DeviceInfoMobilePagination search_fields = ['device_id', 'online'] + def list(self, request, *args, **kwargs): + response = super().list(request, *args, **kwargs) + # serializer = self.get_serializer(self.get_queryset(), many=True) + response_data = { + 'count': response.data.get('count'), + 'next': response.data.get('next'), + 'previous': response.data.get('previous'), + 'data': response.data.get('results'), + 'code': 0, + 'message': '获取成功' + } + return Response(response_data, status=status.HTTP_200_OK) + def get_queryset(self, *args, **kwargs): user_roles = self.get_role() queryset = DeviceInfo.objects.get_queryset().order_by('-last_offline_time') @@ -28,11 +43,12 @@ class DeviceInfoMobileListAPIView(ListAPIView, RoleMixin): if query.org == self.request.user.org or query.org.id in child] queryset = queryset.filter(device_id__in=device_ids) device_id = self.request.GET.get('device_id') - status = self.request.GET.get('status') + device_status = self.request.GET.get('status') if device_id: queryset = queryset.filter(device_id__icontains=device_id) - if status: - queryset = queryset.filter(online=int(status)) + if device_status: + queryset = queryset.filter(online=int(device_status)) return queryset +