# coding=utf-8 import json from rest_framework import serializers from utils.exceptions import CustomError from .models import * class ExamQuestionSerializer(serializers.ModelSerializer): subject = serializers.CharField(source='chapter.subject.id', read_only=True) subject_text = serializers.CharField(source='chapter.subject.name', read_only=True) chapter_text = serializers.CharField(source='chapter.name', read_only=True) create_user_text = serializers.CharField(source='create_user.name', read_only=True) type_text = serializers.CharField(source='get_type_display', read_only=True) difficulty_text = serializers.CharField(source='get_difficulty_display', read_only=True) judgment = serializers.SerializerMethodField() items = serializers.SerializerMethodField() def get_items(self, obj): if obj.type <= ExamQuestion.MULTIPLE: rows = ExamQuestionOption.objects.filter(main=obj, delete=False) return ExamQuestionOptionSerializer(rows, many=True).data elif obj.type == ExamQuestion.FILL: rows = ExamQuestionFill.objects.filter(main=obj, delete=False) return ExamQuestionFillSerializer(rows, many=True).data else: return [] def get_judgment(self, obj): if obj.judgment: return "1" return "0" class Meta: model = ExamQuestion fields = '__all__' def create(self, validated_data): if 'judgment' in self.initial_data: validated_data['judgment'] = True if self.initial_data['judgment'] == '1' else False validated_data['create_user'] = self.context['request'].user if validated_data['type'] !=5: validated_data['discuss_answer'] = '请输入论述题答案' else: if not validated_data['discuss_answer']: raise CustomError('请输入论述题答案') instance = super(ExamQuestionSerializer, self).create(validated_data) rows = json.loads(self.initial_data['rows']) for row in rows: if not row['content']: raise CustomError('答案不能为空,请填写答案!') if instance.type == ExamQuestion.SINGLE or instance.type == ExamQuestion.MULTIPLE: ExamQuestionOption.objects.create( main=instance, content=row['content'], right=row['right'], ) elif instance.type == ExamQuestion.FILL: ExamQuestionFill.objects.create( main=instance, content=row['content'], order=row['order'] + 1, ) return instance def update(self, instance, validated_data): if 'judgment' in self.initial_data: validated_data['judgment'] = True if self.initial_data['judgment'] == '1' else False if validated_data['type'] != 5: validated_data['discuss_answer'] = '请输入论述题答案' else: if not validated_data['discuss_answer']: raise CustomError('请输入论述题答案') instance = super(ExamQuestionSerializer, self).update(instance, validated_data) rows = json.loads(self.initial_data['rows']) ExamQuestionOption.objects.filter(main=instance).update(delete=True, right=False) ExamQuestionFill.objects.filter(main=instance).update(delete=True) for row in rows: if not row['content']: raise CustomError('答案不能为空,请填写答案!') if instance.type <= ExamQuestion.MULTIPLE: if row['id']: # 更新 ExamQuestionOption.objects.filter(main=instance, id=row['id']).update(delete=False, content=row['content'], right=row['right']) else: # 新增 ExamQuestionOption.objects.create( main=instance, content=row['content'], right=row['right'], ) elif instance.type == ExamQuestion.FILL: if row['id']: # 更新 ExamQuestionFill.objects.filter(main=instance, id=row['id']).update(delete=False, content=row['content'], order=row['order']+1) else: # 新增 ExamQuestionFill.objects.create( main=instance, content=row['content'], order=row['order'] + 1, ) return instance class ExamQuestionOptionSerializer(serializers.ModelSerializer): class Meta: model = ExamQuestionOption fields = '__all__' class ExamQuestionFillSerializer(serializers.ModelSerializer): class Meta: model = ExamQuestionFill fields = '__all__' class ExamQuestionFeedbackSerializer(serializers.ModelSerializer): question_type_text = serializers.CharField(source='main.get_type_display', read_only=True) question_title = serializers.CharField(source='main.title', read_only=True) type_text = serializers.CharField(source='get_type_display', read_only=True) status_text = serializers.CharField(source='get_status_display', read_only=True) title = serializers.CharField(source='main.title', read_only=True) create_user_text = serializers.CharField(source='create_user.name', read_only=True) class Meta: model = ExamQuestionFeedback fields = "__all__" def create(self, validated_data): validated_data['create_user'] = self.context['request'].user instance = super(ExamQuestionFeedbackSerializer, self).create(validated_data) return instance class ExamQuestionSimpleSerializer(serializers.ModelSerializer): judgment = serializers.SerializerMethodField() items = serializers.SerializerMethodField() def get_items(self, obj): if obj.type <= ExamQuestion.MULTIPLE: rows = ExamQuestionOption.objects.filter(main=obj, delete=False) return ExamQuestionOptionSimpleSerializer(rows, many=True).data elif obj.type == ExamQuestion.FILL: rows = ExamQuestionFill.objects.filter(main=obj, delete=False) return ExamQuestionFillSimpleSerializer(rows, many=True).data elif obj.type == ExamQuestion.DISCUSS: return [{'content':obj.discuss_answer, 'order':1}] else: return [] def get_judgment(self, obj): if obj.judgment: return "1" return "0" class Meta: model = ExamQuestion fields = ('title', 'judgment', 'discuss_answer', 'items', 'type', 'analysis', ) class ExamQuestionOptionSimpleSerializer(serializers.ModelSerializer): class Meta: model = ExamQuestionOption fields = ('content', 'right', 'id', ) class ExamQuestionFillSimpleSerializer(serializers.ModelSerializer): class Meta: model = ExamQuestionFill fields = ('content', 'order', )