feat: 考试列表过滤

This commit is contained in:
caoqianming 2024-05-31 10:23:20 +08:00
parent 6de96ce19a
commit fde4bdf0ea
2 changed files with 37 additions and 4 deletions

View File

@ -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']
}
}
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

View File

@ -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