From e656f3e542a70474ee3415154e3994a2a503fd2d Mon Sep 17 00:00:00 2001 From: caoqianming Date: Wed, 5 Jun 2024 08:36:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20edu=E6=8E=A5=E5=8F=A3=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/edu/models.py | 3 +++ apps/edu/serializers.py | 36 ++++++++++++++++++++---------------- apps/edu/views.py | 7 ++++--- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/apps/edu/models.py b/apps/edu/models.py index 17d942cd..6a775397 100644 --- a/apps/edu/models.py +++ b/apps/edu/models.py @@ -57,6 +57,9 @@ class Paper(CommonAModel): def __str__(self): return self.name + @property + def detail(self): + return PaperQuestion.objects.filter(paper=self) class PaperQuestion(BaseModel): paper = models.ForeignKey(Paper, on_delete=models.CASCADE, verbose_name='试卷') diff --git a/apps/edu/serializers.py b/apps/edu/serializers.py index 566cb780..7da0bc58 100644 --- a/apps/edu/serializers.py +++ b/apps/edu/serializers.py @@ -3,6 +3,7 @@ from rest_framework import serializers from .models import Questioncat, Question, Paper, PaperQuestion, Exam, ExamRecord, AnswerDetail from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE from django.db import transaction +from apps.utils.snowflake import idWorker class QuestioncatSerializer(CustomModelSerializer): class Meta: @@ -15,13 +16,6 @@ class QuestionSerializer(CustomModelSerializer): model = Question fields = '__all__' -class PaperQuestionSerializer(CustomModelSerializer): - class Meta: - model = PaperQuestion - fields = '__all__' - read_only_fields = EXCLUDE_FIELDS_BASE - - class PaperListSerializer(CustomModelSerializer): class Meta: model = Paper @@ -32,18 +26,29 @@ class PaperPatchSerializer(CustomModelSerializer): model = Paper fields = ["name"] +class PaperQuestionSerializer(CustomModelSerializer): + question_name = serializers.CharField(source="question.name", read_only=True) + question_type = serializers.CharField(source="question.type", read_only=True) + class Meta: + model = PaperQuestion + fields = '__all__' + read_only_fields = EXCLUDE_FIELDS_BASE + ["paper"] + class PaperSerializer(CustomModelSerializer): detail = PaperQuestionSerializer(many=True) class Meta: model = Paper exclude = ["questions"] - read_only_fields = ["editable"] + EXCLUDE_FIELDS + read_only_fields = EXCLUDE_FIELDS def create(self, validated_data): detail = validated_data.pop("detail", []) with transaction.atomic(): - paper = super().create(validated_data) - qs = [PaperQuestion(paper=paper, question=item["question"], total_score=item["total_score"], sort=item["sort"]) for item in detail] + question_ids = [item["question"] for item in detail] + if len(question_ids) != len(set(question_ids)): + raise serializers.ValidationError("存在重复的题目") + paper = Paper.objects.create(**validated_data) + qs = [PaperQuestion(id=idWorker.get_id(), paper=paper, question=item["question"], total_score=item["total_score"], sort=item["sort"]) for item in detail] PaperQuestion.objects.bulk_create(qs) return paper @@ -53,6 +58,8 @@ class PaperSerializer(CustomModelSerializer): paper = super().update(instance, validated_data) # 删除未有的数据 question_ids = [item["question"] for item in detail] + if len(question_ids) != len(set(question_ids)): + raise serializers.ValidationError("存在重复的题目") PaperQuestion.objects.filter(paper=paper).exclude(question__id__in=question_ids).delete() # 更新新数据 for item in detail: @@ -67,12 +74,9 @@ class PaperSerializer(CustomModelSerializer): return paper def to_representation(self, instance): - representation = super().to_representation(instance) - detail_data = representation['detail'] - sorted_detail_data = sorted(detail_data, key=lambda x: (x['sort'], x['create_time'])) - representation['detail'] = sorted_detail_data - return sorted_detail_data - + ret = super().to_representation(instance) + ret['detail'] = sorted(ret['detail'], key=lambda x: (x['sort'], x['create_time'])) + return ret class ExamSerializer(CustomModelSerializer): create_by_name = serializers.CharField(source='create_by.name', read_only=True) diff --git a/apps/edu/views.py b/apps/edu/views.py index 1f4b980a..1d47310d 100644 --- a/apps/edu/views.py +++ b/apps/edu/views.py @@ -45,7 +45,8 @@ class PaperViewSet(CustomModelViewSet): def update(self, request, *args, **kwargs): obj: Paper = self.get_object() - if Exam.objects.filter(paper=obj).exists(): + qs = Exam.objects.filter(paper=obj) + if qs.exists(): raise ParseError("存在考试,该试卷不可编辑") return super().update(request, *args, **kwargs) @@ -69,7 +70,7 @@ class ExamViewSet(CustomModelViewSet): def get_queryset(self): qs = super().get_queryset() - if has_perm(self.request.user, 'exam.view'): + if has_perm(self.request.user, ["exam.view"]): return qs user:User = self.request.user dept = user.belong_dept if user else None @@ -138,7 +139,7 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, C def get_queryset(self): qs = super().get_queryset() - if has_perm(self.request.user, "examrecord.view"): + if has_perm(self.request.user, ["examrecord.view"]): return qs return qs.filter(create_by=self.request.user)