diff --git a/apps/counter/api/mobile/serializers.py b/apps/counter/api/mobile/serializers.py index 549b218..e2827cc 100644 --- a/apps/counter/api/mobile/serializers.py +++ b/apps/counter/api/mobile/serializers.py @@ -20,6 +20,46 @@ class LedHealthStatus(Enum): return self.value +class LedStatusMobileSerializer(serializers.ModelSerializer): + device_name = serializers.SerializerMethodField() + working_hours = serializers.SerializerMethodField() + energy = serializers.SerializerMethodField() + + class Meta: + model = DeviceInfo + fields = [ + 'device_id', + 'device_name', + 'working_hours', + 'energy', + ] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.cur_device = None + + def get_device_name(self, obj) -> Optional[str]: + device = MosquitoDeviceInfo.objects.filter(device_id=obj.device_id).first() + if device: + self.cur_device = device + return device.device_name + return None + + def get_working_hours(self, obj): + if self.cur_device: + diff = datetime.now(tz=pytz.timezone('UTC')) - self.cur_device.launch_time + hours = diff.days * 24 + int(diff.seconds / 3600) + return hours + return None + + def get_energy(self, obj): + working_hours = self.get_working_hours(obj) + if working_hours: + used = working_hours / self.cur_device.led_lifetime + return int((1 - used) * 100) + return None + + class DeviceInfoMobileSerializer(serializers.ModelSerializer): device_name = serializers.SerializerMethodField() status = serializers.SerializerMethodField() diff --git a/apps/counter/api/mobile/urls.py b/apps/counter/api/mobile/urls.py index 756b707..d14def2 100644 --- a/apps/counter/api/mobile/urls.py +++ b/apps/counter/api/mobile/urls.py @@ -1,11 +1,12 @@ from django.urls import path from .views import ( - DeviceInfoMobileViewSet + DeviceInfoMobileViewSet, ) app_name = 'counter-mobile-api' urlpatterns = [ path('device/', DeviceInfoMobileViewSet.as_view({'get': 'list'}), name='device-mobile-list'), + path('device//led-status/', DeviceInfoMobileViewSet.as_view({'get': 'get_led_status'}), name='led-status'), path('device//', DeviceInfoMobileViewSet.as_view({'get': 'retrieve'}), name='device-mobile-detail'), ] diff --git a/apps/counter/api/mobile/views.py b/apps/counter/api/mobile/views.py index 1f5923b..e42de40 100644 --- a/apps/counter/api/mobile/views.py +++ b/apps/counter/api/mobile/views.py @@ -1,23 +1,20 @@ -from rest_framework import status +from rest_framework import status, decorators from rest_framework.filters import ( SearchFilter, OrderingFilter ) from rest_framework.generics import mixins -from rest_framework.viewsets import GenericViewSet from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response -from counter.models import DeviceInfo -from .serializers import DeviceInfoMobileSerializer +from counter.views import BaseDeviceViewSet +from .serializers import DeviceInfoMobileSerializer, LedStatusMobileSerializer from utils.pagination import DeviceInfoMobilePagination -from ...mixins.role import RoleMixin class DeviceInfoMobileViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, - RoleMixin, - GenericViewSet): + BaseDeviceViewSet): serializer_class = DeviceInfoMobileSerializer permission_classes = [IsAuthenticated] filter_backends = [SearchFilter, OrderingFilter] @@ -40,26 +37,13 @@ class DeviceInfoMobileViewSet(mixins.ListModelMixin, def retrieve(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance) - return Response({"code": 0, "data": serializer.data, "message": "获取成功"}) + return Response({"code": 0, "data": serializer.data, "message": "success"}) - def get_queryset(self, *args, **kwargs): - user_roles = self.get_role() - queryset = DeviceInfo.objects.get_queryset().order_by('-last_offline_time') - if 'staff' in user_roles or 'manager' in user_roles: - child = self.request.user.get_child() - device_ids = [query.device_id - for query in queryset - 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') - device_status = self.request.GET.get('status') - - if device_id: - queryset = queryset.filter(device_id__icontains=device_id) - - if device_status: - queryset = queryset.filter(online=int(device_status)) - return queryset + @decorators.action(methods='GET', detail=True, url_path='led-status', serializer_class=LedStatusMobileSerializer) + def get_led_status(self, request, device_id=None): + instance = self.get_object() + serializer = LedStatusMobileSerializer(instance) + return Response({"code": 0, "data": serializer.data, "message": "success"}) def get_object(self): queryset = self.get_queryset() diff --git a/apps/counter/views.py b/apps/counter/views.py index 91ea44a..7c1880e 100644 --- a/apps/counter/views.py +++ b/apps/counter/views.py @@ -1,3 +1,24 @@ -from django.shortcuts import render +from rest_framework.viewsets import GenericViewSet +from .models import DeviceInfo +from .mixins.role import RoleMixin -# Create your views here. + +class BaseDeviceViewSet(RoleMixin, GenericViewSet): + def get_queryset(self, *args, **kwargs): + user_roles = self.get_role() + queryset = DeviceInfo.objects.get_queryset().order_by('-last_offline_time') + if 'staff' in user_roles or 'manager' in user_roles: + child = self.request.user.get_child() + device_ids = [query.device_id + for query in queryset + 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') + device_status = self.request.GET.get('status') + + if device_id: + queryset = queryset.filter(device_id__icontains=device_id) + + if device_status: + queryset = queryset.filter(online=int(status)) + return queryset diff --git a/apps/mosquito/api/views.py b/apps/mosquito/api/views.py index 9500a41..61200df 100644 --- a/apps/mosquito/api/views.py +++ b/apps/mosquito/api/views.py @@ -244,10 +244,3 @@ class DeviceRemoteViewSet(mixins.ListModelMixin, publish.single(topic, payload=json.dumps(message), hostname='8.217.112.255', port=1883) return Response({'success': True}) - - def get_object(self): - queryset = self.get_queryset() - filter_kwargs = {'device_id': self.kwargs['device_id']} - obj = queryset.filter(**filter_kwargs).first() - self.check_object_permissions(self.request, obj) - return obj