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
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()

View File

@ -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/<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'),
]

View File

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

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