diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index 04ab1ee..a69cac7 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -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',) \ No newline at end of file + 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('有效考试不存在')