serializers.py 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. # coding=utf-8
  2. import datetime
  3. from django.utils import timezone
  4. from rest_framework import serializers
  5. from .models import Exam, ExamLog, ExamAnswerLog, ExamAnswerOptionLog, ExamAnswerFillLog
  6. from apps.examination.examquestion.models import ExamQuestion
  7. from utils.exceptions import CustomError
  8. from utils.format import strfsecond
  9. class ExamSerializer(serializers.ModelSerializer):
  10. subject_name = serializers.CharField(source='subject.name', read_only=True)
  11. type_text = serializers.CharField(source='get_type_display', read_only=True)
  12. create_user_text = serializers.CharField(source='create_user.name', read_only=True)
  13. question_total_scores = serializers.IntegerField(source='exampaper.question_total_scores', read_only=True)
  14. passline = serializers.IntegerField(source='exampaper.passline', read_only=True)
  15. exampaper_name = serializers.CharField(source='exampaper.name', read_only=True)
  16. examinee_name = serializers.SerializerMethodField()
  17. class Meta:
  18. model = Exam
  19. fields = "__all__"
  20. def get_examinee_name(self, obj):
  21. examinees = ExamLog.objects.filter(exam=obj, delete=False).values('user__name')
  22. examinee_list = []
  23. for item in examinees:
  24. if item['user__name']:
  25. examinee_list.append(item['user__name'])
  26. if examinee_list:
  27. return ','.join(examinee_list)
  28. return ''
  29. def create(self, validated_data):
  30. validated_data['create_user'] = self.context['request'].user
  31. exam_end_time = validated_data['exam_time'] + datetime.timedelta(minutes=validated_data['duration'])
  32. validated_data['exam_end_time'] = exam_end_time
  33. instance = super(ExamSerializer, self).create(validated_data)
  34. return instance
  35. def update(self, instance, validated_data):
  36. if instance.delete:
  37. raise CustomError(u'考试[%s]已经被删除,禁止操作' % instance.name)
  38. if timezone.now() > instance.exam_time:
  39. raise CustomError(u'考试已经开始,禁止修改!')
  40. exam_end_time = validated_data['exam_time'] + datetime.timedelta(minutes=validated_data['duration'])
  41. validated_data['exam_end_time'] = exam_end_time
  42. instance = super(ExamSerializer, self).update(instance, validated_data)
  43. instance.change_examtime()
  44. instance.save()
  45. return instance
  46. class FormalExamLogSerializer(serializers.ModelSerializer):
  47. exam_name = serializers.CharField(source='exam.name', read_only=True)
  48. exam_subject_name = serializers.CharField(source='exam.subject.name', read_only=True)
  49. user_name = serializers.CharField(source='user.name', read_only=True)
  50. user_department = serializers.CharField(source='user.department.name', read_only=True)
  51. question_total_scores = serializers.IntegerField(source='exampaper.question_total_scores', read_only=True)
  52. passline = serializers.IntegerField(source='exampaper.passline', read_only=True)
  53. single_count = serializers.IntegerField(source='exampaper.single_total_count', read_only=True)
  54. single_scores = serializers.IntegerField(source='exampaper.single_total_scores', read_only=True)
  55. multiple_count = serializers.IntegerField(source='exampaper.multiple_total_count', read_only=True)
  56. multiple_scores = serializers.IntegerField(source='exampaper.multiple_total_scores', read_only=True)
  57. fill_count = serializers.IntegerField(source='exampaper.fill_total_count', read_only=True)
  58. fill_scores = serializers.IntegerField(source='exampaper.fill_total_scores', read_only=True)
  59. judgment_count = serializers.IntegerField(source='exampaper.judgment_total_count', read_only=True)
  60. judgment_scores = serializers.IntegerField(source='exampaper.judgment_total_scores', read_only=True)
  61. discuss_count = serializers.IntegerField(source='exampaper.discuss_total_count', read_only=True)
  62. discuss_scores = serializers.IntegerField(source='exampaper.discuss_total_scores', read_only=True)
  63. use_time = serializers.SerializerMethodField()
  64. class Meta:
  65. model = ExamLog
  66. fields = "__all__"
  67. def get_use_time(self, obj):
  68. if obj.use_time:
  69. return strfsecond(obj.use_time)
  70. return ''
  71. class StaffExamLogSerializer(serializers.ModelSerializer):
  72. exampaper_name = serializers.CharField(source='exampaper.name', read_only=True)
  73. right_count = serializers.SerializerMethodField()
  74. wrong_count = serializers.SerializerMethodField()
  75. class Meta:
  76. model = ExamLog
  77. fields = ('id', 'type', 'exampaper', 'user', 'exam_time', 'exampaper_name', 'submit_time',
  78. 'scores', 'right_count','wrong_count','rank',)
  79. def get_right_count(self, obj):
  80. return obj.single_answer_count + obj.multiple_answer_count + obj.fill_answer_count + obj.judgment_answer_count + obj.discuss_answer_count
  81. def get_wrong_count(self, obj):
  82. return obj.exampaper.question_total_count - (obj.single_answer_count + obj.multiple_answer_count + obj.fill_answer_count + obj.judgment_answer_count + obj.discuss_answer_count)
  83. class StaffExamLogRetrieveSerializer(serializers.ModelSerializer):
  84. exampaper_name = serializers.CharField(source='exampaper.name', read_only=True)
  85. question_total_count = serializers.CharField(source='exampaper.question_total_count', read_only=True)
  86. question_total_scores = serializers.CharField(source='exampaper.question_total_scores', read_only=True)
  87. total_right_count = serializers.SerializerMethodField()
  88. answer_items = serializers.SerializerMethodField()
  89. class Meta:
  90. model = ExamLog
  91. fields = "__all__"
  92. def get_total_right_count(self, obj):
  93. return obj.single_answer_count + obj.multiple_answer_count + obj.fill_answer_count + obj.judgment_answer_count + obj.discuss_answer_count
  94. def get_answer_items(self, obj):
  95. data = []
  96. if obj.exampaper.single_total_count:
  97. item = {
  98. 'name': '单选题',
  99. 'total_count': obj.exampaper.single_total_count,
  100. 'total_right': obj.single_answer_count,
  101. 'total_scores': obj.exampaper.single_total_scores,
  102. 'answer_scores': obj.single_answer_scores,
  103. }
  104. data.append(item)
  105. if obj.exampaper.multiple_total_count:
  106. item = {
  107. 'name': '多选题',
  108. 'total_count': obj.exampaper.multiple_total_count,
  109. 'total_right': obj.multiple_answer_count,
  110. 'total_scores': obj.exampaper.multiple_total_scores,
  111. 'answer_scores': obj.multiple_answer_scores,
  112. }
  113. data.append(item)
  114. if obj.exampaper.fill_total_count:
  115. item = {
  116. 'name': '填空题',
  117. 'total_count': obj.exampaper.fill_total_count,
  118. 'total_right': obj.fill_answer_count,
  119. 'total_scores': obj.exampaper.fill_total_scores,
  120. 'answer_scores': obj.fill_answer_scores,
  121. }
  122. data.append(item)
  123. if obj.exampaper.judgment_total_count:
  124. item = {
  125. 'name': '判断题',
  126. 'total_count': obj.exampaper.judgment_total_count,
  127. 'total_right': obj.judgment_answer_count,
  128. 'total_scores': obj.exampaper.judgment_total_scores,
  129. 'answer_scores': obj.judgment_answer_scores,
  130. }
  131. data.append(item)
  132. if obj.exampaper.discuss_total_count:
  133. item = {
  134. 'name': '论述题',
  135. 'total_count': obj.exampaper.discuss_total_count,
  136. 'total_right': obj.discuss_answer_count,
  137. 'total_scores': obj.exampaper.discuss_total_scores,
  138. 'answer_scores': obj.discuss_answer_scores,
  139. }
  140. data.append(item)
  141. return data
  142. class ExamAnswerLogSimpleSerializer(serializers.ModelSerializer):
  143. item = serializers.SerializerMethodField()
  144. class Meta:
  145. model = ExamAnswerLog
  146. fields = ('item', )
  147. def get_item(self, obj):
  148. if obj.detail.question.type <= ExamQuestion.MULTIPLE:
  149. rows = ExamAnswerOptionLog.objects.filter(main=obj)
  150. return ExamAnswerOptionLogSimpleSerializer(rows, many=True).data
  151. elif obj.detail.question.type == ExamQuestion.FILL:
  152. rows = ExamAnswerFillLog.objects.filter(main=obj)
  153. return ExamAnswerFillLogSimpleSerializer(rows, many=True).data
  154. else:
  155. return []
  156. class ExamAnswerOptionLogSimpleSerializer(serializers.ModelSerializer):
  157. class Meta:
  158. model = ExamAnswerOptionLog
  159. fields = ('option', )
  160. class ExamAnswerFillLogSimpleSerializer(serializers.ModelSerializer):
  161. class Meta:
  162. model = ExamAnswerFillLog
  163. fields = ('content', 'order', )