Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	apps/api/staff/exam/urls.py
jiaweiqi 3 years ago
parent
commit
90073bf0e2

+ 0 - 1
apps/api/staff/exam/urls.py

@@ -11,5 +11,4 @@ urlpatterns = [
 router = SimpleRouter()
 router.register(r'exam_log', ExamLogViewSet)
 router.register(r'feedback', ExamQuestionFeedbackViewSet)
-router.register(r'', ExamViewSet)
 urlpatterns += router.urls

+ 44 - 35
apps/api/staff/exam/views.py

@@ -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

+ 1 - 1
apps/api/staff/mock/views.py

@@ -91,7 +91,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:

+ 1 - 1
apps/examination/exam/serializers.py

@@ -76,7 +76,7 @@ class StaffExamLogSerializer(serializers.ModelSerializer):
     class Meta:
         model = ExamLog
         fields = ('id', 'type', 'exampaper', 'user', 'exam_time', 'exampaper_name', 'exam_time', 'submit_time',
-                  'scores', 'right_count','wrong_count',)
+                  'scores', 'right_count','wrong_count','rank',)
 
     def get_right_count(self, obj):
         return obj.single_answer_count + obj.multiple_answer_count + obj.fill_answer_count +  obj.judgment_answer_count