142 lines
6.5 KiB
Python
142 lines
6.5 KiB
Python
from django.db import models
|
|
from apps.system.models import CommonAModel, CommonADModel, CommonBDModel
|
|
from django.contrib.postgres.fields import JSONField
|
|
from utils.model import BaseModel
|
|
from apps.edu.models import Course
|
|
from apps.system.models import User, Organization
|
|
# Create your models here.
|
|
class Questioncat(CommonAModel):
|
|
name = models.CharField(max_length=200, verbose_name='名称')
|
|
parent = models.ForeignKey('self', verbose_name='父', null=True, blank=True, on_delete=models.CASCADE, related_name='questioncat_parent')
|
|
class Meta:
|
|
verbose_name = '题目分类'
|
|
verbose_name_plural = verbose_name
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
@property
|
|
def tmtotal(self):
|
|
return self.questioncat.count()
|
|
|
|
|
|
class Question(CommonADModel):
|
|
type_choices = (
|
|
('单选', '单选'),
|
|
('多选', '多选'),
|
|
('判断', '判断'),
|
|
)
|
|
level_choices = (
|
|
('低', '低'),
|
|
('中', '中'),
|
|
('高', '高'),
|
|
)
|
|
name = models.TextField(verbose_name='题干')
|
|
img = models.CharField(max_length=1000, null=True, blank=True, verbose_name='题干图片')
|
|
type = models.CharField(max_length=50, default='单选', choices=type_choices, verbose_name='题型')
|
|
level = models.CharField(max_length=50, default='低', choices=level_choices, verbose_name='难度')
|
|
questioncat = models.ForeignKey(Questioncat, blank=True, null=True, on_delete=models.SET_NULL, verbose_name='所属题库', related_name='questioncat')
|
|
options = JSONField(verbose_name='选项')
|
|
right = JSONField(verbose_name='正确答案')
|
|
resolution = models.TextField(verbose_name='解析', blank=True)
|
|
enabled = models.BooleanField('是否启用', default=False)
|
|
year = models.IntegerField('真题年份', null=True, blank=True)
|
|
|
|
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='名称', unique=True)
|
|
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='单题满分')
|
|
|
|
|
|
class Exam(CommonAModel):
|
|
"""
|
|
组织的正式考试
|
|
"""
|
|
code = models.CharField('考试编号', max_length=100, null=True, blank=True, unique=True)
|
|
name = models.CharField('名称', max_length=100, unique=True)
|
|
place = models.CharField('考试地点', max_length=100, null=True, blank=True)
|
|
open_time = models.DateTimeField('开启时间', null=True, blank=True)
|
|
close_time = models.DateTimeField('关闭时间', null=True, blank=True)
|
|
proctor_name = models.CharField('监考人姓名', max_length=100, null=True, blank=True)
|
|
proctor_phone = models.CharField('监考人联系方式', max_length=100, null=True, blank=True)
|
|
chance = models.IntegerField('考试机会', default=3)
|
|
paper = models.ForeignKey(Paper, verbose_name='使用的试卷', on_delete=models.CASCADE, null=True, blank=True)
|
|
certificate = models.BooleanField('是否生成证书', default=False)
|
|
course_name = models.ManyToManyField(Course, blank=True)
|
|
participant_dep = models.ManyToManyField(Organization, verbose_name='考试公司', related_name='exam_dep',null=True, blank=True)
|
|
participant_user = models.ManyToManyField(User, verbose_name='考试人员', related_name='exam_user', null=True, blank=True)
|
|
is_open = models.BooleanField('是否公开', default=True)
|
|
|
|
def __str__(self):
|
|
return self.name
|
|
|
|
|
|
class ExamRecord(CommonBDModel):
|
|
'''
|
|
考试记录表
|
|
'''
|
|
type_choices = (
|
|
('自助模考', '自助模考'),
|
|
('押卷模考', '押卷模考'),
|
|
('正式考试', '正式考试')
|
|
)
|
|
name = models.CharField(max_length=200, verbose_name='名称')
|
|
type = models.CharField(max_length=50, default='自助模考',choices = type_choices, verbose_name='考试类型')
|
|
limit = models.IntegerField(default=0, verbose_name='限时(分钟)')
|
|
paper = models.ForeignKey(Paper, on_delete=models.SET_NULL, verbose_name='所用试卷', null=True, blank=True)
|
|
total_score = models.FloatField(default=0, verbose_name='总分')
|
|
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)
|
|
detail = models.ManyToManyField(Question, verbose_name='答题记录', through='AnswerDetail')
|
|
is_pass = models.BooleanField(default=True, verbose_name='是否通过')
|
|
exam = models.ForeignKey(Exam, verbose_name='关联的正式考试', null=True, blank=True, on_delete= models.SET_NULL)
|
|
is_submited = models.BooleanField(default=False)
|
|
|
|
class Meta:
|
|
verbose_name = '考试记录'
|
|
verbose_name_plural = verbose_name
|
|
|
|
|
|
|
|
class AnswerDetail(BaseModel):
|
|
examrecord = models.ForeignKey(ExamRecord, on_delete=models.CASCADE)
|
|
total_score = models.FloatField(default=0, verbose_name='该题满分')
|
|
question = models.ForeignKey(Question, on_delete=models.CASCADE)
|
|
user_answer = 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
|
|
|