Files
medical_training/apps/training/views.py
T

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']