ソースを参照

试题管理web 保存

wushaodong 3 年 前
コミット
0ed6faf6cc

+ 0 - 1
apps/api/admin/examquestion/views.py

@@ -23,7 +23,6 @@ class ExamQuestionViewSet(CustomModelViewSet):
         return f.qs
 
     def destroy(self, request, *args, **kwargs):
-        print(444444444)
         with transaction.atomic():
             instance = self.get_object()
             instance.delete = True

+ 64 - 0
apps/examination/examquestion/serializers.py

@@ -1,5 +1,7 @@
 # coding=utf-8
+import json
 from rest_framework import serializers
+from utils.exceptions import CustomError
 from .models import *
 
 class ExamQuestionSerializer(serializers.ModelSerializer):
@@ -9,12 +11,74 @@ class ExamQuestionSerializer(serializers.ModelSerializer):
     create_user_text = serializers.CharField(source='create_user.username', read_only=True)
     type_text = serializers.CharField(source='get_type_display', read_only=True)
     difficulty_text = serializers.CharField(source='get_difficulty_display', read_only=True)
+    judgment = serializers.SerializerMethodField()
+
+    def get_judgment(self, obj):
+        if obj.judgment:
+            return "1"
+        return "0"
 
     class Meta:
         model = ExamQuestion
         fields = '__all__'
 
     def create(self, validated_data):
+        if 'judgment' in self.initial_data:
+            validated_data['judgment'] = True if self.initial_data['judgment'] == '1' else False
         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('答案不能为空,请填写答案!')
+            if instance.type == ExamQuestion.SINGLE or instance.type == ExamQuestion.MULTIPLE:
+                ExamQuestionOption.objects.create(
+                    main=instance,
+                    content=row['content'],
+                    right=row['right'],
+                )
+            elif instance.type == ExamQuestion.FILL:
+                ExamQuestionFill.objects.create(
+                    main=instance,
+                    content=row['content'],
+                    order=row['order'],
+                )
+        return instance
+
+    def update(self, instance, validated_data):
+        if 'judgment' in self.initial_data:
+            validated_data['judgment'] = True if self.initial_data['judgment'] == '1' else False
+        instance = super(ExamQuestionSerializer, self).update(instance, validated_data)
+        rows = json.loads(self.initial_data['rows'])
+        for row in rows:
+            if not row['content']:
+                raise CustomError('答案不能为空,请填写答案!')
+            if instance.type == ExamQuestion.SINGLE or instance.type == ExamQuestion.MULTIPLE:
+                ExamQuestionOption.objects.filter(main=instance).update(delete=True, right=False)
+                if row['id']:
+                    # 更新
+                    ExamQuestionOption.objects.filter(main=instance, id=row['id']).update(delete=False,
+                                                                                          content=row['content'],
+                                                                                          right=row['right'])
+                else:
+                    # 新增
+                    ExamQuestionOption.objects.create(
+                        main=instance,
+                        content=row['content'],
+                        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,
+                                                                                        content=row['content'],
+                                                                                        order=row['order'])
+                else:
+                    # 新增
+                    ExamQuestionFill.objects.create(
+                        main=instance,
+                        content=row['content'],
+                        order=row['order'],
+                    )
         return instance

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

@@ -20,8 +20,8 @@ class PractiseLog(models.Model):
     create_time = models.DateTimeField(verbose_name=u"开始时间", default=timezone.now, editable=False)
     submit_time = models.DateTimeField(verbose_name=u"结束时间", null=True, blank=True)
 
-    begin_answer = models.ForeignKey('PractiseAnswerLog', verbose_name=u"开始习题", null=True, editable=False, on_delete=models.PROTECT)
-    end_answer = models.ForeignKey('PractiseAnswerLog', verbose_name=u"结束习题", null=True, editable=False, on_delete=models.PROTECT)
+    begin_answer = models.ForeignKey('PractiseAnswerLog', verbose_name=u"开始习题", null=True, related_name='practise_log_begin_answer', editable=False, on_delete=models.PROTECT)
+    end_answer = models.ForeignKey('PractiseAnswerLog', verbose_name=u"结束习题", null=True, related_name='practise_log_end_answer', editable=False, on_delete=models.PROTECT)
     right_count = models.IntegerField(verbose_name=u'正确数量', default=0, editable=False)
     wrong_count = models.IntegerField(verbose_name=u'错误数量', default=0, editable=False)
     total_count = models.IntegerField(verbose_name=u'总数量', default=0, editable=False)
@@ -70,4 +70,4 @@ class PractiseAnswerFillLog(models.Model):
         db_table = "practise_answer_fill_log"
         ordering = ['order', 'id']
         verbose_name = u"填空题回答"
-        default_permissions = ()
+        default_permissions = ()

+ 43 - 13
uis/admin/examquestion/edit.html

@@ -142,6 +142,7 @@
                 layedit.setContent(editIndex, editdata.title, false);
                 chapter_id = editdata.chapter;
                 subjectChange(editdata.subject)
+                typeChange(editdata.type.toString())
             }
         };
         var subjectChange = function (value) {
@@ -178,7 +179,36 @@
 
         form.on('submit(component-form-element)', function (data) {
             data.field.title = layedit.getContent(editIndex);
-            var rows = table.cache[layTableId];
+            var id_type = data.field.type
+            var oldData = table.cache[layTableId], rows = [], item = {}, error_msg = '', checked = 0
+
+            for (var i = 0; i < oldData.length; i++) {
+                //单选题、多选、填空
+                if (!oldData[i].content) {
+                    error_msg = '选项' + oldData[i].answer + '请填写答案'
+                    break
+                }
+                if (oldData[i].LAY_CHECKED) {
+                    checked += 1
+                }
+                item = {
+                    id: oldData[i].id,
+                    content: oldData[i].content,
+                    right: oldData[i].LAY_CHECKED ? 1 : 0,
+                    order: oldData[i].LAY_TABLE_INDEX,
+                }
+                rows.push(item)
+
+            }
+            if (error_msg) {
+                layer.msg(error_msg, {icon: 2});
+                return false
+            }
+            if (!checked && id_type !== "3") {
+                layer.msg('请选择一个正确答案!', {icon: 2});
+                return false
+            }
+            data.field.rows = JSON.stringify(rows)
             admin.req({
                 url: url
                 , data: data.field
@@ -210,7 +240,7 @@
         /////////////////////table
         var tbWidth = $("#tableRes").width();
         var cols = [
-            {field: 'is_answer', title: '正确答案', type: 'radio', width: '7%',},
+            {title: '正确答案', type: 'radio', width: '7%',},
             {field: 'answer', title: '选项', width: '7%',},
             {field: 'content', title: '答案', edit: 'text', width: '50%',},
             {
@@ -245,8 +275,8 @@
                 var id_type = $('#id_type').val()
                 for (var i = 0; i < oldData.length; i++) {
                     if (id_type === "1" || id_type === "2") {
+                        //单选题、多选
                         oldData[i].answer = aswers[i]
-                        //单选题
                     }
                     else if (id_type === "3") {
                         //填空题
@@ -282,38 +312,39 @@
         form.on('select(typeChange)', function (data) {
             // 更换题型,重新加载table
             if (!data.value) return;
+            typeChange(data.value)
+        })
+        var typeChange = function (value) {
             layui.$('#id_panduan').addClass('layui-hide')
             layui.$('#id_table').removeClass('layui-hide')
             var oldData = [], _cols = cols
-            if (data.value === "1") {
+            if (value === "1") {
                 //单选题
                 for (var i = 0; i < 4; i++) {
                     oldData.push(
                         {
                             id: '',
-                            is_answer: '',
                             answer: aswers[i],
                             content: '',
                         }
                     )
                 }
-                _cols[0] = {field: 'is_answer', title: '正确答案', type: 'radio', width: '7%',}
+                _cols[0] = {title: '正确答案', type: 'radio', width: '7%',}
             }
-            else if (data.value === "2") {
+            else if (value === "2") {
                 //多选题
                 for (var i = 0; i < 5; i++) {
                     oldData.push(
                         {
                             id: '',
-                            is_answer: '',
                             answer: aswers[i],
                             content: '',
                         }
                     )
                 }
-                _cols[0] = {field: 'is_answer', title: '正确答案', type: 'checkbox', width: '7%',}
+                _cols[0] = {title: '正确答案', type: 'checkbox', width: '7%',}
             }
-            else if (data.value === "3") {
+            else if (value === "3") {
                 //填空题
                 for (var i = 0; i < 3; i++) {
                     oldData.push(
@@ -327,7 +358,7 @@
                 _cols = _cols.slice(1, 4)
                 _cols[0] = {field: 'answer', title: '选项', width: '7%',}
             }
-            else if (data.value === "4") {
+            else if (value === "4") {
                 //判断题
                 layui.$('#id_panduan').removeClass('layui-hide')
                 layui.$('#id_table').addClass('layui-hide')
@@ -337,7 +368,7 @@
                 data: oldData,
                 cols: [_cols],
             });
-        });
+        }
         $('#add_answer').on('click', function () {
             var id_type = $('#id_type').val()
             if (!id_type) {
@@ -352,7 +383,6 @@
                 oldData.push(
                     {
                         id: '',
-                        is_answer: '',
                         answer: aswers[oldData_len],
                         content: '',
                     }