feat: edu接口完善
This commit is contained in:
parent
8548004690
commit
e656f3e542
|
@ -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='试卷')
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
Loading…
Reference in New Issue