feat: edu接口完善

This commit is contained in:
caoqianming 2024-06-05 08:36:30 +08:00
parent 8548004690
commit e656f3e542
3 changed files with 27 additions and 19 deletions

View File

@ -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='试卷')

View File

@ -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)

View File

@ -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)