serializers.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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. instance = super(ExamQuestionSerializer, self).create(validated_data)
  36. rows = json.loads(self.initial_data['rows'])
  37. for row in rows:
  38. if not row['content']:
  39. raise CustomError('答案不能为空,请填写答案!')
  40. if instance.type == ExamQuestion.SINGLE or instance.type == ExamQuestion.MULTIPLE:
  41. ExamQuestionOption.objects.create(
  42. main=instance,
  43. content=row['content'],
  44. right=row['right'],
  45. )
  46. elif instance.type == ExamQuestion.FILL:
  47. ExamQuestionFill.objects.create(
  48. main=instance,
  49. content=row['content'],
  50. order=row['order'] + 1,
  51. )
  52. return instance
  53. def update(self, instance, validated_data):
  54. if 'judgment' in self.initial_data:
  55. validated_data['judgment'] = True if self.initial_data['judgment'] == '1' else False
  56. instance = super(ExamQuestionSerializer, self).update(instance, validated_data)
  57. rows = json.loads(self.initial_data['rows'])
  58. ExamQuestionOption.objects.filter(main=instance).update(delete=True, right=False)
  59. ExamQuestionFill.objects.filter(main=instance).update(delete=True)
  60. for row in rows:
  61. if not row['content']:
  62. raise CustomError('答案不能为空,请填写答案!')
  63. if instance.type <= ExamQuestion.MULTIPLE:
  64. if row['id']:
  65. # 更新
  66. ExamQuestionOption.objects.filter(main=instance, id=row['id']).update(delete=False,
  67. content=row['content'],
  68. right=row['right'])
  69. else:
  70. # 新增
  71. ExamQuestionOption.objects.create(
  72. main=instance,
  73. content=row['content'],
  74. right=row['right'],
  75. )
  76. elif instance.type == ExamQuestion.FILL:
  77. if row['id']:
  78. # 更新
  79. ExamQuestionFill.objects.filter(main=instance, id=row['id']).update(delete=False,
  80. content=row['content'],
  81. order=row['order']+1)
  82. else:
  83. # 新增
  84. ExamQuestionFill.objects.create(
  85. main=instance,
  86. content=row['content'],
  87. order=row['order'] + 1,
  88. )
  89. return instance
  90. class ExamQuestionOptionSerializer(serializers.ModelSerializer):
  91. class Meta:
  92. model = ExamQuestionOption
  93. fields = '__all__'
  94. class ExamQuestionFillSerializer(serializers.ModelSerializer):
  95. class Meta:
  96. model = ExamQuestionFill
  97. fields = '__all__'
  98. class ExamQuestionFeedbackSerializer(serializers.ModelSerializer):
  99. question_type_text = serializers.CharField(source='main.get_type_display', read_only=True)
  100. question_title = serializers.CharField(source='main.title', read_only=True)
  101. type_text = serializers.CharField(source='get_type_display', read_only=True)
  102. status_text = serializers.CharField(source='get_status_display', read_only=True)
  103. title = serializers.CharField(source='main.title', read_only=True)
  104. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  105. class Meta:
  106. model = ExamQuestionFeedback
  107. fields = "__all__"
  108. def create(self, validated_data):
  109. validated_data['create_user'] = self.context['request'].user
  110. instance = super(ExamQuestionFeedbackSerializer, self).create(validated_data)
  111. return instance
  112. class ExamQuestionSimpleSerializer(serializers.ModelSerializer):
  113. judgment = serializers.SerializerMethodField()
  114. items = serializers.SerializerMethodField()
  115. def get_items(self, obj):
  116. if obj.type <= ExamQuestion.MULTIPLE:
  117. rows = ExamQuestionOption.objects.filter(main=obj, delete=False)
  118. return ExamQuestionOptionSimpleSerializer(rows, many=True).data
  119. elif obj.type == ExamQuestion.FILL:
  120. rows = ExamQuestionFill.objects.filter(main=obj, delete=False)
  121. return ExamQuestionFillSimpleSerializer(rows, many=True).data
  122. else:
  123. return []
  124. def get_judgment(self, obj):
  125. if obj.judgment:
  126. return "1"
  127. return "0"
  128. class Meta:
  129. model = ExamQuestion
  130. fields = ('title', 'judgment', 'discuss_answer', 'items', 'type', 'analysis', )
  131. class ExamQuestionOptionSimpleSerializer(serializers.ModelSerializer):
  132. class Meta:
  133. model = ExamQuestionOption
  134. fields = ('content', 'right', 'id', )
  135. class ExamQuestionFillSimpleSerializer(serializers.ModelSerializer):
  136. class Meta:
  137. model = ExamQuestionFill
  138. fields = ('content', 'order', )