liu tao 3 жил өмнө
parent
commit
516dd3a6fa

+ 1 - 0
apps/api/admin/examquestion/urls.py

@@ -8,5 +8,6 @@ urlpatterns = [
 ]
 
 router = SimpleRouter()
+router.register(r'feedback', ExamQuestionFeedbackViewSet)
 router.register(r'', ExamQuestionViewSet)
 urlpatterns += router.urls

+ 16 - 0
apps/api/admin/examquestion/views.py

@@ -4,6 +4,7 @@ from django.db.models import Sum, F
 from rest_framework.decorators import action
 from rest_framework.views import APIView
 from django.db import transaction
+from rest_framework.viewsets import ReadOnlyModelViewSet
 from django.db.models import Q
 from utils.custom_modelviewset import CustomModelViewSet
 from utils import response_ok, response_error
@@ -34,6 +35,12 @@ class ExamQuestionViewSet(CustomModelViewSet):
         validated_data = serializer.validated_data
         SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改试题库试题,id=%d' % (instance.id), validated_data)
 
+        if validated_data['feedback']:
+            feedback = ExamQuestionFeedback.getById(validated_data['feedback'])
+            feedback.process(self.request.user)
+            feedback.save()
+            SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'处理试题错误反馈,id=%d' % (feedback.id))
+
     def destroy(self, request, *args, **kwargs):
         with transaction.atomic():
             instance = self.get_object()
@@ -41,3 +48,12 @@ class ExamQuestionViewSet(CustomModelViewSet):
             instance.save()
             SysLog.objects.addnew(request.user, SysLog.INSERT, u"删除试题库试题,id=%d" % instance.id)
         return response_ok()
+
+class ExamQuestionFeedbackViewSet(ReadOnlyModelViewSet):
+    permission_classes = [IsAdministrator, ]
+    queryset = ExamQuestionFeedback.objects.filter().order_by('status', '-id')
+    serializer_class = ExamQuestionFeedbackSerializer
+
+    def filter_queryset(self, queryset):
+        f = ExamQuestionFeedbackFilter(self.request.GET, queryset=queryset)
+        return f.qs

+ 1 - 0
apps/api/admin/knowledge/urls.py

@@ -9,5 +9,6 @@ urlpatterns = [
 ]
 
 router = SimpleRouter()
+router.register(r'feedback', KnowledgeBaseFeedbackViewSet)
 router.register(r'', KnowledgeBaseViewSet)
 urlpatterns += router.urls

+ 20 - 4
apps/api/admin/knowledge/views.py

@@ -1,14 +1,15 @@
 # coding=utf-8
 
 from django.db import transaction
+from rest_framework.viewsets import ReadOnlyModelViewSet
 from utils.permission import IsAdministrator
 from utils import response_error, response_ok
 from utils.custom_modelviewset import CustomModelViewSet
 from apps.system.models import SysLog
 
-from apps.knowledge.models import KnowledgeBase
-from apps.knowledge.filters import KnowledgeBaseFilter
-from apps.knowledge.serializers import KnowledgeBaseSerializer
+from apps.knowledge.models import KnowledgeBase, KnowledgeBaseFeedback
+from apps.knowledge.filters import KnowledgeBaseFilter, KnowledgeBaseFeedbackFilter
+from apps.knowledge.serializers import KnowledgeBaseSerializer, KnowledgeBaseFeedbackSerializer
 
 
 class KnowledgeBaseViewSet(CustomModelViewSet):
@@ -32,10 +33,25 @@ class KnowledgeBaseViewSet(CustomModelViewSet):
         validated_data = serializer.validated_data
         SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'修改知识[%s],id=%d' % (instance.name, instance.id), validated_data)
 
+        if validated_data['feedback']:
+            feedback = KnowledgeBaseFeedback.getById(validated_data['feedback'])
+            feedback.process(self.request.user)
+            feedback.save()
+            SysLog.objects.addnew(self.request.user, SysLog.UPDATE, u'处理知识错误反馈,id=%d' % (feedback.id))
+
     def destroy(self, request, *args, **kwargs):
         with transaction.atomic():
             instance = self.get_object()
             instance.delete = True
             instance.save()
             SysLog.objects.addnew(self.request.user, SysLog.DELETE, u'删除知识[%s],id=%d' % (instance.name, instance.id))
-        return response_ok()
+        return response_ok()
+
+class KnowledgeBaseFeedbackViewSet(ReadOnlyModelViewSet):
+    permission_classes = [IsAdministrator, ]
+    queryset = KnowledgeBaseFeedback.objects.filter().order_by('status', '-id')
+    serializer_class = KnowledgeBaseFeedbackSerializer
+
+    def filter_queryset(self, queryset):
+        f = KnowledgeBaseFeedbackFilter(self.request.GET, queryset=queryset)
+        return f.qs

+ 10 - 0
apps/examination/examquestion/filters.py

@@ -13,3 +13,13 @@ class ExamQuestionFilter(django_filters.FilterSet):
         model = ExamQuestion
         fields = '__all__'
 
