From fde4bdf0ea70fe1401348a612cd232f6a3c430cb Mon Sep 17 00:00:00 2001 From: caoqianming Date: Fri, 31 May 2024 10:23:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=80=83=E8=AF=95=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/exam/filters.py | 10 +++++++++- server/apps/exam/views.py | 31 ++++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/server/apps/exam/filters.py b/server/apps/exam/filters.py index 8b14f43..4f077e6 100644 --- a/server/apps/exam/filters.py +++ b/server/apps/exam/filters.py @@ -1,4 +1,5 @@ from django_filters import rest_framework as filters +from django.utils import timezone from .models import ExamRecord, Exam class ExamRecordFilter(filters.FilterSet): class Meta: @@ -11,6 +12,7 @@ class ExamRecordFilter(filters.FilterSet): } class ExamFilter(filters.FilterSet): + can_attend = filters.BooleanFilter(method='filter_can_attend') class Meta: model = Exam fields = { @@ -18,4 +20,10 @@ class ExamFilter(filters.FilterSet): 'paper': ['exact'], 'code': ['exact'], 'is_open': ['exact'] - } \ No newline at end of file + } + + def filter_can_attend(self, queryset, name, value): + if value: + now = timezone.now() + return queryset.filter(open_time__lte=now, close_time__gte=now)| queryset.filter(close_time__isnull=True) + return queryset \ No newline at end of file diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index fe6e689..188b43e 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -25,6 +25,7 @@ from apps.system.permission import has_permission from apps.exam.parse_word import interpret_text import os import shutil +from django.db.models import Q # Create your views here. EXCEL_PATH = os.path.join(settings.BASE_DIR, "media/default/question.xlsx") @@ -412,7 +413,7 @@ class PaperViewSet(ModelViewSet): class ExamViewSet(CreateUpdateCustomMixin, ModelViewSet): - perms_map = {'get': '*', 'post':'exam', 'put':'exam', 'delete':'exam'} + perms_map = {'get': 'exam', 'post':'exam', 'put':'exam', 'delete':'exam'} queryset = Exam.objects.all().select_related('paper', 'create_by') ordering = ['-id'] search_fields = ('name',) @@ -425,6 +426,24 @@ class ExamViewSet(CreateUpdateCustomMixin, ModelViewSet): elif self.action in ['retrieve']: return ExamDetailSerializer return super().get_serializer_class() + + @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) + def self(self, request, pk=None): + ''' + 跟我有关的考试 + + 跟我有关的考试 + ''' + queryset = self.get_queryset().filter(Q(participant_user=request.user)|Q(participant_dep=request.user.dept)) + queryset = self.filter_queryset(queryset) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) def destroy(self, request, *args, **kwargs): instance = self.get_object() @@ -538,9 +557,15 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, G 个人考试记录 ''' queryset = ExamRecord.objects.filter(create_by=request.user).order_by('-update_time') + queryset = self.filter_queryset(queryset) + page = self.paginate_queryset(queryset) - serializer = self.get_serializer(page, many=True) - return self.get_paginated_response(serializer.data) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(queryset, many=True) + return Response(serializer.data) @action(methods=['post'], detail=True, perms_map=[{'post': '*'}], serializer_class=ExamRecordSubmitSerializer, permission_classes = [IsAuthenticated]) @transaction.atomic