|
@@ -23,49 +23,54 @@ from apps.examination.examquestion.models import ExamQuestionOption, ExamQuestio
|
|
|
from apps.examination.examquestion.serializers import ExamQuestionFeedbackSerializer
|
|
|
from apps.practise.errorbook.models import ErrorBook
|
|
|
|
|
|
-
|
|
|
-class ExamViewSet(CustomModelViewSet):
|
|
|
- permission_classes = [IsStaff, ]
|
|
|
- end_date = str(timezone.now().date()) + ' 23:59:59'
|
|
|
- queryset = Exam.objects.filter(delete=False, exam_time__gte=timezone.now().date(), exam_time__lte=end_date)
|
|
|
- serializer_class = ExamSerializer
|
|
|
-
|
|
|
- def filter_queryset(self, queryset):
|
|
|
- f = ExamFilter(self.request.GET, queryset=queryset)
|
|
|
- return f.qs
|
|
|
-
|
|
|
class ExamLogViewSet(CustomModelViewSet):
|
|
|
permission_classes = [IsStaff, ]
|
|
|
- queryset = ExamLog.objects.filter(delete=False)
|
|
|
+ queryset = ExamLog.objects.filter(delete=False, type=ExamLog.FORMAL,)
|
|
|
serializer_class = StaffExamLogSerializer
|
|
|
|
|
|
def filter_queryset(self, queryset):
|
|
|
queryset = queryset.filter(user=self.request.user)
|
|
|
return queryset
|
|
|
|
|
|
- def create(self, request, *args, **kwargs):
|
|
|
- exam_id = request.data.get('exam')
|
|
|
- exampaper_id = request.data.get('exampaper')
|
|
|
+ def retrieve(self, request, *args, **kwargs):
|
|
|
+ instance = self.get_object()
|
|
|
+ serializer = StaffExamLogRetrieveSerializer(instance)
|
|
|
+ answer_log = []
|
|
|
+ answer_logs = ExamAnswerLog.objects.filter(main=instance).order_by('detail__order')
|
|
|
+ for al in answer_logs:
|
|
|
+ item = {
|
|
|
+ 'id':al.id,
|
|
|
+ 'status':al.status,
|
|
|
+ }
|
|
|
+ answer_log.append(item)
|
|
|
+ result = {
|
|
|
+ 'question': serializer.data,
|
|
|
+ 'answer_log': answer_log,
|
|
|
+ 'ranks': [],
|
|
|
+ }
|
|
|
+ return response_ok(result)
|
|
|
|
|
|
- try:
|
|
|
- with transaction.atomic():
|
|
|
- data = {
|
|
|
- 'type': ExamPaper.FORMAL,
|
|
|
- 'exam': exam_id,
|
|
|
- 'exampaper': exampaper_id,
|
|
|
- 'user': request.user.id,
|
|
|
- 'exam_time': timezone.now()
|
|
|
- }
|
|
|
- serializer = StaffExamLogSerializer(data=data)
|
|
|
- if serializer.is_valid(raise_exception=True):
|
|
|
- instance = serializer.save()
|
|
|
- result = {
|
|
|
- 'exam_log': instance.id, # 模拟考试 id
|
|
|
- }
|
|
|
- return response_ok(result)
|
|
|
- except ValidationError as e:
|
|
|
- traceback.print_exc()
|
|
|
- return response_error('数据格式有误')
|
|
|
+ @action(methods=['get'], detail=False)
|
|
|
+ def get_exam(self, request):
|
|
|
+ start_time = timezone.now() + datetime.timedelta(minutes=30)
|
|
|
+ queryset = ExamLog.objects.filter(delete=False,
|
|
|
+ type=ExamLog.FORMAL,
|
|
|
+ exam__exam_time__lte=start_time,
|
|
|
+ user=request.user,
|
|
|
+ exam__exam_end_time__gte=timezone.now()
|
|
|
+ )
|
|
|
+ data = []
|
|
|
+ for exam_log in queryset:
|
|
|
+ item = {
|
|
|
+ 'id':exam_log.id,
|
|
|
+ 'name':exam_log.exam.name,
|
|
|
+ 'subject':exam_log.exam.subject.name,
|
|
|
+ 'exam_time':exam_log.exam.exam_time,
|
|
|
+ 'exam_end_time':exam_log.exam.exam_end_time,
|
|
|
+ 'duration':exam_log.exam.duration,
|
|
|
+ }
|
|
|
+ data.append(item)
|
|
|
+ return response_ok(data)
|
|
|
|
|
|
@action(methods=['post'], detail=True)
|
|
|
def get_next_practise(self, request, pk):
|
|
@@ -76,7 +81,7 @@ class ExamLogViewSet(CustomModelViewSet):
|
|
|
try:
|
|
|
with transaction.atomic():
|
|
|
instance = self.get_object()
|
|
|
- # 点击下一题,保存、判断当前习题答案
|
|
|
+ # 点击下一题,保存
|
|
|
if now_practise:
|
|
|
detail = ExamPaperDetail.objects.filter(id=now_practise).first()
|
|
|
if not detail:
|
|
@@ -303,6 +308,10 @@ class ExamLogViewSet(CustomModelViewSet):
|
|
|
instance.fill_answer_scores = fill_answer_scores
|
|
|
instance.judgment_answer_scores = judgment_answer_scores
|
|
|
instance.scores = single_answer_scores + judgment_answer_scores + multiple_answer_scores + fill_answer_scores
|
|
|
+ # 计算排名
|
|
|
+ up_rank = ExamLog.objects.filter(exam=instance.exam, scores__gte=instance.scores).count()
|
|
|
+ instance.rank = up_rank + 1
|
|
|
+ ExamLog.objects.filter(exam=instance.exam, scores__lte=instance.scores).update(rank=F('rank') + 1)
|
|
|
instance.save()
|
|
|
|
|
|
instance.exampaper.did_count += 1
|