from django.db import models from apps.utils.models import CommonAModel, BaseModel, CommonADModel from apps.system.models import User, Dept # Create your models here. class Questioncat(CommonAModel): name = models.CharField(max_length=200, verbose_name='名称') parent = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='父级', related_name='cate_parent') sort = models.PositiveIntegerField(default=0, verbose_name='排序') class Meta: verbose_name = '题库分类' verbose_name_plural = verbose_name def __str__(self): return self.name class Question(CommonAModel): Q_DAN = 10 Q_DUO = 20 Q_PAN = 30 Q_EASY = 10 Q_SIMPLE = 20 Q_HARD = 30 name = models.TextField('题干') img = models.TextField('题干图片', null=True, blank=True) type = models.PositiveSmallIntegerField('题型', choices=((Q_DAN, '单选'), (Q_DUO, '多选'), (Q_PAN, '判断'))) level = models.PositiveSmallIntegerField('难度', default=Q_SIMPLE, choices=((Q_EASY, '简单'), (Q_SIMPLE, '一般'), (Q_HARD, '困难'))) questioncat = models.ForeignKey(Questioncat, blank=True, null=True, on_delete=models.SET_NULL, verbose_name='所属题库', related_name='questioncat') options = models.JSONField('选项') right = models.JSONField('正确答案') resolution = models.TextField('解析', null=True, blank=True) enabled = models.BooleanField('是否启用', default=False) class Meta: verbose_name = '题目' verbose_name_plural = verbose_name def __str__(self): return self.name class Paper(CommonAModel): name = models.CharField(max_length=200, verbose_name='名称') questions = models.ManyToManyField(Question, through='PaperQuestion') limit = models.IntegerField(default=0, verbose_name='限时(分钟)') total_score = models.FloatField(default=0, verbose_name='满分') pass_score = models.FloatField(default=0, verbose_name='通过分数') danxuan_count = models.IntegerField(default=0, verbose_name='单选数量') danxuan_score = models.FloatField(default=2, verbose_name='单选分数') duoxuan_count = models.IntegerField(default=0, verbose_name='多选数量') duoxuan_score = models.FloatField(default=4, verbose_name='多选分数') panduan_count = models.IntegerField(default=0, verbose_name='判断数量') panduan_score = models.FloatField(default=2, verbose_name='判断分数') class Meta: verbose_name = '押题卷' verbose_name_plural = verbose_name def __str__(self): return self.name class PaperQuestion(BaseModel): paper = models.ForeignKey(Paper, on_delete=models.CASCADE, verbose_name='试卷') question = models.ForeignKey(Question, on_delete=models.CASCADE, verbose_name='试题') total_score = models.FloatField(default=0, verbose_name='单题满分') sort = models.IntegerField(default=0, verbose_name='排序') class Exam(CommonADModel): name = models.CharField('名称', max_length=100) open_time = models.DateTimeField('开启时间') close_time = models.DateTimeField('关闭时间', null=True, blank=True) chance = models.IntegerField('考试机会', default=1) # 0表示不限次数 paper = models.ForeignKey(Paper, verbose_name='使用的试卷', on_delete=models.SET_NULL, null=True, blank=True) is_public = models.BooleanField('是否公开', default=False) p_users = models.ManyToManyField(User, verbose_name='指定用户', blank=True) p_depts = models.ManyToManyField(Dept, verbose_name='指定部门', blank=True) paper_json = models.JSONField('试卷JSON', null=True, blank=True) class Meta: verbose_name = '在线考试' verbose_name_plural = verbose_name def __str__(self): return self.name class ExamRecord(CommonADModel): ''' 考试记录表 ''' exam = models.ForeignKey(Exam, on_delete=models.CASCADE, verbose_name='关联考试', related_name='record_exam') score = models.FloatField(default=0, verbose_name='得分') took = models.IntegerField(default=0, verbose_name='耗时(秒)') start_time = models.DateTimeField(verbose_name='开始答题时间') end_time = models.DateTimeField(verbose_name='结束答题时间', null=True, blank=True) questions = models.ManyToManyField(Question, verbose_name='答题记录', through='AnswerDetail') is_pass = models.BooleanField(default=True, verbose_name='是否通过') is_submited = models.BooleanField(default=False, verbose_name='是否提交') is_last = models.BooleanField(default=False, verbose_name='是否最后一次考试记录') class Meta: verbose_name = '考试记录' verbose_name_plural = verbose_name class AnswerDetail(BaseModel): examrecord = models.ForeignKey(ExamRecord, on_delete=models.CASCADE, related_name='detail_er') total_score = models.FloatField(default=0, verbose_name='该题满分') question = models.ForeignKey(Question, on_delete=models.CASCADE) user_answer = models.JSONField(null=True,blank=True) score = models.FloatField(default=0, verbose_name='本题得分') is_right = models.BooleanField(default=False, verbose_name='是否正确') class Meta: verbose_name = '答题记录' verbose_name_plural = verbose_name