Forráskód Böngészése

练习题记录、提交

wushaodong 3 éve
szülő
commit
1574c3bd17

+ 66 - 90
apps/api/staff/practise/views.py

@@ -62,78 +62,77 @@ class PractiseLogViewSet(CustomModelViewSet):
         now_practise = request.data.get('now_practise')  # 当前提交的练习题。第一题或继续答题时,该参数为空
         answers = json.loads(request.data.get('answers'))  # 答案, 第一题或继续答题时,该参数为空
         next_number = int(request.data.get('next_number')) or 0  # 下一题序号, 第一题提交为空
-        #  next_type = int(request.data.get('next_type'))  # 下一题题型,默认1为单选题
-        button_type = request.data.get('button_type')  #  上一题、下一题按钮类型,next下一题,previous上一题
         next_practise = request.data.get('next_practise')  #  下一题id,首次加载第一题,传空
         try:
             with transaction.atomic():
                 instance = self.get_object()
                 # 点击下一题,保存、判断当前习题答案
-                if now_practise and button_type == 'next':
-                    if len(answers) == 0:
-                        raise CustomError('请选择该题的答案!')
+                if now_practise:
                     now_question = ExamQuestion.objects.filter(id=now_practise).first()
                     if not now_question:
                         raise CustomError('提交的习题有误,请刷新重试!')
-                    answer_log, create = PractiseAnswerLog.objects.get_or_create(main=instance, question=now_question,
-                                                                  status=PractiseAnswerLog.WRONG)
-                    if now_question.type == ExamQuestion.SINGLE:
-                        # 单选
-                        if len(answers) != 1:
-                            raise CustomError(u'请提交一个答案!')
-                        answer = answers[0]
-                        PractiseAnswerOptionLog.objects.create(main=answer_log, option_id=answer)
-                        right = ExamQuestionOption.objects.filter(main=now_question, id=answer, right=True, )
-                        if right:
-                            instance.right_count += 1
-                            answer_log.status = PractiseAnswerLog.RIGHT
+                    if len(answers) > 0:
+                        answer_log, create = PractiseAnswerLog.objects.get_or_create(main=instance, question=now_question,)
+                        if now_question.type == ExamQuestion.SINGLE:
+                            # 单选
+                            PractiseAnswerOptionLog.objects.filter(main=answer_log).delete()
+                            answer = answers[0]
+                            PractiseAnswerOptionLog.objects.create(main=answer_log, option_id=answer)
+                            right = ExamQuestionOption.objects.filter(main=now_question, id=answer, right=True, delete=False )
+                            if right:
+                                instance.right_count += 1
+                                answer_log.status = PractiseAnswerLog.RIGHT
+                            else:
+                                answer_log.status = PractiseAnswerLog.WRONG
+                                instance.wrong_count += 1
+                        elif now_question.type == ExamQuestion.MULTIPLE:
+                            # 多选
+                            answers.sort()
+                            PractiseAnswerOptionLog.objects.filter(main=answer_log).delete()
+                            for a in answers:
+                                PractiseAnswerOptionLog.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 = PractiseAnswerLog.RIGHT
+                                instance.right_count += 1
+                            else:
+                                answer_log.status = PractiseAnswerLog.WRONG
+                                instance.wrong_count += 1
+                        elif now_question.type == ExamQuestion.FILL:
+                            # 填空
+                            answers_len = len(answers)
+                            right = 1
+                            PractiseAnswerFillLog.objects.filter(main=answer_log).delete()
+                            for a in range(0, answers_len):
+                                PractiseAnswerFillLog.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 = PractiseAnswerLog.RIGHT
+                                instance.right_count += 1
+                            else:
+                                answer_log.status = PractiseAnswerLog.WRONG
+                                instance.wrong_count += 1
                         else:
