cma_search/server/apps/exam/serializers.py

230 lines
7.8 KiB
Python

from rest_framework.serializers import ModelSerializer, CharField, Serializer, SerializerMethodField, FloatField
from rest_framework import serializers
from apps.exam.models import Question, Questioncat, Paper, Exam, PaperQuestion, ExamRecord, AnswerDetail
from apps.edu.serializers import CourseSerializer
from apps.system.serializers import OrganizationSerializer, UserListSerializer
from apps.system.models import Organization, User
class QuestioncatSerializer(ModelSerializer):
class Meta:
model = Questioncat
fields = '__all__'
class QuestionSerializer(ModelSerializer):
questioncat_name = serializers.CharField(source='questioncat.name', read_only=True)
class Meta:
model = Question
fields = '__all__'
class PaperSerializer(ModelSerializer):
class Meta:
model = Paper
exclude = ('questions',)
class PaperQuestionSerializer(ModelSerializer):
class Meta:
model = PaperQuestion
fields = ['question', 'total_score']
class PaperCreateUpdateSerializer(ModelSerializer):
questions_ = PaperQuestionSerializer(many=True)
class Meta:
model = Paper
fields = '__all__'
class PaperQuestionDetailSerializer(ModelSerializer):
name = serializers.ReadOnlyField(source='question.name')
options = serializers.ReadOnlyField(source='question.options')
right = serializers.ReadOnlyField(source='question.right')
type = serializers.ReadOnlyField(source='question.type')
img = serializers.ReadOnlyField(source='question.img')
questioncat_name = serializers.ReadOnlyField(
source='question.questioncat.name')
level = serializers.ReadOnlyField(source='question.level')
class Meta:
model = PaperQuestion
fields = ('id', 'name', 'options', 'right', 'type', 'level',
'total_score', 'questioncat_name', 'img', 'question')
class PaperQuestionShortSerializer(ModelSerializer):
class Meta:
model = PaperQuestion
fields = '__all__'
class PaperDetailSerializer(ModelSerializer):
questions_ = SerializerMethodField()
class Meta:
model = Paper
fields = '__all__'
def get_questions_(self, instance):
pqs = PaperQuestion.objects.filter(paper=instance)
return PaperQuestionDetailSerializer(pqs, many=True).data
class ExamCreateUpdateSerializer(ModelSerializer):
# participant_dep = serializers.PrimaryKeyRelatedField(many=True, queryset=Organization.objects.all())
# participant_user = serializers.PrimaryKeyRelatedField(many=True, queryset=User.objects.all())
# participant_dep = serializers.CharField(source='participant_dep.id', read_only=True)
# participant_user = serializers.CharField(source='participant_user.id', read_only=True)
class Meta:
model = Exam
fields = ['name', 'place', 'open_time',
'close_time', 'proctor_name', 'proctor_phone', 'chance', 'paper', 'participant_dep', 'participant_user']
# def create(self, validated_data):
# print("------------", validated_data)
# eus_data = validated_data.pop('participant_user', None)
# deps_data = validated_data.pop('participant_dep', None)
# print("------------", eus_data, deps_data)
# exam_obj = Exam.objects.create(**validated_data)
# if eus_data:
# exam_obj.participant_user.set(eus_data) # 哪些用户参与考试, 使用set方法来设置ManyToMany关系
# if deps_data:
# exam_obj.participant_dep.set(deps_data) # 哪些部门参与考试
# return super().create(validated_data)
# def update(self, instance, validated_data):
# eus = validated_data.pop('exam_user', None)
# deps = validated_data.pop('dep', None)
# if eus:
# instance.participant_user.set(eus)
# if deps:
# instance.participant_dep.set(deps)
# # for attr, value in validated_data.items():
# # setattr(instance, attr, value)
# # instance.save()
# return instance
# class ExamUserSerializer(ModelSerializer):
# class Meta:
# model = ExamUser
# fields = ['id', 'exam_id','user_id']
# class ExamOriSerializer(ModelSerializer):
# class Meta:
# model = ExamDep
# fields = ['id', 'exam_id','organization_id']
class ExamListSerializer(ModelSerializer):
create_by_name = CharField(source='create_by.name', read_only=True)
paper_ = PaperSerializer(source='paper', read_only=True)
course_ = CourseSerializer(source='course_name', read_only=True)
participant_user = UserListSerializer(many=True, read_only=True)
class Meta:
model = Exam
fields = '__all__'
class ExamDetailSerializer(ModelSerializer):
create_by_name = CharField(source='create_by.name', read_only=True)
paper_ = PaperSerializer(source='paper', read_only=True)
class Meta:
model = Exam
fields = '__all__'
class ExamAttendSerializer(Serializer):
code = CharField(label="考试编号")
class ExamRecordListSerializer(serializers.ModelSerializer):
"""
考试列表序列化
"""
took_format = serializers.SerializerMethodField()
create_by_name = serializers.CharField(
source='create_by.name', read_only=True)
class Meta:
model = ExamRecord
exclude = ('detail',)
def get_took_format(self, obj):
m, s = divmod(obj.took, 60)
h, m = divmod(m, 60)
return "%02d:%02d:%02d" % (h, m, s)
class ExamRecordDetailSerializer(serializers.ModelSerializer):
"""
考试详情序列化
"""
took_format = serializers.SerializerMethodField()
questions_ = serializers.SerializerMethodField()
class Meta:
model = ExamRecord
exclude = ('detail',)
def get_took_format(self, obj):
m, s = divmod(obj.took, 60)
h, m = divmod(m, 60)
return "%02d:%02d:%02d" % (h, m, s)
def get_questions_(self, obj):
objs = AnswerDetail.objects.select_related('question').filter(
examrecord=obj).order_by('id')
return AnswerDetailSerializer(instance=objs, many=True).data
class AnswerDetailUpdateSerializer(serializers.Serializer):
id = serializers.CharField(label='下发ID')
user_answer = serializers.JSONField(label='作答')
class ExamRecordSubmitSerializer(serializers.ModelSerializer):
questions_ = AnswerDetailUpdateSerializer(many=True)
class Meta:
model = ExamRecord
fields = ['questions_']
class AnswerDetailSerializer(ModelSerializer):
name = serializers.ReadOnlyField(source='question.name')
options = serializers.ReadOnlyField(source='question.options')
right = serializers.ReadOnlyField(source='question.right')
type = serializers.ReadOnlyField(source='question.type')
img = serializers.ReadOnlyField(source='question.img')
questioncat_name = serializers.ReadOnlyField(
source='question.questioncat.name')
level = serializers.ReadOnlyField(source='question.level')
class Meta:
model = AnswerDetail
fields = ['id', 'question', 'name', 'options', 'right', 'type', 'level',
'total_score', 'questioncat_name', 'img', 'user_answer', 'score', 'is_right']
class AnswerDetailOutSerializer(ModelSerializer):
name = serializers.ReadOnlyField(source='question.name')
options = serializers.ReadOnlyField(source='question.options')
type = serializers.ReadOnlyField(source='question.type')
img = serializers.ReadOnlyField(source='question.img')
questioncat_name = serializers.ReadOnlyField(
source='question.questioncat.name')
level = serializers.ReadOnlyField(source='question.level')
class Meta:
model = AnswerDetail
fields = ['id', 'question', 'name', 'options', 'type', 'level',
'total_score', 'questioncat_name', 'img', 'user_answer', 'score', 'is_right']