123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- # coding=utf-8
- from django.db import models
- from django.utils import timezone
- from django.conf import settings
- from utils.exceptions import CustomError
- from apps.foundation.models import Subject
- from apps.examination.exampaper.models import ExamPaper, ExamPaperDetail
- from apps.examination.examquestion.models import ExamQuestion, ExamQuestionOption
- class Exam(models.Model):
- FIXED = 1
- RANDOM = 2
- TYPE_CHOICES = (
- (FIXED, u'固定试卷'),
- (RANDOM, u'随机试卷'),
- )
- TYPE_JSON = [{'id': item[0], 'value': item[1]} for item in TYPE_CHOICES]
- name = models.CharField(max_length=200, verbose_name=u"名称")
- subject = models.ForeignKey(Subject, verbose_name=u"科目", on_delete=models.PROTECT, null=True, editable=False)
- type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"试卷类型", null=True, editable=False)
- duration = models.IntegerField(verbose_name=u'时长')
- exam_time = models.DateTimeField(verbose_name=u"考试时间")
- exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", on_delete=models.PROTECT, null=True, editable=True)
- desc = models.TextField(verbose_name=u"备注", null=True, blank=True)
- examinee_count = models.IntegerField(verbose_name=u'考试人数', default=0, editable=False)
- create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'添加人', editable=False, on_delete=models.PROTECT)
- create_time = models.DateTimeField(verbose_name=u"添加时间", default=timezone.now, editable=False)
- delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
- class Meta:
- db_table = "exam"
- ordering = ['-id']
- verbose_name = u"考试管理"
- default_permissions = ()
- @staticmethod
- def getById(id):
- instance = Exam.objects.filter(pk=id).first()
- if not instance:
- raise CustomError(u'未找到相应的考试')
- return instance
- def allocation_exampaper(self, type, exampaper_instance):
- self.type = type
- self.subject_id = exampaper_instance.subject_id
- self.exampaper = exampaper_instance
- ExamLog.objects.filter(exam=self, delete=False).update(exampaper_id=exampaper_instance.id)
- def change_examtime(self):
- ExamLog.objects.filter(exam=self, delete=False).update(exam_time=self.exam_time)
- def change_examinee(self, new_user_ids):
- old_user_ids = ExamLog.objects.filter(exam=self, delete=False).values_list('user_id', flat=True)
- user_adds = [val for val in new_user_ids if val not in old_user_ids]
- user_deletes = [val for val in old_user_ids if val not in new_user_ids]
- if user_deletes:
- self._remove_examinee(user_deletes)
- if user_adds:
- self._add_examinee(user_adds)
- self.examinee_count = ExamLog.objects.filter(exam=self, delete=False).count()
- def _remove_examinee(self, user_ids):
- ExamLog.objects.filter(exam=self, user_id__in=user_ids).update(delete=True)
- def _add_examinee(self, user_ids):
- data = []
- for user_id in user_ids:
- item = ExamLog(
- type=ExamLog.FORMAL,
- exam=self,
- exampaper=self.exampaper,
- user_id=user_id,
- exam_time=self.exam_time
- )
- data.append(item)
- ExamLog.objects.bulk_create(data)
- class ExamLog(models.Model):
- MOCK = 1
- FORMAL = 2
- TYPE_CHOICES = (
- (MOCK, u'模拟考试'),
- (FORMAL, u'正式考试'),
- )
- TYPE_JSON = [{'id': item[0], 'value': item[1]} for item in TYPE_CHOICES]
- type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
- exam = models.ForeignKey(Exam, verbose_name=u"考试", null=True, blank=True, on_delete=models.PROTECT)
- exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", null=True, blank=True, on_delete=models.PROTECT)
- user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'参加人员', on_delete=models.PROTECT)
- scores = models.IntegerField(verbose_name=u'分数', null=True, blank=True)
- rank = models.IntegerField(verbose_name=u'排名', null=True, blank=True)
- use_time = models.IntegerField(verbose_name=u'用时', null=True, blank=True)
- exam_time = models.DateTimeField(verbose_name=u"考试时间", null=True, blank=True)
- submit_time = models.DateTimeField(verbose_name=u"交卷时间", null=True, blank=True)
- single_answer_scores = models.IntegerField(verbose_name=u'单选题得分', default=0, editable=False)
- multiple_answer_scores = models.IntegerField(verbose_name=u'多选题得分', default=0, editable=False)
- fill_answer_scores = models.IntegerField(verbose_name=u'填空题得分', default=0, editable=False)
- judgment_answer_scores = models.IntegerField(verbose_name=u'判断题得分', default=0, editable=False)
- single_answer_count = models.IntegerField(verbose_name=u'单选题答对数', default=0, editable=False)
- multiple_answer_count = models.IntegerField(verbose_name=u'多选题答对数', default=0, editable=False)
- fill_answer_count = models.IntegerField(verbose_name=u'填空题答对数', default=0, editable=False)
- judgment_answer_count = models.IntegerField(verbose_name=u'判断题答对数', default=0, editable=False)
- delete = models.BooleanField(verbose_name=u'删除', default=False, editable=False)
- class Meta:
- db_table = "exam_log"
- ordering = ['-id']
- verbose_name = u"考试记录"
- default_permissions = ()
- class ExamAnswerLog(models.Model):
- RIGHT = 1
- WRONG = 2
- NOTDONE = 3
- STATUS_CHOICES = (
- (RIGHT, u'正确'),
- (WRONG, u'错误'),
- (NOTDONE, u'未做'),
- )
- STATUS_JSON = [{'id': item[0], 'value': item[1]} for item in STATUS_CHOICES]
- main = models.ForeignKey(ExamLog, verbose_name=u"考试记录", on_delete=models.PROTECT)
- detail = models.ForeignKey(ExamPaperDetail, verbose_name=u"试题", on_delete=models.PROTECT)
- status = models.PositiveSmallIntegerField(choices=STATUS_CHOICES, verbose_name=u'回答状态', default=NOTDONE)
- class Meta:
- db_table = "exam_answer_log"
- ordering = ['id']
- verbose_name = u"考试答题记录"
- default_permissions = ()
- class ExamAnswerOptionLog(models.Model):
- main = models.ForeignKey(ExamAnswerLog, verbose_name=u"考试答题记录", on_delete=models.PROTECT)
- option = models.ForeignKey(ExamQuestionOption, verbose_name=u"选项", on_delete=models.PROTECT)
- class Meta:
- db_table = "exam_answer_option_log"
- ordering = ['id']
- verbose_name = u"选择题回答"
- default_permissions = ()
- class ExamAnswerFillLog(models.Model):
- main = models.ForeignKey(ExamAnswerLog, verbose_name=u"考试答题记录", on_delete=models.PROTECT)
- content = models.TextField(verbose_name=u"内容")
- order = models.IntegerField(verbose_name=u'排序')
- class Meta:
- db_table = "exam_answer_fill_log"
- ordering = ['order', 'id']
- verbose_name = u"填空题回答"
- default_permissions = ()
|