from rest_framework import status 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 utils.pagination import DeviceInfoMobilePagination from ...mixins.role import RoleMixin class DeviceInfoMobileViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, RoleMixin, GenericViewSet): serializer_class = DeviceInfoMobileSerializer permission_classes = [IsAuthenticated] filter_backends = [SearchFilter, OrderingFilter] pagination_class = DeviceInfoMobilePagination search_fields = ['device_id', 'online'] def list(self, request, *args, **kwargs): response = super().list(request, *args, **kwargs) # serializer = self.get_serializer(self.get_queryset(), many=True) response_data = { 'count': response.data.get('count'), 'next': response.data.get('next'), 'previous': response.data.get('previous'), 'data': response.data.get('results'), 'code': 0, 'message': '获取成功' } return Response(response_data, status=status.HTTP_200_OK) def retrieve(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance) return Response({"code": 0, "data": serializer.data, "message": "获取成功"}) 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 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