Pārlūkot izejas kodu

模拟考试,下一题,提交答卷,错题集

wushaodong 3 gadi atpakaļ
vecāks
revīzija
06f546b972

+ 49 - 40
apps/api/staff/mock/views.py

@@ -20,6 +20,7 @@ from apps.examination.exampaper.models import ExamPaper, ExamPaperDetail, ExamQu
 from apps.examination.exampaper.filters import ExamPaperFilter
 from apps.examination.exampaper.filters import ExamPaperFilter
 from apps.examination.exampaper.serializers import StaffExamPaperSerializer
 from apps.examination.exampaper.serializers import StaffExamPaperSerializer
 from apps.examination.examquestion.models import ExamQuestionOption, ExamQuestionFill
 from apps.examination.examquestion.models import ExamQuestionOption, ExamQuestionFill
+from apps.practise.errorbook.models import ErrorBook
 
 
 class ExamPaperViewSet(CustomModelViewSet):
 class ExamPaperViewSet(CustomModelViewSet):
     permission_classes = [IsStaff, ]
     permission_classes = [IsStaff, ]
@@ -59,6 +60,10 @@ class ExamLogViewSet(CustomModelViewSet):
                     result = {
                     result = {
                         'exam_log': instance.id,  # 模拟考试 id
                         'exam_log': instance.id,  # 模拟考试 id
                     }
                     }
+                    # 创建模拟考试答题记录
+                    paper_details = ExamPaperDetail.objects.filter(main=exampaper, delete=False)
+                    for detail in paper_details:
+                        ExamAnswerLog.objects.create(main=instance, detail=detail)
                     return response_ok(result)
                     return response_ok(result)
         except ValidationError as e:
         except ValidationError as e:
             traceback.print_exc()
             traceback.print_exc()
@@ -79,61 +84,36 @@ class ExamLogViewSet(CustomModelViewSet):
                         raise CustomError('提交的考试习题有误,请刷新重试!')
                         raise CustomError('提交的考试习题有误,请刷新重试!')
                     now_question = detail.question
                     now_question = detail.question
                     if len(answers) > 0:
                     if len(answers) > 0:
-                        answer_log, create = ExamAnswerLog.objects.get_or_create(main=instance,
-                                                                                 detail=detail,)
-                        if now_question.type == ExamQuestion.SINGLE:
-                            # 单选
-                            ExamAnswerOptionLog.objects.filter(main=answer_log).delete()
-                            answer = answers[0]
-                            ExamAnswerOptionLog.objects.create(main=answer_log, option_id=answer)
-                            right = ExamQuestionOption.objects.filter(main=now_question, id=answer, right=True,
-                                                                      delete=False)
-                            if right:
-                                answer_log.status = ExamAnswerLog.RIGHT
-                            else:
-                                answer_log.status = ExamAnswerLog.WRONG
-                        elif now_question.type == ExamQuestion.MULTIPLE:
-                            # 多选
+                        try:
+                            answer_log = ExamAnswerLog.objects.get(main=instance, detail=detail)
+                        except ExamAnswerLog.DoesNotExist:
+                            # traceback.print_exc()
+                            raise CustomError('考试习题有误,请刷新重试!')
+                        if now_question.type <= ExamQuestion.MULTIPLE:
+                            # 单选、多选
                             answers.sort()
                             answers.sort()
                             ExamAnswerOptionLog.objects.filter(main=answer_log).delete()
                             ExamAnswerOptionLog.objects.filter(main=answer_log).delete()
                             for a in answers:
                             for a in answers:
                                 ExamAnswerOptionLog.objects.create(main=answer_log, option_id=a)
                                 ExamAnswerOptionLog.objects.create(main=answer_log, option_id=a)
-                            right = ExamQuestionOption.objects.filter(main=now_question, right=True,
-                                                                      delete=False).values_list('id', flat=True)
-                            list(right).sort()
-                            if answers == right:
-                                answer_log.status = ExamAnswerLog.RIGHT
-                            else:
-                                answer_log.status = ExamAnswerLog.WRONG
                         elif now_question.type == ExamQuestion.FILL:
                         elif now_question.type == ExamQuestion.FILL:
                             # 填空
                             # 填空
                             answers_len = len(answers)
                             answers_len = len(answers)
