218 lines
7.4 KiB
Python
218 lines
7.4 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):
|
|
|
|
class Meta:
|
|
model = Exam
|
|
fields = ['name', 'place', 'open_time','course_name', 'certificate',
|
|
'close_time', 'proctor_name', 'proctor_phone', 'chance', 'paper', 'participant_dep', 'participant_user']
|
|
|
|
|
|
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)
|
|
user_count = serializers.SerializerMethodField()
|
|
submit_count = serializers.SerializerMethodField()
|
|
limit = CharField(source='paper.limit', read_only=True)
|
|
examrecords = serializers.SerializerMethodField()
|
|
class Meta:
|
|
model = Exam
|
|
fields = '__all__'
|
|
|
|
#参与考试的 数量
|
|
def get_user_count(self, obj):
|
|
total_user_count = 0
|
|
for p in obj.participant_dep.all():
|
|
user_count = User.objects.filter(dept_id = p.id).count()
|
|
total_user_count += user_count
|
|
return total_user_count+obj.participant_user.count()
|
|
|
|
# 已经提交的数量
|
|
def get_submit_count(self, obj):
|
|
exam = ExamRecord.objects.select_related('exam').filter(exam=obj, is_submited=True)
|
|
submit_user = len(set([i.create_by for i in exam]))
|
|
return submit_user
|
|
|
|
def get_examrecords(self, obj):
|
|
user = self.context['request'].user
|
|
exam_record = ExamRecord.objects.filter(exam=obj, create_by=user).values('id', 'score', 'is_pass')
|
|
return list(exam_record)
|
|
|
|
|
|
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)
|
|
exam_name = serializers.CharField(
|
|
source='exam.name', read_only=True)
|
|
blong_dept_name = serializers.CharField(
|
|
source='belong_dept.name', read_only=True)
|
|
cert_number = serializers.CharField(source='cert_er.证书编号', read_only=True)
|
|
cert_path = serializers.CharField(source='cert_er.证书地址', 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')
|
|
resolution = serializers.ReadOnlyField(source='question.resolution')
|
|
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', 'resolution']
|
|
|
|
|
|
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']
|