增加paper表等
This commit is contained in:
		
							parent
							
								
									4d4b62c42a
								
							
						
					
					
						commit
						47deee8567
					
				| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
from django.db import models
 | 
					from django.db import models
 | 
				
			||||||
from apps.system.models import CommonAModel
 | 
					from apps.system.models import CommonAModel
 | 
				
			||||||
from django.contrib.postgres.fields import JSONField
 | 
					from django.contrib.postgres.fields import JSONField
 | 
				
			||||||
 | 
					from utils.model import BaseModel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Create your models here.
 | 
					# Create your models here.
 | 
				
			||||||
class Questioncat(CommonAModel):
 | 
					class Questioncat(CommonAModel):
 | 
				
			||||||
| 
						 | 
					@ -45,3 +46,86 @@ class Question(CommonAModel):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __str__(self):
 | 
					    def __str__(self):
 | 
				
			||||||
        return self.name
 | 
					        return self.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class Paper(CommonAModel):
 | 
				
			||||||
 | 
					    name = models.CharField(max_length=200, verbose_name='名称')
 | 
				
			||||||
 | 
					    questions = models.ManyToManyField(Question, through='PaperQuestions')
 | 
				
			||||||
 | 
					    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 PaperQuestions(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)
 | 
				
			||||||
 | 
					    name = models.CharField('名称', max_length=100)
 | 
				
			||||||
 | 
					    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)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def __str__(self):
 | 
				
			||||||
 | 
					        return self.name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ExamTest(CommonAModel):
 | 
				
			||||||
 | 
					    '''
 | 
				
			||||||
 | 
					    考试记录表
 | 
				
			||||||
 | 
					    '''
 | 
				
			||||||
 | 
					    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='结束答题时间')
 | 
				
			||||||
 | 
					    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, related_name='examtest_exam', on_delete= models.SET_NULL)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    class Meta:
 | 
				
			||||||
 | 
					        verbose_name = '模拟考试'
 | 
				
			||||||
 | 
					        verbose_name_plural = verbose_name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class AnswerDetail(BaseModel):
 | 
				
			||||||
 | 
					    examtest = models.ForeignKey(ExamTest, on_delete=models.CASCADE, related_name='answerdetail_examtest')
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,6 @@
 | 
				
			||||||
from rest_framework.serializers import ModelSerializer
 | 
					from rest_framework.serializers import ModelSerializer, CharField
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from apps.exam.models import Question, Questioncat
 | 
					from apps.exam.models import Question, Questioncat, Paper, Exam
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class QuestioncatSerializer(ModelSerializer):
 | 
					class QuestioncatSerializer(ModelSerializer):
 | 
				
			||||||
| 
						 | 
					@ -13,3 +13,20 @@ class QuestionSerializer(ModelSerializer):
 | 
				
			||||||
    class Meta:
 | 
					    class Meta:
 | 
				
			||||||
        model = Question
 | 
					        model = Question
 | 
				
			||||||
        fields = '__all__'
 | 
					        fields = '__all__'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class PaperSerializer(ModelSerializer):
 | 
				
			||||||
 | 
					    class Meta:
 | 
				
			||||||
 | 
					        model = Paper
 | 
				
			||||||
 | 
					        exclude = ('questions',)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ExamCreateUpdateSerializer(ModelSerializer):
 | 
				
			||||||
 | 
					    class Meta:
 | 
				
			||||||
 | 
					        model = Exam
 | 
				
			||||||
 | 
					        fields = ['name', 'place', 'open_time', 'close_time', 'proctor_name', 'proctor_phone']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ExamListSerializer(ModelSerializer):
 | 
				
			||||||
 | 
					    create_by_name = CharField(source='create_by.name', read_only=True)
 | 
				
			||||||
 | 
					    class Meta:
 | 
				
			||||||
 | 
					        model = Exam
 | 
				
			||||||
 | 
					        fields = '__all__'
 | 
				
			||||||
| 
						 | 
					@ -2,12 +2,13 @@ from django.shortcuts import render
 | 
				
			||||||
from rest_framework.viewsets import ModelViewSet
 | 
					from rest_framework.viewsets import ModelViewSet
 | 
				
			||||||
from apps.exam.exports import export_question
 | 
					from apps.exam.exports import export_question
 | 
				
			||||||
from apps.exam.models import Question, Questioncat
 | 
					from apps.exam.models import Question, Questioncat
 | 
				
			||||||
from apps.exam.serializers import QuestionSerializer, QuestioncatSerializer
 | 
					from apps.exam.serializers import QuestionSerializer, QuestioncatSerializer, PaperSerializer
 | 
				
			||||||
from rest_framework.decorators import action
 | 
					from rest_framework.decorators import action
 | 
				
			||||||
from rest_framework.response import Response
 | 
					from rest_framework.response import Response
 | 
				
			||||||
from rest_framework.permissions import IsAuthenticated
 | 
					from rest_framework.permissions import IsAuthenticated
 | 
				
			||||||
from openpyxl import Workbook, load_workbook
 | 
					from openpyxl import Workbook, load_workbook
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					from apps.exam.models import Paper
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Create your views here.
 | 
					# Create your views here.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -167,3 +168,20 @@ class QuestionViewSet(ModelViewSet):
 | 
				
			||||||
                    obj.save()
 | 
					                    obj.save()
 | 
				
			||||||
            i = i + 1
 | 
					            i = i + 1
 | 
				
			||||||
        return Response(notinlist, status=200)
 | 
					        return Response(notinlist, status=200)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class PaperViewSet(ModelViewSet):
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    试卷增删改查
 | 
				
			||||||
 | 
					    """
 | 
				
			||||||
 | 
					    perms_map = {'*': '*'}
 | 
				
			||||||
 | 
					    queryset = Paper.objects.all()
 | 
				
			||||||
 | 
					    serializer_class = PaperSerializer
 | 
				
			||||||
 | 
					    ordering = ['id']
 | 
				
			||||||
 | 
					    search_fields = ('name',)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class ExamViewSet(ModelViewSet):
 | 
				
			||||||
 | 
					    perms_map = {'*': '*'}
 | 
				
			||||||
 | 
					    ordering = ['-id']
 | 
				
			||||||
 | 
					    search_fields = ('name',)
 | 
				
			||||||
		Loading…
	
		Reference in New Issue