feat(mobile): device list api TODO: 地理信息定时任务

This commit is contained in:
fxxian 2024-02-25 14:19:23 +08:00
parent 6f1acd1698
commit ee9e6e8fd6
2 changed files with 33 additions and 3 deletions

View File

@ -2,12 +2,14 @@ from typing import Optional
from rest_framework import serializers from rest_framework import serializers
from counter.models import DeviceCount, DeviceInfo from counter.models import DeviceCount, DeviceInfo
from mosquito.models import DeviceInfo as MosquitoDeviceInfo from mosquito.models import DeviceInfo as MosquitoDeviceInfo
from geopy.geocoders import Nominatim
class DeviceInfoMobileSerializer(serializers.ModelSerializer): class DeviceInfoMobileSerializer(serializers.ModelSerializer):
device_name = serializers.SerializerMethodField() device_name = serializers.SerializerMethodField()
status = serializers.SerializerMethodField() status = serializers.SerializerMethodField()
coordinate = serializers.SerializerMethodField() coordinate = serializers.SerializerMethodField()
# location = serializers.SerializerMethodField()
class Meta: class Meta:
model = DeviceInfo model = DeviceInfo
@ -16,12 +18,14 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer):
'device_name', 'device_name',
'status', 'status',
'coordinate', 'coordinate',
# 'location',
] ]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.latest = None self.latest = None
self.cur_device = None self.cur_device = None
self.geolocator = Nominatim(user_agent="geoapiExercises")
def get_device_name(self, obj) -> Optional[str]: def get_device_name(self, obj) -> Optional[str]:
qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id) qs = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id)
@ -40,3 +44,13 @@ class DeviceInfoMobileSerializer(serializers.ModelSerializer):
if lon and lat: if lon and lat:
return [lon, lat] return [lon, lat]
return None 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

View File

@ -1,9 +1,11 @@
from rest_framework import status
from rest_framework.filters import ( from rest_framework.filters import (
SearchFilter, SearchFilter,
OrderingFilter OrderingFilter
) )
from rest_framework.generics import ListAPIView from rest_framework.generics import ListAPIView
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from counter.models import DeviceInfo from counter.models import DeviceInfo
from .serializers import DeviceInfoMobileSerializer from .serializers import DeviceInfoMobileSerializer
@ -18,6 +20,19 @@ class DeviceInfoMobileListAPIView(ListAPIView, RoleMixin):
pagination_class = DeviceInfoMobilePagination pagination_class = DeviceInfoMobilePagination
search_fields = ['device_id', 'online'] 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): def get_queryset(self, *args, **kwargs):
user_roles = self.get_role() user_roles = self.get_role()
queryset = DeviceInfo.objects.get_queryset().order_by('-last_offline_time') 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] if query.org == self.request.user.org or query.org.id in child]
queryset = queryset.filter(device_id__in=device_ids) queryset = queryset.filter(device_id__in=device_ids)
device_id = self.request.GET.get('device_id') device_id = self.request.GET.get('device_id')
status = self.request.GET.get('status') device_status = self.request.GET.get('status')
if device_id: if device_id:
queryset = queryset.filter(device_id__icontains=device_id) queryset = queryset.filter(device_id__icontains=device_id)
if status: if device_status:
queryset = queryset.filter(online=int(status)) queryset = queryset.filter(online=int(device_status))
return queryset return queryset