From 2c643ca2695fe7f8d8e922872b264526c054e5b6 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 8 Nov 2022 10:06:40 +0800 Subject: [PATCH] =?UTF-8?q?=E8=80=83=E8=AF=95api=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E5=AE=8C=E6=88=902?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/exam/filters.py | 21 +++++++++++---- server/apps/exam/serializers.py | 4 +-- server/apps/exam/urls.py | 5 +++- server/apps/exam/views.py | 48 ++++++++++++++++++++++++++------- 4 files changed, 60 insertions(+), 18 deletions(-) diff --git a/server/apps/exam/filters.py b/server/apps/exam/filters.py index 7561fc0..2e7dca0 100644 --- a/server/apps/exam/filters.py +++ b/server/apps/exam/filters.py @@ -1,9 +1,20 @@ from django_filters import rest_framework as filters -from .models import ExamRecord +from .models import ExamRecord, Exam class ExamRecordFilter(filters.FilterSet): - start_date = filters.DateFilter(field_name="update_time", lookup_expr='gte') - end_date = filters.DateFilter(field_name="update_time", lookup_expr='lte') - class Meta: model = ExamRecord - fields = ['is_pass', 'type', 'start_date', 'end_date', 'is_submited'] \ No newline at end of file + fields = { + 'start_time': ['exact', 'gte', 'lte'], + 'is_pass': ['exact'], + 'type': ['exact'], + 'is_submited': ['exact'], + } + +class ExamFilter(filters.FilterSet): + class Meta: + model = Exam + fields = { + 'close_time': ['exact', 'gte', 'lte'], + 'paper': ['exact'], + 'code': ['exact'] + } \ No newline at end of file diff --git a/server/apps/exam/serializers.py b/server/apps/exam/serializers.py index 3ac83b2..cab519c 100644 --- a/server/apps/exam/serializers.py +++ b/server/apps/exam/serializers.py @@ -25,7 +25,7 @@ class PaperSerializer(ModelSerializer): class PaperQuestionSerializer(ModelSerializer): class Meta: model = PaperQuestion - fields = ['question', 'total_score', 'sort'] + fields = ['question', 'total_score'] class PaperCreateUpdateSerializer(ModelSerializer): @@ -133,7 +133,7 @@ class ExamRecordDetailSerializer(serializers.ModelSerializer): h, m = divmod(m, 60) return "%02d:%02d:%02d" % (h, m, s) - def get_questions(self, obj): + def get_questions_(self, obj): objs = AnswerDetail.objects.select_related('question').filter( examrecord=obj).order_by('question__type') return AnswerDetailSerializer(instance=objs, many=True).data diff --git a/server/apps/exam/urls.py b/server/apps/exam/urls.py index 86eb1b5..93ba0f1 100644 --- a/server/apps/exam/urls.py +++ b/server/apps/exam/urls.py @@ -1,13 +1,16 @@ from django.urls import path, include from rest_framework import routers -from apps.exam.views import QuestionViewSet, QuestioncatViewSet +from apps.exam.views import QuestionViewSet, QuestioncatViewSet, PaperViewSet, ExamViewSet, ExamRecordViewSet API_BASE_URL = 'api/exam/' HTML_BASE_URL = 'exam/' router = routers.DefaultRouter() router.register('questioncat', QuestioncatViewSet, basename='questioncat') router.register('question', QuestionViewSet, basename="question") +router.register('paper', PaperViewSet, basename="paper") +router.register('exam', ExamViewSet, basename="exam") +router.register('examrecord', ExamRecordViewSet, basename="examrecord") urlpatterns = [ path(API_BASE_URL, include(router.urls)) ] diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index da12242..9478c32 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -15,7 +15,7 @@ from django.utils import timezone from django.db import transaction from rest_framework.serializers import Serializer from datetime import datetime -from apps.exam.filters import ExamRecordFilter +from apps.exam.filters import ExamRecordFilter, ExamFilter from datetime import timedelta # Create your views here. @@ -44,7 +44,7 @@ def dectry(p): class QuestioncatViewSet(ModelViewSet): - perms_map = {'*': '*'} + perms_map = {'get': '*', 'post':'question', 'put':'question', 'delete':'question'} queryset = Questioncat.objects.all() serializer_class = QuestioncatSerializer filterset_fields = ['parent'] @@ -52,7 +52,7 @@ class QuestioncatViewSet(ModelViewSet): class QuestionViewSet(ModelViewSet): - perms_map = {'*': '*'} + perms_map = {'get': '*', 'post':'question', 'put':'question', 'delete':'question'} queryset = Question.objects.all() serializer_class = QuestionSerializer filterset_fields = ['level', 'type', 'year'] @@ -61,21 +61,33 @@ class QuestionViewSet(ModelViewSet): @action(methods=['get'], detail=False, url_path='export', url_name='export_question', perms_map=[{'get': '*'}]) def export_question(self, request): + """ + 导出题目 + + 导出题目 + """ queryset = self.filter_queryset(self.get_queryset()) path = export_question(queryset) return Response({'path': path}) - @action(methods=['post'], detail=False, url_name='enable_question', permission_classes=[IsAuthenticated]) + @action(methods=['post'], detail=False, url_name='enable_question', perms_map={'post': 'question'}) def enable(self, request): + """ + 启用题目 + + 启用题目 + """ ids = request.data.get('ids', None) if ids: Question.objects.filter(pk__in=ids).update(enabled=True) return Response(status=200) @action(methods=['post'], detail=False, - url_path='import', url_name='import_question', perms_map=[{'post': '*'}]) + url_path='import', url_name='import_question', perms_map={'post': 'question'}) def import_question(self, request): """ + 导入题目 + 导入题目 """ xlsxpath = request.data['path'] @@ -204,7 +216,7 @@ class PaperViewSet(ModelViewSet): """ 试卷增删改查 """ - perms_map = {'*': '*'} + perms_map = {'get': '*', 'post':'paper', 'put':'paper', 'delete':'paper'} queryset = Paper.objects.all() serializer_class = PaperSerializer ordering = ['id'] @@ -249,10 +261,11 @@ class PaperViewSet(ModelViewSet): class ExamViewSet(ModelViewSet): - perms_map = {'*': '*'} + perms_map = {'get': '*', 'post':'exam', 'put':'exam', 'delete':'exam'} queryset = Exam.objects.all().select_related('paper', 'create_by') ordering = ['-id'] search_fields = ('name',) + filterset_class = ExamFilter def get_serializer_class(self): if self.action in ['create', 'update']: @@ -265,7 +278,7 @@ class ExamViewSet(ModelViewSet): instance = self.get_object() if ExamRecord.objects.filter(exam=instance).exists(): raise ParseError('存在考试记录,禁止删除') - instance.delete() + instance.delete(soft=False) return Response(status=204) @action(methods=['post'], detail=True, perms_map=[{'post': '*'}], serializer_class=Serializer, permission_classes = [IsAuthenticated]) @@ -273,7 +286,7 @@ class ExamViewSet(ModelViewSet): """ 开始考试 - 开始考试返回时间和题目信息 + 开始考试具体题目信息 """ exam = self.get_object() now = timezone.now() @@ -312,7 +325,7 @@ class ExamRecordViewSet(ModelViewSet): """ 考试记录列表和详情 """ - perms_map = {'get': '*', 'post': '*', 'delete':'examrecord_delete'} + perms_map = {'get': 'examrecord', 'post': '*', 'delete':'examrecord'} queryset = ExamRecord.objects.select_related('create_by') serializer_class = ExamRecordListSerializer ordering_fields = ['create_time', 'score', 'took', 'update_time'] @@ -325,6 +338,21 @@ class ExamRecordViewSet(ModelViewSet): return ExamRecordDetailSerializer return ExamRecordListSerializer + def perform_destroy(self, instance): # 考试记录物理删除 + instance.delete(soft=False) + + @action(methods=['post'], detail=True, perms_map=[{'post': '*'}], serializer_class=Serializer, permission_classes = [IsAuthenticated]) + def clear(self, request, pk=None): + """ + 清除七日前未提交的考试记录 + + 清除七日前未提交的考试记录 + """ + now = timezone.now + days7_ago = now - timedelta(days=7) + ExamRecord.objects.filter(create_time__lte=days7_ago, is_submited=False).delete(soft=False) + return Response(status=False) + @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) def self(self, request, pk=None): '''