feat: led状态api

This commit is contained in:
xianfx 2024-03-11 00:08:24 +08:00
parent 0bfb2ee9af
commit 883ea9fbfc
5 changed files with 75 additions and 36 deletions

View File

@ -20,6 +20,46 @@ class LedHealthStatus(Enum):
return self.value 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): class DeviceInfoMobileSerializer(serializers.ModelSerializer):
device_name = serializers.SerializerMethodField() device_name = serializers.SerializerMethodField()
status = serializers.SerializerMethodField() status = serializers.SerializerMethodField()

View File

@ -1,11 +1,12 @@
from django.urls import path from django.urls import path
from .views import ( from .views import (
DeviceInfoMobileViewSet DeviceInfoMobileViewSet,
) )
app_name = 'counter-mobile-api' app_name = 'counter-mobile-api'
urlpatterns = [ urlpatterns = [
path('device/', DeviceInfoMobileViewSet.as_view({'get': 'list'}), name='device-mobile-list'), path('device/', DeviceInfoMobileViewSet.as_view({'get': 'list'}), name='device-mobile-list'),
path('device/<device_id>/led-status/', DeviceInfoMobileViewSet.as_view({'get': 'get_led_status'}), name='led-status'),
path('device/<device_id>/', DeviceInfoMobileViewSet.as_view({'get': 'retrieve'}), name='device-mobile-detail'), path('device/<device_id>/', DeviceInfoMobileViewSet.as_view({'get': 'retrieve'}), name='device-mobile-detail'),
] ]

View File

@ -1,23 +1,20 @@
from rest_framework import status from rest_framework import status, decorators
from rest_framework.filters import ( from rest_framework.filters import (
SearchFilter, SearchFilter,
OrderingFilter OrderingFilter
) )
from rest_framework.generics import mixins from rest_framework.generics import mixins
from rest_framework.viewsets import GenericViewSet
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response from rest_framework.response import Response
from counter.models import DeviceInfo from counter.views import BaseDeviceViewSet
from .serializers import DeviceInfoMobileSerializer from .serializers import DeviceInfoMobileSerializer, LedStatusMobileSerializer
from utils.pagination import DeviceInfoMobilePagination from utils.pagination import DeviceInfoMobilePagination
from ...mixins.role import RoleMixin
class DeviceInfoMobileViewSet(mixins.ListModelMixin, class DeviceInfoMobileViewSet(mixins.ListModelMixin,
mixins.RetrieveModelMixin, mixins.RetrieveModelMixin,
RoleMixin, BaseDeviceViewSet):
GenericViewSet):
serializer_class = DeviceInfoMobileSerializer serializer_class = DeviceInfoMobileSerializer
permission_classes = [IsAuthenticated] permission_classes = [IsAuthenticated]
filter_backends = [SearchFilter, OrderingFilter] filter_backends = [SearchFilter, OrderingFilter]
@ -40,26 +37,13 @@ class DeviceInfoMobileViewSet(mixins.ListModelMixin,
def retrieve(self, request, *args, **kwargs): def retrieve(self, request, *args, **kwargs):
instance = self.get_object() instance = self.get_object()
serializer = self.get_serializer(instance) 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): @decorators.action(methods='GET', detail=True, url_path='led-status', serializer_class=LedStatusMobileSerializer)
user_roles = self.get_role() def get_led_status(self, request, device_id=None):
queryset = DeviceInfo.objects.get_queryset().order_by('-last_offline_time') instance = self.get_object()
if 'staff' in user_roles or 'manager' in user_roles: serializer = LedStatusMobileSerializer(instance)
child = self.request.user.get_child() return Response({"code": 0, "data": serializer.data, "message": "success"})
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
def get_object(self): def get_object(self):
queryset = self.get_queryset() queryset = self.get_queryset()

View File

@ -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

View File

@ -244,10 +244,3 @@ class DeviceRemoteViewSet(mixins.ListModelMixin,
publish.single(topic, payload=json.dumps(message), hostname='8.217.112.255', port=1883) publish.single(topic, payload=json.dumps(message), hostname='8.217.112.255', port=1883)
return Response({'success': True}) 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