serializers.py 7.6 KB

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