212 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			7.1 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)
 | |
|     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
 | |
|     
 | |
| 
 | |
| 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')
 | |
|     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']
 |