-                            right = 1
                             ExamAnswerFillLog.objects.filter(main=answer_log).delete()
                             ExamAnswerFillLog.objects.filter(main=answer_log).delete()
                             for a in range(0, answers_len):
                             for a in range(0, answers_len):
                                 ExamAnswerFillLog.objects.create(main=answer_log, content=answers[a], order=a + 1)
                                 ExamAnswerFillLog.objects.create(main=answer_log, content=answers[a], order=a + 1)
-                                right_answer = ExamQuestionFill.objects.filter(main=now_question, content=answers[a],
-                                                                               order=a + 1)
-                                if not right_answer:
-                                    # 有一个填空错误,整题错误
-                                    right = 0
-                            if right:
-                                answer_log.status = ExamAnswerLog.RIGHT
-                            else:
-                                answer_log.status = ExamAnswerLog.WRONG
                         else:
                         else:
                             # 判断
                             # 判断
-                            if now_question.judgment == (answers[0] == 1):
+                            if answers[0] == 1:
                                 answer_log.status = ExamAnswerLog.RIGHT
                                 answer_log.status = ExamAnswerLog.RIGHT
                             else:
                             else:
                                 answer_log.status = ExamAnswerLog.WRONG
                                 answer_log.status = ExamAnswerLog.WRONG
-                        answer_log.save()
+                            answer_log.save()
                     else:
                     else:
                         try:
                         try:
-                            answer_log = ExamAnswerLog.objects.get(main=instance, question=now_question, )
+                            answer_log = ExamAnswerLog.objects.get(main=instance, detail=detail)
                             ExamAnswerOptionLog.objects.filter(main=answer_log).delete()
                             ExamAnswerOptionLog.objects.filter(main=answer_log).delete()
                             ExamAnswerFillLog.objects.filter(main=answer_log).delete()
                             ExamAnswerFillLog.objects.filter(main=answer_log).delete()
-                            answer_log.status = None
+                            answer_log.status = ExamAnswerLog.NOTDONE
                             answer_log.save()
                             answer_log.save()
                         except ExamAnswerLog.DoesNotExist:
                         except ExamAnswerLog.DoesNotExist:
                             # traceback.print_exc()
                             # traceback.print_exc()
@@ -142,7 +122,8 @@ class ExamLogViewSet(CustomModelViewSet):
                 question_data = {}
                 question_data = {}
                 # 返回下一题
                 # 返回下一题
                 if next_practise:
                 if next_practise:
-                    detail = ExamPaperDetail.objects.filter(id=next_practise, main=instance.exampaper, delete=False).first()
+                    detail = ExamPaperDetail.objects.filter(id=next_practise, main=instance.exampaper,
+                                                            delete=False).first()
                 else:
                 else:
                     detail = ExamPaperDetail.objects.filter(main=instance.exampaper, delete=False).first()
                     detail = ExamPaperDetail.objects.filter(main=instance.exampaper, delete=False).first()
 
 
@@ -192,7 +173,8 @@ class ExamLogViewSet(CustomModelViewSet):
 
 
                 # 右侧习题类别列表
                 # 右侧习题类别列表
                 # 单选、多选、填空。选择答案后,可能会把答案清空,得加上NOTDONE过滤
                 # 单选、多选、填空。选择答案后,可能会把答案清空,得加上NOTDONE过滤
