|
@@ -4,6 +4,8 @@ from django.db import models
|
|
from django.utils import timezone
|
|
from django.utils import timezone
|
|
from django.conf import settings
|
|
from django.conf import settings
|
|
|
|
|
|
|
|
+from utils.exceptions import CustomError
|
|
|
|
+
|
|
from apps.foundation.models import Subject
|
|
from apps.foundation.models import Subject
|
|
from apps.examination.exampaper.models import ExamPaper, ExamPaperDetail
|
|
from apps.examination.exampaper.models import ExamPaper, ExamPaperDetail
|
|
from apps.examination.examquestion.models import ExamQuestion, ExamQuestionOption
|
|
from apps.examination.examquestion.models import ExamQuestion, ExamQuestionOption
|
|
@@ -37,6 +39,50 @@ class Exam(models.Model):
|
|
verbose_name = u"考试管理"
|
|
verbose_name = u"考试管理"
|
|
default_permissions = ()
|
|
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):
|
|
class ExamLog(models.Model):
|
|
MOCK = 1
|
|
MOCK = 1
|
|
FORMAL = 2
|
|
FORMAL = 2
|
|
@@ -48,7 +94,7 @@ class ExamLog(models.Model):
|
|
|
|
|
|
type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
|
|
type = models.PositiveSmallIntegerField(choices=TYPE_CHOICES, verbose_name=u"类型")
|
|
exam = models.ForeignKey(Exam, verbose_name=u"考试", null=True, blank=True, on_delete=models.PROTECT)
|
|
exam = models.ForeignKey(Exam, verbose_name=u"考试", null=True, blank=True, on_delete=models.PROTECT)
|
|
- exampaper = models.ForeignKey(ExamPaper, verbose_name=u"试卷", 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)
|
|
user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u'参加人员', on_delete=models.PROTECT)
|
|
|
|
|
|
scores = models.IntegerField(verbose_name=u'分数', null=True, blank=True)
|
|
scores = models.IntegerField(verbose_name=u'分数', null=True, blank=True)
|
|
@@ -65,6 +111,7 @@ class ExamLog(models.Model):
|
|
multiple_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)
|
|
fill_answer_count = models.IntegerField(verbose_name=u'填空题答对数', default=0, editable=False)
|
|
judgment_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:
|
|
class Meta:
|
|
db_table = "exam_log"
|
|
db_table = "exam_log"
|