jiaweiqi 3 年 前
コミット
fc71df19fd

+ 13 - 0
apps/api/staff/errorbook/urls.py

@@ -0,0 +1,13 @@
+# coding=utf-8
+from django.conf.urls import url, include
+from rest_framework.routers import SimpleRouter
+
+from .views import *
+
+urlpatterns = [
+
+]
+
+router = SimpleRouter()
+router.register(r'', ErrorBookViewSet)
+urlpatterns += router.urls

+ 20 - 0
apps/api/staff/errorbook/views.py

@@ -0,0 +1,20 @@
+# coding=utf-8
+
+from rest_framework.viewsets import ReadOnlyModelViewSet
+from utils import response_ok, response_error
+from apps.system.models import SysLog
+from utils.permission import IsAdministrator, IsStaff
+from apps.practise.errorbook.filters import *
+from apps.practise.errorbook.serializers import *
+
+
+class ErrorBookViewSet(ReadOnlyModelViewSet):
+    permission_classes = [IsStaff, ]
+    queryset = ErrorBook.objects.filter()
+    serializer_class = ErrorBookSerializer
+
+    def filter_queryset(self, queryset):
+        # 排序使用filter排序功能 OrderingFilter  参数 sort=last_time 按最后出错时间排序 sort=-last_time按最后出错时间倒序排序
+        queryset = queryset.filter(create_user=self.request.user)
+        f = ErrorBookFilter(self.request.GET, queryset=queryset)
+        return f.qs

+ 1 - 0
apps/api/staff/urls.py

@@ -11,4 +11,5 @@ urlpatterns = [
     url(r'^token_verify/$', StaffUserVerifyTokenView.as_view()),
 
     url(r'^practise/', include('apps.api.staff.practise.urls')),
+    url(r'^errorbook/', include('apps.api.staff.errorbook.urls')),
 ]

+ 35 - 2
apps/examination/exam/serializers.py

@@ -1,7 +1,8 @@
 # coding=utf-8
 
 from rest_framework import serializers
-from .models import Exam, ExamLog
+from .models import Exam, ExamLog, ExamAnswerLog, ExamAnswerOptionLog, ExamAnswerFillLog
+from apps.examination.examquestion.models import ExamQuestion
 from utils.exceptions import CustomError
 
 class ExamSerializer(serializers.ModelSerializer):
@@ -58,4 +59,36 @@ class FormalExamLogSerializer(serializers.ModelSerializer):
 
     class Meta:
         model = ExamLog
-        fields = "__all__"
+        fields = "__all__"
+
+
+class ExamAnswerLogSerializer(serializers.ModelSerializer):
+    item = serializers.SerializerMethodField()
+
+    class Meta:
+        model = ExamAnswerLog
+        fields = '__all__'
+
+    def get_item(self, obj):
+        if obj.detail.question.type <= ExamQuestion.MULTIPLE:
+            rows = ExamAnswerOptionLog.objects.filter(main=ExamAnswerLog)
+            return ExamAnswerOptionLogSerializer(rows, many=True).data
+        elif obj.detail.question.type == ExamQuestion.FILL:
+            rows = ExamAnswerFillLog.objects.filter(main=ExamAnswerLog)
+            return ExamAnswerFillLogSerializer(rows, many=True).data
+        else:
+            return []
+
+
+class ExamAnswerOptionLogSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = ExamAnswerOptionLog
+        fields = '__all__'
+
+
+class ExamAnswerFillLogSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = ExamAnswerFillLog
+        fields = '__all__'

+ 13 - 0
apps/practise/errorbook/filters.py

@@ -0,0 +1,13 @@
+# coding=utf-8
+import django_filters
+
+from .models import ErrorBook
+
+
+class ErrorBookFilter(django_filters.FilterSet):
+    subject = django_filters.CharFilter(field_name='question__chapter__subject_id')
+    sort = django_filters.OrderingFilter(fields=('last_time', 'question__chapter__subject_id', ))
+
+    class Meta:
+        model = ErrorBook
+        fields = "__all__"

+ 22 - 0
apps/practise/errorbook/serializers.py

@@ -0,0 +1,22 @@
+# coding=utf-8
+
+from rest_framework import serializers
+from .models import ErrorBook
+from apps.examination.examquestion.serializers import ExamQuestionSerializer
+from apps.examination.exam.serializers import ExamAnswerLogSerializer
+
+
+class ErrorBookSerializer(serializers.ModelSerializer):
+    question = serializers.SerializerMethodField()
+    answer = serializers.SerializerMethodField()
+    exam_name = serializers.CharField(source='last_answer_log.main.exam.name', read_only=True)
+
+    class Meta:
+        model = ErrorBook
+        fields = "__all__"
+
+    def get_question(self, obj):
+        return ExamQuestionSerializer(obj.question).data
+
+    def get_answer(self, obj):
+        return ExamAnswerLogSerializer(obj.last_answer_log).data