from rest_framework import viewsets, filters, status from rest_framework.decorators import action from rest_framework.response import Response from django_filters.rest_framework import DjangoFilterBackend from .models import TrainingRecord, TrainingScoreDetail from .serializers import ( TrainingRecordListSerializer, TrainingRecordDetailSerializer, TrainingRecordCreateSerializer, TrainingScoreDetailSerializer ) class TrainingRecordViewSet(viewsets.ModelViewSet): """训练记录管理 list: 获取训练记录列表(支持过滤、搜索、排序) create: 开始训练(创建记录) retrieve: 获取训练详情 update: 更新训练记录 destroy: 删除训练记录 """ queryset = TrainingRecord.objects.all() filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter] filterset_fields = [ 'user', 'case', 'training_mode', 'case_type', 'teacher', 'evaluation_level', 'status' ] search_fields = ['feedback'] ordering_fields = ['start_time', 'end_time', 'total_score', 'created_at'] def get_serializer_class(self): if self.action == 'list': return TrainingRecordListSerializer elif self.action == 'create': return TrainingRecordCreateSerializer return TrainingRecordDetailSerializer def get_queryset(self): """普通用户只能看到自己的记录,老师可以看到学生的""" queryset = super().get_queryset() user = self.request.user # 超级管理员可以看所有 if user.is_superuser: return queryset # 老师可以看到自己学生的记录 return queryset.filter(user=user) | queryset.filter(teacher=user) @action(detail=True, methods=['get']) def score_details(self, request, pk=None): """获取训练评分明细""" record = self.get_object() details = record.score_details.all() serializer = TrainingScoreDetailSerializer(details, many=True) return Response(serializer.data) @action(detail=True, methods=['post']) def complete(self, request, pk=None): """完成训练""" record = self.get_object() record.status = 'completed' record.end_time = timezone.now() # 计算训练时长 if record.start_time: duration = (record.end_time - record.start_time).total_seconds() record.duration_seconds = int(duration) record.save() # 更新用户统计 user = record.user user.total_training_count += 1 user.total_case_count += 1 user.save() return Response({'message': '训练已完成', 'duration_seconds': record.duration_seconds}) @action(detail=True, methods=['post']) def abort(self, request, pk=None): """中断训练""" record = self.get_object() record.status = 'aborted' record.end_time = timezone.now() record.interruption_count += 1 record.save() return Response({'message': '训练已中断'}) @action(detail=True, methods=['post']) def add_score(self, request, pk=None): """添加评分""" record = self.get_object() serializer = TrainingScoreDetailSerializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.save(record=record) return Response(serializer.data, status=status.HTTP_201_CREATED) class TrainingScoreDetailViewSet(viewsets.ModelViewSet): """评分明细管理""" queryset = TrainingScoreDetail.objects.all() serializer_class = TrainingScoreDetailSerializer filter_backends = [DjangoFilterBackend] filterset_fields = ['record', 'rule', 'dimension']