init medical training project
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
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']
|
||||
Reference in New Issue
Block a user