from django.http import JsonResponse from adrf.views import APIView from rest_framework import status from rest_framework.decorators import permission_classes from rest_framework.permissions import AllowAny from asgiref.sync import sync_to_async from ..models import CompressionHistory from ..serializers import CompressionHistorySerializer @permission_classes([AllowAny]) class CompressionHistoryListView(APIView): async def get(self, request): user = request.user if request.user.is_authenticated else None session_id = request.query_params.get('session_id') if user: histories = CompressionHistory.objects.filter(user=user) elif session_id: histories = CompressionHistory.objects.filter(session_id=session_id) else: return JsonResponse({ 'success': True, 'data': [], 'total': 0 }) page = int(request.query_params.get('page', 1)) page_size = int(request.query_params.get('page_size', 20)) start = (page - 1) * page_size end = start + page_size total = await histories.acount() serializer = CompressionHistorySerializer([h async for h in histories[start:end]], many=True) return JsonResponse({ 'success': True, 'data': serializer.data, 'total': total, 'page': page, 'page_size': page_size }) async def post(self, request): data = request.data.copy() if request.user.is_authenticated: data['user'] = request.user.id serializer = CompressionHistorySerializer(data=data) if serializer.is_valid(): # DRF 序列化器 save() 为同步 ORM 操作,sync_to_async 兜底 await sync_to_async(serializer.save)() return JsonResponse({ 'success': True, 'data': serializer.data }, status=status.HTTP_201_CREATED) return JsonResponse({ 'error': '参数错误', 'details': serializer.errors }, status=status.HTTP_400_BAD_REQUEST) @permission_classes([AllowAny]) class CompressionHistoryDetailView(APIView): async def delete(self, request, pk): user = request.user if request.user.is_authenticated else None session_id = request.query_params.get('session_id') try: if user: history = await CompressionHistory.objects.aget(pk=pk, user=user) elif session_id: history = await CompressionHistory.objects.aget(pk=pk, session_id=session_id) else: return JsonResponse( {'error': '无权限删除'}, status=status.HTTP_403_FORBIDDEN ) await history.adelete() return JsonResponse({'success': True}) except CompressionHistory.DoesNotExist: return JsonResponse( {'error': '记录不存在'}, status=status.HTTP_404_NOT_FOUND ) @permission_classes([AllowAny]) class CompressionHistoryClearView(APIView): async def delete(self, request): user = request.user if request.user.is_authenticated else None session_id = request.query_params.get('session_id') if user: count, _ = await CompressionHistory.objects.filter(user=user).adelete() elif session_id: count, _ = await CompressionHistory.objects.filter(session_id=session_id).adelete() else: return JsonResponse( {'error': '无权限清空'}, status=status.HTTP_403_FORBIDDEN ) return JsonResponse({ 'success': True, 'deleted_count': count })