+class ExamQuestionFeedbackFilter(django_filters.FilterSet):
+    chapter = django_filters.CharFilter(field_name='main__chapter_id')
+    subject = django_filters.CharFilter(field_name='main__chapter__subject_id')
+    status = django_filters.CharFilter(field_name='status')
+    type = django_filters.CharFilter(field_name='type')
+    title = django_filters.CharFilter(field_name='main__title', lookup_expr='icontains')
+
+    class Meta:
+        model = ExamQuestionFeedback
+        fields = '__all__'

+ 14 - 0
apps/examination/examquestion/models.py

@@ -4,6 +4,8 @@ from django.db import models
 from django.utils import timezone
 from django.conf import settings
 
+from utils.exceptions import CustomError
+
 from apps.foundation.models import Chapter
 
 class ExamQuestion(models.Model):
@@ -105,3 +107,15 @@ class ExamQuestionFeedback(models.Model):
         ordering = ['-id']
         verbose_name = u"错误反馈"
         default_permissions = ()
+
+    @staticmethod
+    def getById(id):
+        instance = ExamQuestionFeedback.objects.filter(pk=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的错误反馈')
+        return instance
+
+    def process(self, user):
+        self.process_user = user
+        self.status = ExamQuestionFeedback.PROCESSED
+        self.process_time = timezone.now()

+ 10 - 0
apps/examination/examquestion/serializers.py

@@ -105,3 +105,13 @@ class ExamQuestionFillSerializer(serializers.ModelSerializer):
     class Meta:
         model = ExamQuestionFill
         fields = '__all__'
+
+class ExamQuestionFeedbackSerializer(serializers.ModelSerializer):
+    question_type_text = serializers.CharField(source='main.get_type_display', read_only=True)
+    question_title = serializers.CharField(source='main.title', read_only=True)
+    type_text = serializers.CharField(source='get_type_display', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+
+    class Meta:
+        model = ExamQuestionFeedback
+        fields = "__all__"

+ 13 - 2
apps/knowledge/filters.py

@@ -1,7 +1,7 @@
 # coding=utf-8
 import django_filters
 
-from .models import KnowledgeBase
+from .models import KnowledgeBase, KnowledgeBaseFeedback
 
 class KnowledgeBaseFilter(django_filters.FilterSet):
     name = django_filters.CharFilter(field_name="name", lookup_expr="icontains")
@@ -10,4 +10,15 @@ class KnowledgeBaseFilter(django_filters.FilterSet):
 
     class Meta:
         model = KnowledgeBase
-        fields = "__all__"
+        fields = "__all__"
+
+class KnowledgeBaseFeedbackFilter(django_filters.FilterSet):
+    chapter = django_filters.CharFilter(field_name='main__chapter_id')
+    subject = django_filters.CharFilter(field_name='main__chapter__subject_id')
+    status = django_filters.CharFilter(field_name='status')
+    type = django_filters.CharFilter(field_name='type')
+    name = django_filters.CharFilter(field_name='main__name', lookup_expr='icontains')
+
+    class Meta:
+        model = KnowledgeBaseFeedback
+        fields = '__all__'

+ 14 - 0
apps/knowledge/models.py

@@ -4,6 +4,8 @@ from django.db import models
 from django.utils import timezone
 from django.conf import settings
 
+from utils.exceptions import CustomError
+
 from apps.foundation.models import Chapter
 
 class KnowledgeBase(models.Model):
@@ -56,3 +58,15 @@ class KnowledgeBaseFeedback(models.Model):
         ordering = ['-id']
         verbose_name = u"错误反馈"
         default_permissions = ()
+
+    @staticmethod
+    def getById(id):
+        instance = KnowledgeBaseFeedback.objects.filter(pk=id).first()
+        if not instance:
+            raise CustomError(u'未找到相应的错误反馈')
+        return instance
+
+    def process(self, user):
+        self.process_user = user
+        self.status = KnowledgeBaseFeedback.PROCESSED
+        self.process_time = timezone.now()

+ 13 - 2
apps/knowledge/serializers.py

@@ -1,7 +1,7 @@
 # coding=utf-8
 
 from rest_framework import serializers
-from .models import KnowledgeBase
+from .models import KnowledgeBase, KnowledgeBaseFeedback
 from utils.exceptions import CustomError
 
 class KnowledgeBaseSerializer(serializers.ModelSerializer):
@@ -23,4 +23,15 @@ class KnowledgeBaseSerializer(serializers.ModelSerializer):
         if instance.delete:
             raise CustomError(u'知识[%s]已经被删除,禁止操作' % instance.name)
         instance = super(KnowledgeBaseSerializer, self).update(instance, validated_data)
-        return instance
+        return instance
+
+class KnowledgeBaseFeedbackSerializer(serializers.ModelSerializer):
+    subject_name = serializers.CharField(source='main.chapter.subject.name', read_only=True)
+    chapter_name = serializers.CharField(source='main.chapter.name', read_only=True)
+    name = serializers.CharField(source='main.name', read_only=True)
+    type_text = serializers.CharField(source='get_type_display', read_only=True)
+    status_text = serializers.CharField(source='get_status_display', read_only=True)
+
+    class Meta:
+        model = KnowledgeBaseFeedback
+        fields = "__all__"