cma_search 修改

This commit is contained in:
caoqianming 2022-11-04 17:11:50 +08:00
parent 47deee8567
commit 851e9291ab
1 changed files with 88 additions and 4 deletions

View File

@ -1,18 +1,44 @@
from django.shortcuts import render
from rest_framework.viewsets import ModelViewSet
from apps.exam.exports import export_question
from apps.exam.models import Question, Questioncat
from apps.exam.serializers import QuestionSerializer, QuestioncatSerializer, PaperSerializer
from apps.exam.models import Question, Questioncat, PaperQuestion
from apps.exam.serializers import (QuestionSerializer, QuestioncatSerializer, PaperSerializer,
ExamCreateUpdateSerializer, ExamListSerializer, ExamAttendSerializer, PaperDetailSerializer, PaperCreateUpdateSerializer)
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.exceptions import ParseError
from openpyxl import Workbook, load_workbook
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.
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):
perms_map = {'*': '*'}
queryset = Questioncat.objects.all()
@ -180,8 +206,66 @@ class PaperViewSet(ModelViewSet):
ordering = ['id']
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):
perms_map = {'*': '*'}
queryset = Exam.objects.all()
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('有效考试不存在')