123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- # 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
- 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
- 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'])
- 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__"
- 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
- else:
- return []
- def get_judgment(self, obj):
- if obj.judgment:
- return "1"
- return "0"
- class Meta:
- model = ExamQuestion
- fields = ('title', 'judgment', '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', )
|