cma_search/server/apps/exam/models.py

149 lines
6.9 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.CharField(max_length=200, verbose_name='真题年份和备注', null=True, blank=True)
class Meta:
verbose_name = '题目'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Paper(CommonAModel):
cate_types = (
('押题', '押题'),
('抽考', '抽考'),
)
paper_types = models.CharField(default='押题', max_length=50, choices=cate_types, verbose_name='试卷类型')
name = models.CharField(max_length=200, verbose_name='名称', unique=True)
questions = models.ManyToManyField(Question, through='PaperQuestion', null=True, blank=True)
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='判断分数')
category = models.ManyToManyField(Questioncat,verbose_name='题库分类',related_name='paper_category',null=True, blank=True)
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