105 lines
3.7 KiB
Python
105 lines
3.7 KiB
Python
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']
|