cma_search 修改
This commit is contained in:
parent
47deee8567
commit
851e9291ab
|
|
@ -1,18 +1,44 @@
|
||||||
from django.shortcuts import render
|
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, PaperQuestion
|
||||||
from apps.exam.serializers import QuestionSerializer, QuestioncatSerializer, PaperSerializer
|
from apps.exam.serializers import (QuestionSerializer, QuestioncatSerializer, PaperSerializer,
|
||||||
|
ExamCreateUpdateSerializer, ExamListSerializer, ExamAttendSerializer, PaperDetailSerializer, PaperCreateUpdateSerializer)
|
||||||
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 rest_framework.exceptions import ParseError
|
||||||
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
|
from apps.exam.models import Paper, Exam, ExamRecord, AnswerDetail
|
||||||
|
from django.utils import timezone
|
||||||
|
from django.db import transaction
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
||||||
|
|
||||||
|
def enctry(s):
|
||||||
|
k = 'ez9z3a4m*$%srn9ve_t71yd!v+&xn9@0k(e(+l6#g1h=e5i4da'
|
||||||
|
encry_str = ""
|
||||||
|
for i, j in zip(s, k):
|
||||||
|
# i为字符,j为秘钥字符
|
||||||
|
temp = str(ord(i)+ord(j))+'_' # 加密字符 = 字符的Unicode码 + 秘钥的Unicode码
|
||||||
|
encry_str = encry_str + temp
|
||||||
|
return encry_str
|
||||||
|
|
||||||
|
|
||||||
|
# 解密
|
||||||
|
def dectry(p):
|
||||||
|
k = 'ez9z3a4m*$%srn9ve_t71yd!v+&xn9@0k(e(+l6#g1h=e5i4da'
|
||||||
|
dec_str = ""
|
||||||
|
for i, j in zip(p.split("_")[:-1], k):
|
||||||
|
# i 为加密字符,j为秘钥字符
|
||||||
|
# 解密字符 = (加密Unicode码字符 - 秘钥字符的Unicode码)的单字节字符
|
||||||
|
temp = chr(int(i) - ord(j))
|
||||||
|
dec_str = dec_str+temp
|
||||||
|
return dec_str
|
||||||
|
|
||||||
|
|
||||||
class QuestioncatViewSet(ModelViewSet):
|
class QuestioncatViewSet(ModelViewSet):
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
queryset = Questioncat.objects.all()
|
queryset = Questioncat.objects.all()
|
||||||
|
|
@ -180,8 +206,66 @@ class PaperViewSet(ModelViewSet):
|
||||||
ordering = ['id']
|
ordering = ['id']
|
||||||
search_fields = ('name',)
|
search_fields = ('name',)
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.action in ['retrieve']:
|
||||||
|
return PaperDetailSerializer
|
||||||
|
elif self.action in ['create', 'update']:
|
||||||
|
return PaperCreateUpdateSerializer
|
||||||
|
return PaperSerializer
|
||||||
|
|
||||||
|
def create(self, request, *args, **kwargs):
|
||||||
|
sr = PaperCreateUpdateSerializer(data=request.data)
|
||||||
|
sr.is_valid(raise_exception=True)
|
||||||
|
vdata = sr.validated_data
|
||||||
|
questions_ = vdata.pop('questions_')
|
||||||
|
paper = Paper.objects.create(**vdata)
|
||||||
|
q_list = []
|
||||||
|
for i in questions_:
|
||||||
|
question = Question.objects.get(id=i['id'])
|
||||||
|
q_list.append(PaperQuestion(question=question, total_score=i['total_score'], paper=paper))
|
||||||
|
PaperQuestion.objects.bulk_create(q_list)
|
||||||
|
return Response(status=201)
|
||||||
|
|
||||||
|
def update(self, request, *args, **kwargs):
|
||||||
|
return super().update(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class ExamViewSet(ModelViewSet):
|
class ExamViewSet(ModelViewSet):
|
||||||
perms_map = {'*': '*'}
|
perms_map = {'*': '*'}
|
||||||
|
queryset = Exam.objects.all()
|
||||||
ordering = ['-id']
|
ordering = ['-id']
|
||||||
search_fields = ('name',)
|
search_fields = ('name',)
|
||||||
|
|
||||||
|
def get_serializer_class(self):
|
||||||
|
if self.action in ['create', 'update']:
|
||||||
|
return ExamCreateUpdateSerializer
|
||||||
|
return ExamListSerializer
|
||||||
|
|
||||||
|
def destroy(self, request, *args, **kwargs):
|
||||||
|
instance = self.get_object()
|
||||||
|
if ExamRecord.objects.filter(exam=instance).exists():
|
||||||
|
raise ParseError('存在考试记录,禁止删除')
|
||||||
|
instance.delete()
|
||||||
|
return Response(status=204)
|
||||||
|
|
||||||
|
@action(methods=['post'], detail=False, perms_map=[{'post': '*'}], serializer_class=ExamAttendSerializer)
|
||||||
|
def attend(self, request, *args, **kwargs):
|
||||||
|
"""
|
||||||
|
参加考试
|
||||||
|
|
||||||
|
参加考试
|
||||||
|
"""
|
||||||
|
sr = ExamAttendSerializer(data=request.data)
|
||||||
|
sr.is_valid(raise_exception=True)
|
||||||
|
vdata = sr.validated_data
|
||||||
|
code = vdata['code']
|
||||||
|
now = timezone.now()
|
||||||
|
exam = Exam.objects.filter(
|
||||||
|
code=code, open_time__lt=now, close_time__gt=now).first()
|
||||||
|
if exam:
|
||||||
|
tests = ExamRecord.objects.filter(
|
||||||
|
exam=exam, create_by=request.user)
|
||||||
|
if tests.count() < exam.chance: # 还有考试机会就可以接着考
|
||||||
|
return Response(ExamListSerializer(instance=exam).data)
|
||||||
|
raise ParseError('考试机会已用完')
|
||||||
|
raise ParseError('有效考试不存在')
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue