feat: edu接口完善
This commit is contained in:
parent
8548004690
commit
e656f3e542
|
@ -57,6 +57,9 @@ class Paper(CommonAModel):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def detail(self):
|
||||||
|
return PaperQuestion.objects.filter(paper=self)
|
||||||
|
|
||||||
class PaperQuestion(BaseModel):
|
class PaperQuestion(BaseModel):
|
||||||
paper = models.ForeignKey(Paper, on_delete=models.CASCADE, verbose_name='试卷')
|
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 .models import Questioncat, Question, Paper, PaperQuestion, Exam, ExamRecord, AnswerDetail
|
||||||
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE
|
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE
|
||||||
from django.db import transaction
|
from django.db import transaction
|
||||||
|
from apps.utils.snowflake import idWorker
|
||||||
|
|
||||||
class QuestioncatSerializer(CustomModelSerializer):
|
class QuestioncatSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -15,13 +16,6 @@ class QuestionSerializer(CustomModelSerializer):
|
||||||
model = Question
|
model = Question
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
class PaperQuestionSerializer(CustomModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = PaperQuestion
|
|
||||||
fields = '__all__'
|
|
||||||
read_only_fields = EXCLUDE_FIELDS_BASE
|
|
||||||
|
|
||||||
|
|
||||||
class PaperListSerializer(CustomModelSerializer):
|
class PaperListSerializer(CustomModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Paper
|
model = Paper
|
||||||
|
@ -32,18 +26,29 @@ class PaperPatchSerializer(CustomModelSerializer):
|
||||||
model = Paper
|
model = Paper
|
||||||
fields = ["name"]
|
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):
|
class PaperSerializer(CustomModelSerializer):
|
||||||
detail = PaperQuestionSerializer(many=True)
|
detail = PaperQuestionSerializer(many=True)
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Paper
|
model = Paper
|
||||||
exclude = ["questions"]
|
exclude = ["questions"]
|
||||||
read_only_fields = ["editable"] + EXCLUDE_FIELDS
|
read_only_fields = EXCLUDE_FIELDS
|
||||||
|
|
||||||
def create(self, validated_data):
|
def create(self, validated_data):
|
||||||
detail = validated_data.pop("detail", [])
|
detail = validated_data.pop("detail", [])
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
paper = super().create(validated_data)
|
question_ids = [item["question"] for item in detail]
|
||||||
qs = [PaperQuestion(paper=paper, question=item["question"], total_score=item["total_score"], sort=item["sort"]) 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)
|
PaperQuestion.objects.bulk_create(qs)
|
||||||
return paper
|
return paper
|
||||||
|
|
||||||
|
@ -53,6 +58,8 @@ class PaperSerializer(CustomModelSerializer):
|
||||||
paper = super().update(instance, validated_data)
|
paper = super().update(instance, validated_data)
|
||||||
# 删除未有的数据
|
# 删除未有的数据
|
||||||
question_ids = [item["question"] for item in detail]
|
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()
|
PaperQuestion.objects.filter(paper=paper).exclude(question__id__in=question_ids).delete()
|
||||||
# 更新新数据
|
# 更新新数据
|
||||||
for item in detail:
|
for item in detail:
|
||||||
|
@ -67,12 +74,9 @@ class PaperSerializer(CustomModelSerializer):
|
||||||
return paper
|
return paper
|
||||||
|
|
||||||
def to_representation(self, instance):
|
def to_representation(self, instance):
|
||||||
representation = super().to_representation(instance)
|
ret = super().to_representation(instance)
|
||||||
detail_data = representation['detail']
|
ret['detail'] = sorted(ret['detail'], key=lambda x: (x['sort'], x['create_time']))
|
||||||
sorted_detail_data = sorted(detail_data, key=lambda x: (x['sort'], x['create_time']))
|
return ret
|
||||||
representation['detail'] = sorted_detail_data
|
|
||||||
return sorted_detail_data
|
|
||||||
|
|
||||||
|
|
||||||
class ExamSerializer(CustomModelSerializer):
|
class ExamSerializer(CustomModelSerializer):
|
||||||
create_by_name = serializers.CharField(source='create_by.name', read_only=True)
|
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):
|
def update(self, request, *args, **kwargs):
|
||||||
obj: Paper = self.get_object()
|
obj: Paper = self.get_object()
|
||||||
if Exam.objects.filter(paper=obj).exists():
|
qs = Exam.objects.filter(paper=obj)
|
||||||
|
if qs.exists():
|
||||||
raise ParseError("存在考试,该试卷不可编辑")
|
raise ParseError("存在考试,该试卷不可编辑")
|
||||||
return super().update(request, *args, **kwargs)
|
return super().update(request, *args, **kwargs)
|
||||||
|
|
||||||
|
@ -69,7 +70,7 @@ class ExamViewSet(CustomModelViewSet):
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = super().get_queryset()
|
qs = super().get_queryset()
|
||||||
if has_perm(self.request.user, 'exam.view'):
|
if has_perm(self.request.user, ["exam.view"]):
|
||||||
return qs
|
return qs
|
||||||
user:User = self.request.user
|
user:User = self.request.user
|
||||||
dept = user.belong_dept if user else None
|
dept = user.belong_dept if user else None
|
||||||
|
@ -138,7 +139,7 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, C
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
qs = super().get_queryset()
|
qs = super().get_queryset()
|
||||||
if has_perm(self.request.user, "examrecord.view"):
|
if has_perm(self.request.user, ["examrecord.view"]):
|
||||||
return qs
|
return qs
|
||||||
return qs.filter(create_by=self.request.user)
|
return qs.filter(create_by=self.request.user)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue