examtest/test_server/examtest/serializers.py

259 lines
10 KiB
Python

from rest_framework import serializers
from question.models import Questioncat
from crm.models import Consumer
from .models import Exam, ExamTest, AnswerDetail, Banner
from .models_paper import TestRule, WorkScope, Paper, PaperQuestions
from question.serializers import QuestionSerializer
class BannerSerializer(serializers.ModelSerializer):
"""
轮播图序列化
"""
class Meta:
model = Banner
fields = ('id','name','path', 'url', 'sort')
class TestRuleSerializer(serializers.ModelSerializer):
"""
规则序列化
"""
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
class Meta:
model = TestRule
fields = '__all__'
class WorkScopeSerializer(serializers.ModelSerializer):
"""
工作类别序列化
"""
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
subject_name = serializers.StringRelatedField(source='subject',read_only=True)
class Meta:
model = WorkScope
fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('questioncat',)
return queryset
class MoniTestSerializer(serializers.ModelSerializer):
"""
考试序列化
"""
start_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
end_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
consumer = serializers.PrimaryKeyRelatedField(queryset=Consumer.objects.all(), required=False)
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
class Meta:
model = ExamTest
fields = '__all__'
class ExamTestListSerializer(serializers.ModelSerializer):
"""
考试列表序列化
"""
start_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
end_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
workscope_name = serializers.StringRelatedField(source='workscope', read_only=True)
paper_name = serializers.StringRelatedField(source='paper', read_only=True)
exam_name = serializers.StringRelatedField(source='exam', read_only=True)
consumer_name = serializers.SerializerMethodField()
consumer_username = serializers.CharField(source='consumer.username', read_only=True)
took_format = serializers.SerializerMethodField()
consumer_company_name = serializers.SerializerMethodField()
class Meta:
model = ExamTest
exclude = ('detail',)
def get_consumer_name(self, obj):
return obj.consumer.name
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_consumer_company_name(self, obj):
if obj.consumer.company:
return obj.consumer.company.name
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('consumer','paper', 'workscope', 'exam')
return queryset
from question.serializers import QuestionSerializer
class AnswerDetailSerializer(serializers.ModelSerializer):
question = QuestionSerializer()
class Meta:
model = AnswerDetail
exclude = ('examtest',)
# fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
# select_related for "to-one" relationships
queryset = queryset.select_related('examtest',)
# prefetch_related for "to-many" relationships
queryset = queryset.prefetch_related(
'question',)
# Prefetch for subsets of relationships
# queryset = queryset.prefetch_related(
# Prefetch('unaffiliated_attendees',
# queryset=Attendee.objects.filter(organization__isnull=True))
# )
return queryset
class AnswerDetailCreateSerializer(serializers.ModelSerializer):
class Meta:
model = AnswerDetail
fields = '__all__'
class PaperSerializer(serializers.ModelSerializer):
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
workscope_name = serializers.StringRelatedField(source='workscope', read_only=True)
class Meta:
model = Paper
exclude = ('questions',)
class PaperQuestionsDetailSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(source='question.id')
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 = PaperQuestions
fields = ('id','name','options','right','type','level','total_score','questioncat_name', 'img')
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('question',)
return queryset
class PaperDetailSerializer(serializers.ModelSerializer):
create_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
update_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", required=False, read_only=True)
workscope_name = serializers.StringRelatedField(source='workscope', read_only=True)
questions = serializers.SerializerMethodField()
class Meta:
model = Paper
fields = '__all__'
def get_questions(self, instance):
queryset = PaperQuestions.objects.filter(paper=instance).order_by('question__type')
queryset = PaperQuestionsDetailSerializer.setup_eager_loading(queryset)
return PaperQuestionsDetailSerializer(queryset, many=True).data
class PaperQuestionsCreateSerializer(serializers.ModelSerializer):
class Meta:
model = PaperQuestions
fields = '__all__'
class ExamCreateUpdateSerializer(serializers.ModelSerializer):
class Meta:
model = Exam
fields = ['name', 'place', 'opentime', 'closetime', 'proctor_name', 'proctor_phone', 'workscope', 'chance',
'train_name', 'train_start_date', 'train_end_date', 'paper', 'auto_issue', 'only_vip', 'cert_template']
class ExamListSerializer(serializers.ModelSerializer):
create_admin_username = serializers.StringRelatedField(source='create_admin')
workscope_name = serializers.StringRelatedField(source='workscope')
class Meta:
model = Exam
fields = '__all__'
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.prefetch_related('workscope','create_admin')
return queryset
class ExamSimpleSerializer(serializers.ModelSerializer):
class Meta:
model = Exam
exclude = ('create_admin',)
class ConsumerSimpleSerializer(serializers.ModelSerializer):
comanyname = serializers.StringRelatedField(source='company', read_only=True)
class Meta:
model = Consumer
fields = ['id', 'name', 'ID_number1', 'comanyname', 'deptname', 'username']
class ExamTestDetailSerializer(serializers.ModelSerializer):
"""
考试详情序列化(导出用);目前是正式考试,用户详情从consumer_detail获取
"""
workscope_name = serializers.StringRelatedField(source='workscope', read_only=True)
paper_name = serializers.StringRelatedField(source='paper', )
took_format = serializers.SerializerMethodField()
detail_ = serializers.SerializerMethodField()
exam_ = ExamSimpleSerializer(source='exam', read_only=True)
consumer_ = ConsumerSimpleSerializer(source='consumer', read_only=True)
class Meta:
model = ExamTest
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_detail_(self, obj):
objs = obj.answerdetail_examtest.order_by('question__type')
return AnswerDetailSerializer(instance=objs, many=True).data
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('consumer','paper', 'workscope', 'exam')
queryset = queryset.prefetch_related('answerdetail_examtest')
return queryset
class ExamTestExamListSerializer(serializers.ModelSerializer):
"""
正式考试列表序列化
"""
start_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
end_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
workscope_name = serializers.StringRelatedField(source='workscope', read_only=True)
took_format = serializers.SerializerMethodField()
candidate_ = serializers.SerializerMethodField()
exam_name = serializers.StringRelatedField(source='exam', read_only=True)
class Meta:
model = ExamTest
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_candidate_(self, obj):
candidate = obj.candidate if hasattr(obj, 'candidate') else None
if candidate:
return {'id':obj.candidate.id, 'number':obj.candidate.number}
@staticmethod
def setup_eager_loading(queryset):
""" Perform necessary eager loading of data. """
queryset = queryset.select_related('candidate', 'consumer')
return queryset