serializers.py 7.8 KB

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