-                            instance.wrong_count += 1
-                    elif now_question.type == ExamQuestion.MULTIPLE:
-                        # 多选
-                        if len(answers) <= 1:
-                            raise CustomError(u'请提交两个以上答案!')
-                        answers.sort()
-                        for a in answers:
-                            PractiseAnswerOptionLog.objects.create(main=answer_log, option_id=a)
-                        right = ExamQuestionOption.objects.filter(main=now_question, right=True,
-                                                                  delete=False).values_list('id', flat=True)
-                        right.sort()
-                        if answers == right:
-                            answer_log.status = PractiseAnswerLog.RIGHT
-                            instance.right_count += 1
-                        else:
-                            instance.wrong_count += 1
-                    elif now_question.type == ExamQuestion.FILL:
-                        # 填空
-                        answers_len = len(answers)
-                        right = 1
-                        for a in range(1, answers_len):
-                            PractiseAnswerFillLog.objects.create(main=answer_log, content=answers[a], order=a)
-                            right_answer = ExamQuestionFill.objects.filter(main=now_question, content=answers[a], order=a)
-                            if not right_answer:
-                                # 有一个填空错误,整题错误
-                                right = 0
-                        if right:
-                            answer_log.status = PractiseAnswerLog.RIGHT
-                            instance.right_count += 1
-                        else:
-                            instance.wrong_count += 1
-                    else:
-                        # 判断
-                        if now_question.judgment == (answers[0] == 1):
-                            answer_log.status = PractiseAnswerLog.RIGHT
-                            instance.right_count += 1
-                        else:
-                            instance.wrong_count += 1
-                    instance.total_count += 1
-                    # 第一题
-                    if next_number == 1:
-                        instance.begin_answer = answer_log
-                    instance.end_answer = answer_log
-                    instance.submit_time = timezone.now()
-                    instance.save()
-                    answer_log.save()
+                            # 判断
+                            if now_question.judgment == (answers[0] == 1):
+                                answer_log.status = PractiseAnswerLog.RIGHT
+                                instance.right_count += 1
+                            else:
+                                answer_log.status = PractiseAnswerLog.WRONG
+                                instance.wrong_count += 1
+                        instance.total_count += 1
+                        # 第一题
+                        if not instance.begin_answer:
+                            instance.begin_answer = answer_log
+                        instance.end_answer = answer_log
+                        instance.submit_time = timezone.now()
+                        instance.save()
+                        answer_log.save()
 
                 question_data = {}
                 if instance.type == PractiseLog.SUBJECT:
@@ -144,35 +143,12 @@ class PractiseLogViewSet(CustomModelViewSet):
 
                 # 返回下一题
                 if next_practise:
-                    # 循环查询4个题型的试题,只到查询到试题
-                    # question = None
-                    # while not question and next_type <= ExamQuestion.JUDGMENT:
-                    #     question = questions.filter(type=int(next_type))[next_number - 1:next_number].first()
-                    #     if question:
-                    #         break
-                    #     next_type += 1
-                    #     next_number = 1
                     question = questions.filter(id=next_practise).first()
                 else:
+                    # 首次加载,选择第一个题
                     question = questions.filter().first()
 
                 if question:
-                        # 查询到下一题,返回题目和答案
-                        # 根据下一题,查询下下一题类型
-                        # next_question = None
-                        # while not next_question and next_type <= ExamQuestion.JUDGMENT:
-                        #     next_question = questions.filter(type=int(next_type))[next_number:next_number + 1].first()
-                        #     if next_question:
-                        #         if next_number == 0:
-                        #             next_number = 1
-                        #         break
-                        #     next_type += 1
-                        #     next_number = 0
-                        # next_question = questions.filter()[next_number:next_number + 1]
-                        # if next_question:
-                        #     next_number += 1
-                        # else:
-                        #     next_number = 0
                         question_data = {
                             'id': question.id,
                             'title': question.title,
@@ -185,12 +161,12 @@ class PractiseLogViewSet(CustomModelViewSet):
                             item1 = {
                                 'id': 1,
                                 'content': '正确',
-                                'answer': True if answer_log.status == PractiseAnswerLog.RIGHT else False
+                                'answer': True if answer_log and answer_log.status == PractiseAnswerLog.RIGHT else False
                             }
                             item0 = {
                                 'id': 0,
                                 'content': '错误',
-                                'answer': True if answer_log.status == PractiseAnswerLog.WRONG else False
+                                'answer': True if answer_log and answer_log.status == PractiseAnswerLog.WRONG else False
                             }
                             question_data['option'].append(item1)
                             question_data['option'].append(item0)
@@ -248,7 +224,7 @@ class PractiseLogViewSet(CustomModelViewSet):
                     )
                 # 判断题
                 judgment_questions_list = []
