serializers.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. use_time = serializers.SerializerMethodField()
  62. class Meta:
  63. model = ExamLog
  64. fields = "__all__"
  65. def get_use_time(self, obj):
  66. if obj.use_time:
  67. return strfsecond(obj.use_time)
  68. return ''
  69. class StaffExamLogSerializer(serializers.ModelSerializer):
  70. exampaper_name = serializers.CharField(source='exampaper.name', read_only=True)
  71. right_count = serializers.SerializerMethodField()
  72. wrong_count = serializers.SerializerMethodField()
  73. class Meta:
  74. model = ExamLog
  75. fields = ('id', 'type', 'exampaper', 'user', 'exam_time', 'exampaper_name', 'submit_time',
  76. 'scores', 'right_count','wrong_count','rank',)
  77. def get_right_count(self, obj):
  78. return obj.single_answer_count + obj.multiple_answer_count + obj.fill_answer_count + obj.judgment_answer_count
  79. def get_wrong_count(self, obj):
  80. return obj.exampaper.question_total_count - (obj.single_answer_count + obj.multiple_answer_count + obj.fill_answer_count + obj.judgment_answer_count)
  81. class StaffExamLogRetrieveSerializer(serializers.ModelSerializer):
  82. exampaper_name = serializers.CharField(source='exampaper.name', read_only=True)
  83. question_total_count = serializers.CharField(source='exampaper.question_total_count', read_only=True)
  84. question_total_scores = serializers.CharField(source='exampaper.question_total_scores', read_only=True)
  85. total_right_count = serializers.SerializerMethodField()
  86. answer_items = serializers.SerializerMethodField()
  87. class Meta:
  88. model = ExamLog
  89. fields = "__all__"
  90. def get_total_right_count(self, obj):
  91. return obj.single_answer_count + obj.multiple_answer_count + obj.fill_answer_count + obj.judgment_answer_count
  92. def get_answer_items(self, obj):
  93. data = []
  94. if obj.exampaper.single_total_count:
  95. item = {
  96. 'name': '单选题',
  97. 'total_count': obj.exampaper.single_total_count,
  98. 'total_right': obj.single_answer_count,
  99. 'total_scores': obj.exampaper.single_total_scores,
  100. 'answer_scores': obj.single_answer_scores,
  101. }
  102. data.append(item)
  103. if obj.exampaper.multiple_total_count:
  104. item = {
  105. 'name': '多选题',
  106. 'total_count': obj.exampaper.multiple_total_count,
  107. 'total_right': obj.multiple_answer_count,
  108. 'total_scores': obj.exampaper.multiple_total_scores,
  109. 'answer_scores': obj.multiple_answer_scores,
  110. }
  111. data.append(item)
  112. if obj.exampaper.fill_total_count:
  113. item = {
  114. 'name': '填空题',
  115. 'total_count': obj.exampaper.fill_total_count,
  116. 'total_right': obj.fill_answer_count,
  117. 'total_scores': obj.exampaper.fill_total_scores,
  118. 'answer_scores': obj.fill_answer_scores,
  119. }
  120. data.append(item)
  121. if obj.exampaper.judgment_total_count:
  122. item = {
  123. 'name': '判断题',
  124. 'total_count': obj.exampaper.judgment_total_count,
  125. 'total_right': obj.judgment_answer_count,
  126. 'total_scores': obj.exampaper.judgment_total_scores,
  127. 'answer_scores': obj.judgment_answer_scores,
  128. }
  129. data.append(item)
  130. return data
  131. class ExamAnswerLogSimpleSerializer(serializers.ModelSerializer):
  132. item = serializers.SerializerMethodField()
  133. class Meta:
  134. model = ExamAnswerLog
  135. fields = ('item', )
  136. def get_item(self, obj):
  137. if obj.detail.question.type <= ExamQuestion.MULTIPLE:
  138. rows = ExamAnswerOptionLog.objects.filter(main=obj)
  139. return ExamAnswerOptionLogSimpleSerializer(rows, many=True).data
  140. elif obj.detail.question.type == ExamQuestion.FILL:
  141. rows = ExamAnswerFillLog.objects.filter(main=obj)
  142. return ExamAnswerFillLogSimpleSerializer(rows, many=True).data
  143. else:
  144. return []
  145. class ExamAnswerOptionLogSimpleSerializer(serializers.ModelSerializer):
  146. class Meta:
  147. model = ExamAnswerOptionLog
  148. fields = ('option', )
  149. class ExamAnswerFillLogSimpleSerializer(serializers.ModelSerializer):
  150. class Meta:
  151. model = ExamAnswerFillLog
  152. fields = ('content', 'order', )