feat: 考试列表过滤
This commit is contained in:
parent
6de96ce19a
commit
fde4bdf0ea
|
@ -1,4 +1,5 @@
|
||||||
from django_filters import rest_framework as filters
|
from django_filters import rest_framework as filters
|
||||||
|
from django.utils import timezone
|
||||||
from .models import ExamRecord, Exam
|
from .models import ExamRecord, Exam
|
||||||
class ExamRecordFilter(filters.FilterSet):
|
class ExamRecordFilter(filters.FilterSet):
|
||||||
class Meta:
|
class Meta:
|
||||||
|
@ -11,6 +12,7 @@ class ExamRecordFilter(filters.FilterSet):
|
||||||
}
|
}
|
||||||
|
|
||||||
class ExamFilter(filters.FilterSet):
|
class ExamFilter(filters.FilterSet):
|
||||||
|
can_attend = filters.BooleanFilter(method='filter_can_attend')
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Exam
|
model = Exam
|
||||||
fields = {
|
fields = {
|
||||||
|
@ -19,3 +21,9 @@ class ExamFilter(filters.FilterSet):
|
||||||
'code': ['exact'],
|
'code': ['exact'],
|
||||||
'is_open': ['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
|
|
@ -25,6 +25,7 @@ from apps.system.permission import has_permission
|
||||||
from apps.exam.parse_word import interpret_text
|
from apps.exam.parse_word import interpret_text
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
|
from django.db.models import Q
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
|
|
||||||
EXCEL_PATH = os.path.join(settings.BASE_DIR, "media/default/question.xlsx")
|
EXCEL_PATH = os.path.join(settings.BASE_DIR, "media/default/question.xlsx")
|
||||||
|
@ -412,7 +413,7 @@ class PaperViewSet(ModelViewSet):
|
||||||
|
|
||||||
|
|
||||||
class ExamViewSet(CreateUpdateCustomMixin, 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')
|
queryset = Exam.objects.all().select_related('paper', 'create_by')
|
||||||
ordering = ['-id']
|
ordering = ['-id']
|
||||||
search_fields = ('name',)
|
search_fields = ('name',)
|
||||||
|
@ -426,6 +427,24 @@ class ExamViewSet(CreateUpdateCustomMixin, ModelViewSet):
|
||||||
return ExamDetailSerializer
|
return ExamDetailSerializer
|
||||||
return super().get_serializer_class()
|
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):
|
def destroy(self, request, *args, **kwargs):
|
||||||
instance = self.get_object()
|
instance = self.get_object()
|
||||||
if ExamRecord.objects.filter(exam=instance).exists():
|
if ExamRecord.objects.filter(exam=instance).exists():
|
||||||
|
@ -538,10 +557,16 @@ class ExamRecordViewSet(ListModelMixin, DestroyModelMixin, RetrieveModelMixin, G
|
||||||
个人考试记录
|
个人考试记录
|
||||||
'''
|
'''
|
||||||
queryset = ExamRecord.objects.filter(create_by=request.user).order_by('-update_time')
|
queryset = ExamRecord.objects.filter(create_by=request.user).order_by('-update_time')
|
||||||
|
queryset = self.filter_queryset(queryset)
|
||||||
|
|
||||||
page = self.paginate_queryset(queryset)
|
page = self.paginate_queryset(queryset)
|
||||||
|
if page is not None:
|
||||||
serializer = self.get_serializer(page, many=True)
|
serializer = self.get_serializer(page, many=True)
|
||||||
return self.get_paginated_response(serializer.data)
|
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])
|
@action(methods=['post'], detail=True, perms_map=[{'post': '*'}], serializer_class=ExamRecordSubmitSerializer, permission_classes = [IsAuthenticated])
|
||||||
@transaction.atomic
|
@transaction.atomic
|
||||||
def submit(self, request, pk=None):
|
def submit(self, request, pk=None):
|
||||||
|
|
Loading…
Reference in New Issue