-                questions = ExamPaperDetail.objects.filter(main=instance.exampaper, delete=False).values_list('id', flat=True)
+                questions = ExamPaperDetail.objects.filter(main=instance.exampaper, delete=False).values_list('id',
+                                                                                                              flat=True)
                 single_questions_list = []
                 single_questions_list = []
                 for single in questions.filter(question__type=ExamQuestion.SINGLE):
                 for single in questions.filter(question__type=ExamQuestion.SINGLE):
                     answer_log = ExamAnswerLog.objects.filter(main=instance, detail=single).exclude(
                     answer_log = ExamAnswerLog.objects.filter(main=instance, detail=single).exclude(
@@ -266,17 +248,22 @@ class ExamLogViewSet(CustomModelViewSet):
                         if answers:
                         if answers:
                             if answers.option.right:
                             if answers.option.right:
                                 answer_log.status = ExamAnswerLog.RIGHT
                                 answer_log.status = ExamAnswerLog.RIGHT
+                                instance.single_answer_count += 1
                             else:
                             else:
                                 answer_log.status = ExamAnswerLog.WRONG
                                 answer_log.status = ExamAnswerLog.WRONG
+                                ErrorBook.add_error(question, request.user, answer_log)
                     elif question.type == ExamQuestion.MULTIPLE:
                     elif question.type == ExamQuestion.MULTIPLE:
                         # 多选
                         # 多选
-                        answers = ExamAnswerOptionLog.objects.filter(main=answer_log).order_by('option_id').values_list('option_id', flat=True)
+                        answers = ExamAnswerOptionLog.objects.filter(main=answer_log).order_by('option_id').values_list(
+                            'option_id', flat=True)
                         right = ExamQuestionOption.objects.filter(main=question, right=True,
                         right = ExamQuestionOption.objects.filter(main=question, right=True,
                                                                   delete=False).values_list('id', flat=True)
                                                                   delete=False).values_list('id', flat=True)
                         if list(answers) == list(right):
                         if list(answers) == list(right):
                             answer_log.status = ExamAnswerLog.RIGHT
                             answer_log.status = ExamAnswerLog.RIGHT
+                            instance.multiple_answer_count += 1
                         else:
                         else:
                             answer_log.status = ExamAnswerLog.WRONG
                             answer_log.status = ExamAnswerLog.WRONG
+                            ErrorBook.add_error(question, request.user, answer_log)
                     elif question.type == ExamQuestion.FILL:
                     elif question.type == ExamQuestion.FILL:
                         # 填空
                         # 填空
                         fill_logs = ExamAnswerFillLog.objects.filter(main=answer_log)
                         fill_logs = ExamAnswerFillLog.objects.filter(main=answer_log)
@@ -289,19 +276,40 @@ class ExamLogViewSet(CustomModelViewSet):
                                 break
                                 break
                         if right:
                         if right:
                             answer_log.status = ExamAnswerLog.RIGHT
                             answer_log.status = ExamAnswerLog.RIGHT
+                            instance.fill_answer_count += 1
                         else:
                         else:
                             answer_log.status = ExamAnswerLog.WRONG
                             answer_log.status = ExamAnswerLog.WRONG
+                            ErrorBook.add_error(question, request.user, answer_log)
                     else:
                     else:
                         # 判断
                         # 判断
                         if question.judgment == (answer_log.status == ExamAnswerLog.RIGHT):
                         if question.judgment == (answer_log.status == ExamAnswerLog.RIGHT):
                             answer_log.status = ExamAnswerLog.RIGHT
                             answer_log.status = ExamAnswerLog.RIGHT
+                            instance.judgment_answer_count += 1
                         else:
                         else:
                             answer_log.status = ExamAnswerLog.WRONG
                             answer_log.status = ExamAnswerLog.WRONG
+                            ErrorBook.add_error(question, request.user, answer_log)
                     answer_log.save()
                     answer_log.save()
 
 
                 instance.submit_time = timezone.now()
                 instance.submit_time = timezone.now()
+                use_time = instance.exam_time - instance.submit_time
+                instance.use_time = use_time.seconds
+
+                single_answer_scores = instance.single_answer_count * instance.exampaper.single_scores
+                multiple_answer_scores = instance.multiple_answer_count * instance.exampaper.multiple_scores
+                fill_answer_scores = instance.fill_answer_count * instance.exampaper.fill_scores
+                judgment_answer_scores = instance.judgment_answer_count * instance.exampaper.judgment_scores
+
+                instance.single_answer_scores = single_answer_scores
+                instance.multiple_answer_scores = multiple_answer_scores
+                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
                 instance.save()
                 instance.save()
-                SysLog.objects.addnew(request.user, SysLog.INSERT, u"提交模拟考试题答案,id=%d" % (instance.id))
+
+                instance.exampaper.did_count += 1
+                instance.exampaper.save()
+
+                SysLog.objects.addnew(request.user, SysLog.INSERT, u"提交模拟考试题,id=%d" % (instance.id))
         except CustomError as e:
         except CustomError as e:
             return response_error(e.get_error_msg())
             return response_error(e.get_error_msg())
         except Exception as e:
         except Exception as e:
@@ -309,6 +317,7 @@ class ExamLogViewSet(CustomModelViewSet):
             return response_error(str(e))
             return response_error(str(e))
         return response_ok()
         return response_ok()
 
 
+
 class DictView(APIView):
 class DictView(APIView):
     permission_classes = [IsStaff, ]
     permission_classes = [IsStaff, ]
 
 

+ 2 - 1
apps/examination/exam/models.py

@@ -107,6 +107,7 @@ class ExamLog(models.Model):
     multiple_answer_scores = models.IntegerField(verbose_name=u'多选题得分', default=0, editable=False)
     multiple_answer_scores = models.IntegerField(verbose_name=u'多选题得分', default=0, editable=False)
     fill_answer_scores = models.IntegerField(verbose_name=u'填空题得分', default=0, editable=False)
     fill_answer_scores = models.IntegerField(verbose_name=u'填空题得分', default=0, editable=False)
     judgment_answer_scores = models.IntegerField(verbose_name=u'判断题得分', default=0, editable=False)
     judgment_answer_scores = models.IntegerField(verbose_name=u'判断题得分', default=0, editable=False)
+
     single_answer_count = models.IntegerField(verbose_name=u'单选题答对数', default=0, editable=False)
     single_answer_count = models.IntegerField(verbose_name=u'单选题答对数', default=0, editable=False)
     multiple_answer_count = models.IntegerField(verbose_name=u'多选题答对数', default=0, editable=False)
     multiple_answer_count = models.IntegerField(verbose_name=u'多选题答对数', default=0, editable=False)
     fill_answer_count = models.IntegerField(verbose_name=u'填空题答对数', default=0, editable=False)
     fill_answer_count = models.IntegerField(verbose_name=u'填空题答对数', default=0, editable=False)
@@ -159,4 +160,4 @@ class ExamAnswerFillLog(models.Model):
         db_table = "exam_answer_fill_log"
         db_table = "exam_answer_fill_log"
         ordering = ['order', 'id']
         ordering = ['order', 'id']
         verbose_name = u"填空题回答"
         verbose_name = u"填空题回答"
-        default_permissions = ()
+        default_permissions = ()

+ 2 - 1
apps/examination/exampaper/models.py

@@ -39,6 +39,7 @@ class ExamPaper(models.Model):
     multiple_hard_count = models.IntegerField(verbose_name=u'困难多选题数量', default=0)
     multiple_hard_count = models.IntegerField(verbose_name=u'困难多选题数量', default=0)
     fill_hard_count = models.IntegerField(verbose_name=u'困难填空题数量', default=0)
     fill_hard_count = models.IntegerField(verbose_name=u'困难填空题数量', default=0)
     judgment_hard_count = models.IntegerField(verbose_name=u'困难判断题数量', default=0)
     judgment_hard_count = models.IntegerField(verbose_name=u'困难判断题数量', default=0)
+
     single_scores = models.IntegerField(verbose_name=u'单选题单题分数', default=0)
     single_scores = models.IntegerField(verbose_name=u'单选题单题分数', default=0)
     multiple_scores = models.IntegerField(verbose_name=u'多选题单题分数', default=0)
     multiple_scores = models.IntegerField(verbose_name=u'多选题单题分数', default=0)
     fill_scores = models.IntegerField(verbose_name=u'填空题单题分数', default=0)
     fill_scores = models.IntegerField(verbose_name=u'填空题单题分数', default=0)
@@ -168,4 +169,4 @@ class ExamPaperDetail(models.Model):
         db_table = "exam_paper_detail"
         db_table = "exam_paper_detail"
         ordering = ['order']
         ordering = ['order']
         verbose_name = u"试卷明细"
         verbose_name = u"试卷明细"
-        default_permissions = ()
+        default_permissions = ()

+ 16 - 2
apps/practise/errorbook/models.py

@@ -1,5 +1,5 @@
 # coding=utf-8
 # coding=utf-8
-
+from django.db.models import F
 from django.db import models
 from django.db import models
 from django.utils import timezone
 from django.utils import timezone
 from django.conf import settings
 from django.conf import settings
@@ -18,4 +18,18 @@ class ErrorBook(models.Model):
         db_table = "practise_error_book"
         db_table = "practise_error_book"
         ordering = ['-id']
         ordering = ['-id']
         verbose_name = u"错题集"
         verbose_name = u"错题集"
-        default_permissions = ()
+        default_permissions = ()
+
+    @staticmethod
+    def add_error(question, user, answer_log):
+        '''
+        :param question: 试题对象
+        :param user: 用户对象
+        :param answer_log: 答题记录对象
+        :return:
+        '''
+        instance = ErrorBook.objects.filter(question=question, create_user=user)
+        if instance:
+            instance.update(last_answer_log=answer_log, wrong_count=F('wrong_count')+1, last_time=timezone.now())
+        else:
+            ErrorBook.objects.create(question=question, create_user=user, last_answer_log=answer_log, wrong_count=1)