models.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. # coding=utf-8
  2. from django.db import models
  3. from django.utils import timezone
  4. from django.conf import settings
  5. from utils.exceptions import CustomError
  6. from apps.foundation.models import Subject
  7. from apps.examination.exampaper.models import ExamPaper, ExamPaperDetail
  8. from apps.examination.examquestion.models import ExamQuestion, ExamQuestionOption
  9. class Exam(models.Model):
  10. FIXED = 1
  11. RANDOM = 2
  12. TYPE_CHOICES = (
  13. (FIXED, u'固定试卷'),
  14. (RANDOM, u'随机试卷'),
  15. )
  16. TYPE_JSON = [{'id': item[0], 'value': item[1]} for item in TYPE_CHOICES]
  17. name = models.CharField(max_length=200, verbose_name=u"名称")
  18. subject = models.ForeignKey(Subject, verbose_name=u"科目", on_delete=models.PROTECT, null=True, editable=False)
  19. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"试卷类型", null=True, editable=False)
  20. duration = models.IntegerField(verbose_name=u'时长')
  21. exam_time = models.DateTimeField(verbose_name=u"考试时间")
  22. exam_end_time = models.DateTimeField(verbose_name=u"考试结束时间", null=True, editable=False)
  23. exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", on_delete=models.PROTECT, null=True, editable=True)
  24. desc = models.TextField(verbose_name=u"备注", null=True, blank=True)
  25. examinee_count = models.IntegerField(verbose_name=u'考试人数', default=0, editable=False)
  26. create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'添加人', editable=False, on_delete=models.PROTECT)
  27. create_time = models.DateTimeField(verbose_name=u"添加时间", default=timezone.now, editable=False)
  28. delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
  29. class Meta:
  30. db_table = "exam"
  31. ordering = ['-id']
  32. verbose_name = u"考试管理"
  33. default_permissions = ()
  34. @staticmethod
  35. def getById(id):
  36. instance = Exam.objects.filter(pk=id).first()
  37. if not instance:
  38. raise CustomError(u'未找到相应的考试')
  39. return instance
  40. def allocation_exampaper(self, type, exampaper_instance):
  41. self.type = type
  42. self.subject_id = exampaper_instance.subject_id
  43. self.exampaper = exampaper_instance
  44. ExamLog.objects.filter(exam=self, delete=False).update(exampaper_id=exampaper_instance.id)
  45. def change_examtime(self):
  46. ExamLog.objects.filter(exam=self, delete=False).update(exam_time=self.exam_time)
  47. def change_examinee(self, new_user_ids):
  48. old_user_ids = ExamLog.objects.filter(exam=self, delete=False).values_list('user_id', flat=True)
  49. user_adds = [val for val in new_user_ids if val not in old_user_ids]
  50. user_deletes = [val for val in old_user_ids if val not in new_user_ids]
  51. if user_deletes:
  52. self._remove_examinee(user_deletes)
  53. if user_adds:
  54. self._add_examinee(user_adds)
  55. self.examinee_count = ExamLog.objects.filter(exam=self, delete=False).count()
  56. def _remove_examinee(self, user_ids):
  57. ExamLog.objects.filter(exam=self, user_id__in=user_ids).update(delete=True)
  58. def _add_examinee(self, user_ids):
  59. data = []
  60. for user_id in user_ids:
  61. item = ExamLog(
  62. type=ExamLog.FORMAL,
  63. exam=self,
  64. exampaper=self.exampaper,
  65. user_id=user_id,
  66. exam_time=self.exam_time
  67. )
  68. data.append(item)
  69. ExamLog.objects.bulk_create(data)
  70. class ExamLog(models.Model):
  71. MOCK = 1
  72. FORMAL = 2
  73. TYPE_CHOICES = (
  74. (MOCK, u'模拟考试'),
  75. (FORMAL, u'正式考试'),
  76. )
  77. TYPE_JSON = [{'id': item[0], 'value': item[1]} for item in TYPE_CHOICES]
  78. type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
  79. exam = models.ForeignKey(Exam, verbose_name=u"考试", null=True, blank=True, on_delete=models.PROTECT)
  80. exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", null=True, blank=True, on_delete=models.PROTECT)
  81. user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'参加人员', on_delete=models.PROTECT)
  82. scores = models.IntegerField(verbose_name=u'分数', null=True, blank=True)
  83. rank = models.IntegerField(verbose_name=u'排名', null=True, blank=True)
  84. use_time = models.IntegerField(verbose_name=u'用时', null=True, blank=True)
  85. exam_time = models.DateTimeField(verbose_name=u"考试时间", null=True, blank=True)
  86. submit_time = models.DateTimeField(verbose_name=u"交卷时间", null=True, blank=True)
  87. single_answer_scores = models.IntegerField(verbose_name=u'单选题得分', default=0, editable=False)
  88. multiple_answer_scores = models.IntegerField(verbose_name=u'多选题得分', default=0, editable=False)
  89. fill_answer_scores = models.IntegerField(verbose_name=u'填空题得分', default=0, editable=False)
  90. judgment_answer_scores = models.IntegerField(verbose_name=u'判断题得分', default=0, editable=False)
  91. single_answer_count = models.IntegerField(verbose_name=u'单选题答对数', default=0, editable=False)
  92. multiple_answer_count = models.IntegerField(verbose_name=u'多选题答对数', default=0, editable=False)
  93. fill_answer_count = models.IntegerField(verbose_name=u'填空题答对数', default=0, editable=False)
  94. judgment_answer_count = models.IntegerField(verbose_name=u'判断题答对数', default=0, editable=False)
  95. delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
  96. class Meta:
  97. db_table = "exam_log"
  98. ordering = ['-id']
  99. verbose_name = u"考试记录"
  100. default_permissions = ()
  101. class ExamAnswerLog(models.Model):
  102. RIGHT = 1
  103. WRONG = 2
  104. NOTDONE = 3
  105. STATUS_CHOICES = (
  106. (RIGHT, u'正确'),
  107. (WRONG, u'错误'),
  108. (NOTDONE, u'未做'),
  109. )
  110. STATUS_JSON = [{'id': item[0], 'value': item[1]} for item in STATUS_CHOICES]
  111. main = models.ForeignKey(ExamLog, verbose_name=u"考试记录", on_delete=models.PROTECT)
  112. detail = models.ForeignKey(ExamPaperDetail, verbose_name=u"试题", on_delete=models.PROTECT)
  113. status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'回答状态', default=NOTDONE)
  114. class Meta:
  115. db_table = "exam_answer_log"
  116. ordering = ['id']
  117. verbose_name = u"考试答题记录"
  118. default_permissions = ()
  119. class ExamAnswerOptionLog(models.Model):
  120. main = models.ForeignKey(ExamAnswerLog, verbose_name=u"考试答题记录", on_delete=models.PROTECT)
  121. option = models.ForeignKey(ExamQuestionOption, verbose_name=u"选项", on_delete=models.PROTECT)
  122. class Meta:
  123. db_table = "exam_answer_option_log"
  124. ordering = ['id']
  125. verbose_name = u"选择题回答"
  126. default_permissions = ()
  127. class ExamAnswerFillLog(models.Model):
  128. main = models.ForeignKey(ExamAnswerLog, verbose_name=u"考试答题记录", on_delete=models.PROTECT)
  129. content = models.TextField(verbose_name=u"内容")
  130. order = models.IntegerField(verbose_name=u'排序')
  131. class Meta:
  132. db_table = "exam_answer_fill_log"
  133. ordering = ['order', 'id']
  134. verbose_name = u"填空题回答"
  135. default_permissions = ()