考试api基本完成2

This commit is contained in:
caoqianming 2022-11-08 10:06:40 +08:00
parent d5b9e183c1
commit 2c643ca269
4 changed files with 60 additions and 18 deletions

View File

@ -1,9 +1,20 @@
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from .models import ExamRecord from .models import ExamRecord, Exam
class ExamRecordFilter(filters.FilterSet): 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: class Meta:
model = ExamRecord model = ExamRecord
fields = ['is_pass', 'type', 'start_date', 'end_date', 'is_submited'] 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']
}

View File

@ -25,7 +25,7 @@ class PaperSerializer(ModelSerializer):
class PaperQuestionSerializer(ModelSerializer): class PaperQuestionSerializer(ModelSerializer):
class Meta: class Meta:
model = PaperQuestion model = PaperQuestion
fields = ['question', 'total_score', 'sort'] fields = ['question', 'total_score']
class PaperCreateUpdateSerializer(ModelSerializer): class PaperCreateUpdateSerializer(ModelSerializer):
@ -133,7 +133,7 @@ class ExamRecordDetailSerializer(serializers.ModelSerializer):
h, m = divmod(m, 60) h, m = divmod(m, 60)
return "%02d:%02d:%02d" % (h, m, s) return "%02d:%02d:%02d" % (h, m, s)
def get_questions(self, obj): def get_questions_(self, obj):
objs = AnswerDetail.objects.select_related('question').filter( objs = AnswerDetail.objects.select_related('question').filter(
examrecord=obj).order_by('question__type') examrecord=obj).order_by('question__type')
return AnswerDetailSerializer(instance=objs, many=True).data return AnswerDetailSerializer(instance=objs, many=True).data

View File

@ -1,13 +1,16 @@
from django.urls import path, include from django.urls import path, include
from rest_framework import routers 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/' API_BASE_URL = 'api/exam/'
HTML_BASE_URL = 'exam/' HTML_BASE_URL = 'exam/'
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register('questioncat', QuestioncatViewSet, basename='questioncat') router.register('questioncat', QuestioncatViewSet, basename='questioncat')
router.register('question', QuestionViewSet, basename="question") 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 = [ urlpatterns = [
path(API_BASE_URL, include(router.urls)) path(API_BASE_URL, include(router.urls))
] ]

View File

@ -15,7 +15,7 @@ from django.utils import timezone
from django.db import transaction from django.db import transaction
from rest_framework.serializers import Serializer from rest_framework.serializers import Serializer
from datetime import datetime from datetime import datetime
from apps.exam.filters import ExamRecordFilter from apps.exam.filters import ExamRecordFilter, ExamFilter
from datetime import timedelta from datetime import timedelta
# Create your views here. # Create your views here.
@ -44,7 +44,7 @@ def dectry(p):
class QuestioncatViewSet(ModelViewSet): class QuestioncatViewSet(ModelViewSet):
perms_map = {'*': '*'} perms_map = {'get': '*', 'post':'question', 'put':'question', 'delete':'question'}
queryset = Questioncat.objects.all() queryset = Questioncat.objects.all()
serializer_class = QuestioncatSerializer serializer_class = QuestioncatSerializer
filterset_fields = ['parent'] filterset_fields = ['parent']
@ -52,7 +52,7 @@ class QuestioncatViewSet(ModelViewSet):
class QuestionViewSet(ModelViewSet): class QuestionViewSet(ModelViewSet):
perms_map = {'*': '*'} perms_map = {'get': '*', 'post':'question', 'put':'question', 'delete':'question'}
queryset = Question.objects.all() queryset = Question.objects.all()
serializer_class = QuestionSerializer serializer_class = QuestionSerializer
filterset_fields = ['level', 'type', 'year'] filterset_fields = ['level', 'type', 'year']
@ -61,21 +61,33 @@ class QuestionViewSet(ModelViewSet):
@action(methods=['get'], detail=False, @action(methods=['get'], detail=False,
url_path='export', url_name='export_question', perms_map=[{'get': '*'}]) url_path='export', url_name='export_question', perms_map=[{'get': '*'}])
def export_question(self, request): def export_question(self, request):
"""
导出题目
导出题目
"""
queryset = self.filter_queryset(self.get_queryset()) queryset = self.filter_queryset(self.get_queryset())
path = export_question(queryset) path = export_question(queryset)
return Response({'path': path}) 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): def enable(self, request):
"""
启用题目
启用题目
"""
ids = request.data.get('ids', None) ids = request.data.get('ids', None)
if ids: if ids:
Question.objects.filter(pk__in=ids).update(enabled=True) Question.objects.filter(pk__in=ids).update(enabled=True)
return Response(status=200) return Response(status=200)
@action(methods=['post'], detail=False, @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): def import_question(self, request):
""" """
导入题目
导入题目 导入题目
""" """
xlsxpath = request.data['path'] 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() queryset = Paper.objects.all()
serializer_class = PaperSerializer serializer_class = PaperSerializer
ordering = ['id'] ordering = ['id']
@ -249,10 +261,11 @@ class PaperViewSet(ModelViewSet):
class ExamViewSet(ModelViewSet): class ExamViewSet(ModelViewSet):
perms_map = {'*': '*'} perms_map = {'get': '*', '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',)
filterset_class = ExamFilter
def get_serializer_class(self): def get_serializer_class(self):
if self.action in ['create', 'update']: if self.action in ['create', 'update']:
@ -265,7 +278,7 @@ class ExamViewSet(ModelViewSet):
instance = self.get_object() instance = self.get_object()
if ExamRecord.objects.filter(exam=instance).exists(): if ExamRecord.objects.filter(exam=instance).exists():
raise ParseError('存在考试记录,禁止删除') raise ParseError('存在考试记录,禁止删除')
instance.delete() instance.delete(soft=False)
return Response(status=204) return Response(status=204)
@action(methods=['post'], detail=True, perms_map=[{'post': '*'}], serializer_class=Serializer, permission_classes = [IsAuthenticated]) @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() exam = self.get_object()
now = timezone.now() 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') queryset = ExamRecord.objects.select_related('create_by')
serializer_class = ExamRecordListSerializer serializer_class = ExamRecordListSerializer
ordering_fields = ['create_time', 'score', 'took', 'update_time'] ordering_fields = ['create_time', 'score', 'took', 'update_time']
@ -325,6 +338,21 @@ class ExamRecordViewSet(ModelViewSet):
return ExamRecordDetailSerializer return ExamRecordDetailSerializer
return ExamRecordListSerializer 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]) @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated])
def self(self, request, pk=None): def self(self, request, pk=None):
''' '''