-                for judgment in questions.filter(type=ExamQuestion.MULTIPLE):
+                for judgment in questions.filter(type=ExamQuestion.JUDGMENT):
                     answer_log = PractiseAnswerLog.objects.filter(main=instance, question_id=judgment)
                     judgment_questions_list.append(
                         {

+ 10 - 8
apps/examination/examquestion/serializers.py

@@ -4,6 +4,7 @@ from rest_framework import serializers
 from utils.exceptions import CustomError
 from .models import *
 
+
 class ExamQuestionSerializer(serializers.ModelSerializer):
     subject = serializers.CharField(source='chapter.subject.id', read_only=True)
     subject_text = serializers.CharField(source='chapter.subject.name', read_only=True)
@@ -15,9 +16,9 @@ class ExamQuestionSerializer(serializers.ModelSerializer):
     items = serializers.SerializerMethodField()
 
     def get_items(self, obj):
-        if obj.type == ExamQuestion.SINGLE or obj.type == ExamQuestion.MULTIPLE:
+        if obj.type <= ExamQuestion.MULTIPLE:
             rows = ExamQuestionOption.objects.filter(main=obj, delete=False)
-            return ExamQuestionOptionSerializer(rows,many=True).data
+            return ExamQuestionOptionSerializer(rows, many=True).data
         elif obj.type == ExamQuestion.FILL:
             rows = ExamQuestionFill.objects.filter(main=obj, delete=False)
             return ExamQuestionFillSerializer(rows, many=True).data
@@ -39,6 +40,7 @@ class ExamQuestionSerializer(serializers.ModelSerializer):
         validated_data['create_user'] = self.context['request'].user
         instance = super(ExamQuestionSerializer, self).create(validated_data)
         rows = json.loads(self.initial_data['rows'])
+
         for row in rows:
             if not row['content']:
                 raise CustomError('答案不能为空,请填写答案!')
@@ -52,7 +54,7 @@ class ExamQuestionSerializer(serializers.ModelSerializer):
                 ExamQuestionFill.objects.create(
                     main=instance,
                     content=row['content'],
-                    order=row['order'],
+                    order=row['order'] + 1,
                 )
         return instance
 
@@ -62,10 +64,11 @@ class ExamQuestionSerializer(serializers.ModelSerializer):
         instance = super(ExamQuestionSerializer, self).update(instance, validated_data)
         rows = json.loads(self.initial_data['rows'])
         ExamQuestionOption.objects.filter(main=instance).update(delete=True, right=False)
+        ExamQuestionFill.objects.filter(main=instance).update(delete=True)
         for row in rows:
             if not row['content']:
                 raise CustomError('答案不能为空,请填写答案!')
-            if instance.type == ExamQuestion.SINGLE or instance.type == ExamQuestion.MULTIPLE:
+            if instance.type <= ExamQuestion.MULTIPLE:
                 if row['id']:
                     # 更新
                     ExamQuestionOption.objects.filter(main=instance, id=row['id']).update(delete=False,
@@ -79,7 +82,6 @@ class ExamQuestionSerializer(serializers.ModelSerializer):
                         right=row['right'],
                     )
             elif instance.type == ExamQuestion.FILL:
-                ExamQuestionFill.objects.filter(main=instance).update(delete=True)
                 if row['id']:
                     # 更新
                     ExamQuestionFill.objects.filter(main=instance, id=row['id']).update(delete=False,
@@ -90,18 +92,18 @@ class ExamQuestionSerializer(serializers.ModelSerializer):
                     ExamQuestionFill.objects.create(
                         main=instance,
                         content=row['content'],
-                        order=row['order'],
+                        order=row['order'] + 1,
                     )
         return instance
 
-class ExamQuestionOptionSerializer(serializers.ModelSerializer):
 
+class ExamQuestionOptionSerializer(serializers.ModelSerializer):
     class Meta:
         model = ExamQuestionOption
         fields = '__all__'
 
-class ExamQuestionFillSerializer(serializers.ModelSerializer):
 
+class ExamQuestionFillSerializer(serializers.ModelSerializer):
     class Meta:
         model = ExamQuestionFill
         fields = '__all__'

+ 2 - 2
apps/practise/practiselog/models.py

@@ -45,7 +45,7 @@ class PractiseAnswerLog(models.Model):
 
     main = models.ForeignKey(PractiseLog, verbose_name=u"练习记录", on_delete=models.PROTECT)
     question = models.ForeignKey(ExamQuestion, verbose_name=u"试题", on_delete=models.PROTECT)
-    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'回答状态')
+    status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'回答状态', null=True)
 
     class Meta:
         db_table = "practise_answer_log"
@@ -65,7 +65,7 @@ class PractiseAnswerOptionLog(models.Model):
 
 class PractiseAnswerFillLog(models.Model):
     main = models.ForeignKey(PractiseAnswerLog, verbose_name=u"练习答题记录", on_delete=models.PROTECT)
-    content = models.TextField(verbose_name=u"内容")
+    content = models.TextField(verbose_name=u"内容", blank=True)
     order = models.IntegerField(verbose_name=u'排序')
 
     class Meta:

+ 5 - 4
apps/practise/practiselog/serializers.py

@@ -13,7 +13,7 @@ class PractiseLogSerializer(serializers.ModelSerializer):
         next_practise = ''
         if obj.end_answer:
             now_type = obj.end_answer.question.type
-            questions = ExamQuestion.objects.filter(type=now_type).order_by('id').values_list('id', flat=True)
+            questions = ExamQuestion.objects.filter(type=now_type, delete=False).order_by('id').values_list('id', flat=True)
             now_question_index = list(questions).index(obj.end_answer.question.id)
             if now_question_index < (len(questions) -1):
                 # 该题型未练习完,继续返回该题型下的习题
@@ -22,7 +22,7 @@ class PractiseLogSerializer(serializers.ModelSerializer):
                 # 该题型已练习完,返回下一个题型下的习题
                 while now_type <= ExamQuestion.JUDGMENT:
                     now_type += 1
-                    questions = ExamQuestion.objects.filter(type=now_type).order_by('id').first()
+                    questions = ExamQuestion.objects.filter(type=now_type, delete=False).order_by('id').first()
                     if questions:
                         next_practise = questions.id
                         break
@@ -31,7 +31,8 @@ class PractiseLogSerializer(serializers.ModelSerializer):
     def get_end_answer(self, obj):
         if obj.end_answer:
             now_type = obj.end_answer.question.type
-            questions = ExamQuestion.objects.filter(type=now_type).order_by('id').values_list('id', flat=True)
+            # todo
+            questions = ExamQuestion.objects.filter(type=now_type, delete=False).order_by('id').values_list('id', flat=True)
             now_question_index = list(questions).index(obj.end_answer.question.id)
             name = '{0}/{1} {2}第{3}题'.format(obj.end_answer.question.chapter.name,
                                          obj.end_answer.question.chapter.subject.name,
@@ -44,7 +45,7 @@ class PractiseLogSerializer(serializers.ModelSerializer):
     def get_begin_answer(self, obj):
         if obj.begin_answer:
             now_type = obj.begin_answer.question.type
-            questions = ExamQuestion.objects.filter(type=now_type).order_by('id').values_list('id', flat=True)
+            questions = ExamQuestion.objects.filter(type=now_type, delete=False).order_by('id').values_list('id', flat=True)
             now_question_index = list(questions).index(obj.begin_answer.question.id)
             name = '{0}/{1} {2}第{3}题'.format(obj.begin_answer.question.chapter.name,
                                          obj.begin_answer.question.chapter.subject.name,

+ 21 - 9
uis/admin/examquestion/edit.html

@@ -368,17 +368,29 @@
             }
             else if (value === "3") {
                 //填空题
-                for (var i = 0; i < 3; i++) {
-                    oldData.push(
-                        {
-                            id: '',
-                            answer: '空白' + (i + 1),
-                            content: '',
-                        }
-                    )
+                if (items.length > 0) {
+                    for (var i = 0; i < items.length; i++) {
+                        oldData.push(
+                            {
+                                id: items[i].id,
+                                answer: '空白' + items[i].order,
+                                content: items[i].content,
+                            }
+                        )
+                    }
+                } else {
+                    for (var i = 0; i < 3; i++) {
+                        oldData.push(
+                            {
+                                id: '',
+                                answer: '空白' + (i + 1),
+                                content: '',
+                            }
+                        )
+                    }
                 }
                 _cols = _cols.slice(1, 4)
-                _cols[0] = {field: 'answer', title: '选项', width: '7%',}
+                    _cols[0] = {field: 'answer', title: '选项', width: '7%',}
             }
             else if (value === "4") {
                 //判断题