serializers.py 6.4 KB

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