feat: led状态api
This commit is contained in:
parent
0bfb2ee9af
commit
883ea9fbfc
|
@ -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()
|
||||
|
|
|
@ -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'),
|
||||
]
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue