From f3b52511b56ef2dd7650b9a56c7ebb3f90ed2f0c Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 14 Nov 2022 11:13:47 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E7=AD=94=E9=A2=98bug=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exam/migrations/0004_auto_20221114_1108.py | 18 ++++++++++++++++++ server/apps/exam/models.py | 2 +- server/apps/exam/serializers.py | 4 ++-- server/apps/exam/views.py | 4 +++- 4 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 server/apps/exam/migrations/0004_auto_20221114_1108.py diff --git a/server/apps/exam/migrations/0004_auto_20221114_1108.py b/server/apps/exam/migrations/0004_auto_20221114_1108.py new file mode 100644 index 0000000..a26aad5 --- /dev/null +++ b/server/apps/exam/migrations/0004_auto_20221114_1108.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.5 on 2022-11-14 03:08 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('exam', '0003_auto_20221108_0901'), + ] + + operations = [ + migrations.AlterField( + model_name='examrecord', + name='end_time', + field=models.DateTimeField(blank=True, null=True, verbose_name='结束答题时间'), + ), + ] diff --git a/server/apps/exam/models.py b/server/apps/exam/models.py index dd35c3f..203f6a9 100644 --- a/server/apps/exam/models.py +++ b/server/apps/exam/models.py @@ -108,7 +108,7 @@ class ExamRecord(CommonAModel): score = models.FloatField(default=0, verbose_name='得分') took = models.IntegerField(default=0, verbose_name='耗时(秒)') start_time = models.DateTimeField(verbose_name='开始答题时间') - end_time = models.DateTimeField(verbose_name='结束答题时间') + end_time = models.DateTimeField(verbose_name='结束答题时间', null=True, blank=True) detail = models.ManyToManyField(Question, verbose_name='答题记录', through='AnswerDetail') is_pass = models.BooleanField(default=True, verbose_name='是否通过') exam = models.ForeignKey(Exam, verbose_name='关联的正式考试', null=True, blank=True, on_delete= models.SET_NULL) diff --git a/server/apps/exam/serializers.py b/server/apps/exam/serializers.py index 9313fbf..5c4afbf 100644 --- a/server/apps/exam/serializers.py +++ b/server/apps/exam/serializers.py @@ -164,7 +164,7 @@ class AnswerDetailSerializer(ModelSerializer): level = serializers.ReadOnlyField(source='question.level') class Meta: - model = PaperQuestion + model = AnswerDetail fields = ['id', 'question', 'name', 'options', 'right', 'type', 'level', 'total_score', 'questioncat_name', 'img', 'user_answer', 'score', 'is_right'] @@ -179,6 +179,6 @@ class AnswerDetailOutSerializer(ModelSerializer): level = serializers.ReadOnlyField(source='question.level') class Meta: - model = PaperQuestion + model = AnswerDetail fields = ['id', 'question', 'name', 'options', 'type', 'level', 'total_score', 'questioncat_name', 'img', 'user_answer', 'score', 'is_right'] diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index b80ef21..3b4f96a 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -287,6 +287,7 @@ class ExamViewSet(CreateUpdateCustomMixin, ModelViewSet): return Response(status=204) @action(methods=['post'], detail=True, perms_map=[{'post': '*'}], serializer_class=Serializer, permission_classes = [IsAuthenticated]) + @transaction.atomic def start(self, request, *args, **kwargs): """ 开始考试 @@ -371,6 +372,7 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): return self.get_paginated_response(serializer.data) @action(methods=['post'], detail=True, perms_map=[{'post': '*'}], serializer_class=ExamRecordSubmitSerializer, permission_classes = [IsAuthenticated]) + @transaction.atomic def submit(self, request, pk=None): ''' 提交答卷 @@ -415,4 +417,4 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): er.end_time = now er.is_submited = True er.save() - return Response() \ No newline at end of file + return Response(ExamRecordListSerializer(instance=er).data) \ No newline at end of file From 692c096f8de0d253c23a5c191c827c4b08c087fe Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 14 Nov 2022 14:08:39 +0800 Subject: [PATCH 2/6] er create_by bug --- server/apps/exam/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index 3b4f96a..2a899a4 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -313,6 +313,7 @@ class ExamViewSet(CreateUpdateCustomMixin, ModelViewSet): er.start_time = now er.is_pass = False er.exam = exam + er.create_by = request.user er.save() ret = {} ret['examrecord'] = er.id From 4f1d695e5ff97ec38fdb2ece92813917184c1deb Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 14 Nov 2022 14:31:12 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=88=A4=E5=8D=B7bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/exam/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index 2a899a4..0058199 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -394,7 +394,7 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): vdata = serializer.validated_data questions_ = vdata['questions_'] # 后端判卷 - ads = AnswerDetail.objects.select_related('question').filter(examrecord=er).order_by('id').values('id', 'question__right', 'total_score', 'question__type') + ads = AnswerDetail.objects.select_related('question').filter(examrecord=er).order_by('id') total_score = 0 try: for index, ad in enumerate(ads): From 10104b88f64c53990df231bff60e5117430c97ec Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 14 Nov 2022 14:33:53 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=88=A4=E5=8D=B7bug2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/exam/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index 0058199..30d6f6c 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -399,12 +399,12 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): try: for index, ad in enumerate(ads): ad.user_answer = questions_[index]['user_answer'] - if ad.question__type == '多选': - if set(ad.question__right) == set(ad.user_answer): + if ad.question.type == '多选': + if set(ad.question.right) == set(ad.user_answer): ad.is_right = True ad.score = ad.total_score else: - if ad.question__right == ad.user_answer: + if ad.question.right == ad.user_answer: ad.is_right = True ad.score = ad.total_score ad.save() From f16b7e7b458d1916c02b2f0bab6a306ac416b368 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 14 Nov 2022 15:46:57 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E8=80=83=E8=AF=95=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/exam/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index 30d6f6c..97264fb 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render from rest_framework.viewsets import ModelViewSet, GenericViewSet -from rest_framework.mixins import ListModelMixin, DestroyModelMixin +from rest_framework.mixins import ListModelMixin, DestroyModelMixin, RetrieveModelMixin from apps.exam.exports import export_question from apps.exam.models import Question, Questioncat, PaperQuestion from apps.exam.serializers import (QuestionSerializer, QuestioncatSerializer, PaperSerializer, ExamDetailSerializer, ExamRecordDetailSerializer, ExamListSerializer, @@ -306,7 +306,7 @@ class ExamViewSet(CreateUpdateCustomMixin, ModelViewSet): if exam.paper: er = ExamRecord() er.type = '正式考试' - er.name = '正式考试' + now.strftime('%Y%m%d%H%M') + er.name = '正式考试' + datetime.now().strftime('%Y%m%d%H%M') er.limit = exam.paper.limit er.paper = exam.paper er.total_score = exam.paper.total_score @@ -328,7 +328,7 @@ class ExamViewSet(CreateUpdateCustomMixin, ModelViewSet): raise ParseError('暂不支持') -class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, GenericViewSet): +class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, GenericViewSet): """ 考试记录列表和详情 """ From e22aed286bc516bb8ebaeb0a33d690755d2a93d8 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 14 Nov 2022 15:56:27 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E8=80=83=E8=AF=95=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/exam/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index 97264fb..e4c641e 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -332,7 +332,7 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, G """ 考试记录列表和详情 """ - perms_map = {'get': 'examrecord', 'post': '*', 'delete':'examrecord'} + perms_map = {'get': '*', 'post': '*', 'delete':'examrecord'} queryset = ExamRecord.objects.select_related('create_by') serializer_class = ExamRecordListSerializer ordering_fields = ['create_time', 'score', 'took', 'update_time']