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