serializers.py 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. # coding=utf-8
  2. import json
  3. from rest_framework import serializers
  4. from utils.exceptions import CustomError
  5. from .models import *
  6. class ExamQuestionSerializer(serializers.ModelSerializer):
  7. subject = serializers.CharField(source='chapter.subject.id', read_only=True)
  8. subject_text = serializers.CharField(source='chapter.subject.name', read_only=True)
  9. chapter_text = serializers.CharField(source='chapter.name', read_only=True)
  10. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  11. type_text = serializers.CharField(source='get_type_display', read_only=True)
  12. difficulty_text = serializers.CharField(source='get_difficulty_display', read_only=True)
  13. judgment = serializers.SerializerMethodField()
  14. items = serializers.SerializerMethodField()
  15. def get_items(self, obj):
  16. if obj.type <= ExamQuestion.MULTIPLE:
  17. rows = ExamQuestionOption.objects.filter(main=obj, delete=False)
  18. return ExamQuestionOptionSerializer(rows, many=True).data
  19. elif obj.type == ExamQuestion.FILL:
  20. rows = ExamQuestionFill.objects.filter(main=obj, delete=False)
  21. return ExamQuestionFillSerializer(rows, many=True).data
  22. else:
  23. return []
  24. def get_judgment(self, obj):
  25. if obj.judgment:
  26. return "1"
  27. return "0"
  28. class Meta:
  29. model = ExamQuestion
  30. fields = '__all__'
  31. def create(self, validated_data):
  32. if 'judgment' in self.initial_data:
  33. validated_data['judgment'] = True if self.initial_data['judgment'] == '1' else False
  34. validated_data['create_user'] = self.context['request'].user
  35. if validated_data['type'] !=5:
  36. validated_data['discuss_answer'] = '请输入论述题答案'
  37. else:
  38. if not validated_data['discuss_answer']:
  39. raise CustomError('请输入论述题答案')
  40. instance = super(ExamQuestionSerializer, self).create(validated_data)
  41. rows = json.loads(self.initial_data['rows'])
  42. for row in rows:
  43. if not row['content']:
  44. raise CustomError('答案不能为空,请填写答案!')
  45. if instance.type == ExamQuestion.SINGLE or instance.type == ExamQuestion.MULTIPLE:
  46. ExamQuestionOption.objects.create(
  47. main=instance,
  48. content=row['content'],
  49. right=row['right'],
  50. )
  51. elif instance.type == ExamQuestion.FILL:
  52. ExamQuestionFill.objects.create(
  53. main=instance,
  54. content=row['content'],
  55. order=row['order'] + 1,
  56. )
  57. return instance
  58. def update(self, instance, validated_data):
  59. if 'judgment' in self.initial_data:
  60. validated_data['judgment'] = True if self.initial_data['judgment'] == '1' else False
  61. if validated_data['type'] != 5:
  62. validated_data['discuss_answer'] = '请输入论述题答案'
  63. else:
  64. if not validated_data['discuss_answer']:
  65. raise CustomError('请输入论述题答案')
  66. instance = super(ExamQuestionSerializer, self).update(instance, validated_data)
  67. rows = json.loads(self.initial_data['rows'])
  68. ExamQuestionOption.objects.filter(main=instance).update(delete=True, right=False)
  69. ExamQuestionFill.objects.filter(main=instance).update(delete=True)
  70. for row in rows:
  71. if not row['content']:
  72. raise CustomError('答案不能为空,请填写答案!')
  73. if instance.type <= ExamQuestion.MULTIPLE:
  74. if row['id']:
  75. # 更新
  76. ExamQuestionOption.objects.filter(main=instance, id=row['id']).update(delete=False,
  77. content=row['content'],
  78. right=row['right'])
  79. else:
  80. # 新增
  81. ExamQuestionOption.objects.create(
  82. main=instance,
  83. content=row['content'],
  84. right=row['right'],
  85. )
  86. elif instance.type == ExamQuestion.FILL:
  87. if row['id']:
  88. # 更新
  89. ExamQuestionFill.objects.filter(main=instance, id=row['id']).update(delete=False,
  90. content=row['content'],
  91. order=row['order']+1)
  92. else:
  93. # 新增
  94. ExamQuestionFill.objects.create(
  95. main=instance,
  96. content=row['content'],
  97. order=row['order'] + 1,
  98. )
  99. return instance
  100. class ExamQuestionOptionSerializer(serializers.ModelSerializer):
  101. class Meta:
  102. model = ExamQuestionOption
  103. fields = '__all__'
  104. class ExamQuestionFillSerializer(serializers.ModelSerializer):
  105. class Meta:
  106. model = ExamQuestionFill
  107. fields = '__all__'
  108. class ExamQuestionFeedbackSerializer(serializers.ModelSerializer):
  109. question_type_text = serializers.CharField(source='main.get_type_display', read_only=True)
  110. question_title = serializers.CharField(source='main.title', read_only=True)
  111. type_text = serializers.CharField(source='get_type_display', read_only=True)
  112. status_text = serializers.CharField(source='get_status_display', read_only=True)
  113. title = serializers.CharField(source='main.title', read_only=True)
  114. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  115. class Meta:
  116. model = ExamQuestionFeedback
  117. fields = "__all__"
  118. def create(self, validated_data):
  119. validated_data['create_user'] = self.context['request'].user
  120. instance = super(ExamQuestionFeedbackSerializer, self).create(validated_data)
  121. return instance
  122. class ExamQuestionSimpleSerializer(serializers.ModelSerializer):
  123. judgment = serializers.SerializerMethodField()
  124. items = serializers.SerializerMethodField()
  125. def get_items(self, obj):
  126. if obj.type <= ExamQuestion.MULTIPLE:
  127. rows = ExamQuestionOption.objects.filter(main=obj, delete=False)
  128. return ExamQuestionOptionSimpleSerializer(rows, many=True).data
  129. elif obj.type == ExamQuestion.FILL:
  130. rows = ExamQuestionFill.objects.filter(main=obj, delete=False)
  131. return ExamQuestionFillSimpleSerializer(rows, many=True).data
  132. elif obj.type == ExamQuestion.DISCUSS:
  133. return [{'content':obj.discuss_answer, 'order':1}]
  134. else:
  135. return []
  136. def get_judgment(self, obj):
  137. if obj.judgment:
  138. return "1"
  139. return "0"
  140. class Meta:
  141. model = ExamQuestion
  142. fields = ('title', 'judgment', 'discuss_answer', 'items', 'type', 'analysis', )
  143. class ExamQuestionOptionSimpleSerializer(serializers.ModelSerializer):
  144. class Meta:
  145. model = ExamQuestionOption
  146. fields = ('content', 'right', 'id', )
  147. class ExamQuestionFillSimpleSerializer(serializers.ModelSerializer):
  148. class Meta:
  149. model = ExamQuestionFill
  150. fields = ('content', 'order', )