From 527496094531baf76769abfd2d97c9858f055379 Mon Sep 17 00:00:00 2001 From: zty Date: Fri, 31 May 2024 11:03:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E8=80=83=E8=AF=95=E8=AE=B0=E5=BD=95=E6=8E=A5=E5=8F=A3=E5=92=8C?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E5=8F=82=E4=B8=8E=E8=80=83=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/apps/exam/filters.py | 17 ++++++++++++++- server/apps/exam/views.py | 41 +++++++------------------------------ 2 files changed, 23 insertions(+), 35 deletions(-) diff --git a/server/apps/exam/filters.py b/server/apps/exam/filters.py index 4f077e6..9d85eae 100644 --- a/server/apps/exam/filters.py +++ b/server/apps/exam/filters.py @@ -1,7 +1,9 @@ from django_filters import rest_framework as filters from django.utils import timezone from .models import ExamRecord, Exam +from django.db.models import Q class ExamRecordFilter(filters.FilterSet): + is_my = filters.BooleanFilter(method='filter_is_my') class Meta: model = ExamRecord fields = { @@ -10,9 +12,15 @@ class ExamRecordFilter(filters.FilterSet): 'type': ['exact'], 'is_submited': ['exact'], } + def filter_is_my(self, queryset, name, value): + if value: + user = self.request.user + return queryset.filter(create_by=user) + return queryset class ExamFilter(filters.FilterSet): can_attend = filters.BooleanFilter(method='filter_can_attend') + is_my = filters.BooleanFilter(method='filter_is_my') class Meta: model = Exam fields = { @@ -26,4 +34,11 @@ class ExamFilter(filters.FilterSet): 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 + return queryset + + def filter_is_my(self, queryset, name, value): + if value: + user = self.request.user + return queryset.filter(Q(participant_user=user)|Q(participant_dep=user.dept)|Q(is_open=True)) + return queryset + \ No newline at end of file diff --git a/server/apps/exam/views.py b/server/apps/exam/views.py index 188b43e..a37e6b4 100644 --- a/server/apps/exam/views.py +++ b/server/apps/exam/views.py @@ -413,7 +413,7 @@ class PaperViewSet(ModelViewSet): class ExamViewSet(CreateUpdateCustomMixin, ModelViewSet): - perms_map = {'get': 'exam', 'post':'exam', 'put':'exam', 'delete':'exam'} + perms_map = {'get': '*', 'post':'exam', 'put':'exam', 'delete':'exam'} queryset = Exam.objects.all().select_related('paper', 'create_by') ordering = ['-id'] search_fields = ('name',) @@ -427,23 +427,13 @@ class ExamViewSet(CreateUpdateCustomMixin, ModelViewSet): return ExamDetailSerializer return super().get_serializer_class() - @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) - def self(self, request, pk=None): - ''' - 跟我有关的考试 + def get_queryset(self): + qs = super().get_queryset() + user = self.request.user + if has_permission("exam", user): + return qs + return qs.filter(Q(participant_user=user)|Q(participant_dep=user.dept)|Q(is_open=True)) - 跟我有关的考试 - ''' - 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() @@ -549,23 +539,6 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, G 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): - ''' - 个人考试记录 - - 个人考试记录 - ''' - queryset = ExamRecord.objects.filter(create_by=request.user).order_by('-update_time') - 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) @action(methods=['post'], detail=True, perms_map=[{'post': '*'}], serializer_class=ExamRecordSubmitSerializer, permission_classes = [IsAuthenticated]) @transaction.atomic