examtest/test_server/question/views.py

275 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
from django_filters.rest_framework import DjangoFilterBackend
from openpyxl import Workbook, load_workbook
from rest_framework import status
from rest_framework.decorators import action, permission_classes
from rest_framework.filters import OrderingFilter, SearchFilter
from rest_framework.generics import GenericAPIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from crm.models import PaySubject
from examtest.models import WorkScope
from server import settings
from utils.custom import CommonPagination
from .exports import export_question
from .models import Question, Questioncat
from .serializers import (QuestioncatSerializer, QuestioncatSerializerDefault,
QuestionSerializer, SubjectSerializer)
class SubjectViewSet(ModelViewSet):
"""
学科分类:增删改查
"""
perms_map = (
{'get': 'subject_view'}, {'post': 'subject_create'},
{'put': 'subject_update'}, {'delete': 'subject_delete'})
queryset = Questioncat.objects.filter(is_subject=True,is_delete=0).all().order_by("id")
serializer_class = SubjectSerializer
pagination_class = None
ordering_fields = ('id',)
ordering = ['id']
search_fields = ('^name',)
class QuestioncatViewSet(ModelViewSet):
"""
题库分类:增删改查
"""
perms_map = (
{'get': 'questioncat_view'}, {'post': 'questioncat_create'},
{'put': 'questioncat_update'}, {'delete': 'questioncat_delete'})
queryset = Questioncat.objects.filter(is_delete=0,is_subject=False).all()
serializer_class = QuestioncatSerializerDefault
pagination_class = CommonPagination
ordering_fields = ['id']
ordering = ['type','id']
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ['pid']
search_fields = ['name']
@action(methods=['get'], detail=False,
url_path='all', url_name='all_questioncat')
def all(self, request):
"""
题库分类全,不分页
"""
queryset = Questioncat.objects.filter(is_delete=0).all()
if request.query_params.get('pid',None):
queryset = queryset.filter(pid = request.query_params.get('pid'))
serializer = QuestioncatSerializer(instance=queryset,many=True)
return Response(serializer.data)
@action(methods=['get'], detail=False,
url_path='subject', url_name='questioncat_subject', pagination_class = None, permission_classes=[])
def subject(self, request):
"""
学科下的全部分类
"""
queryset = Questioncat.objects.filter(is_delete=0, pid=request.query_params.get('id')).all()
serializer = QuestioncatSerializer(instance=queryset,many=True)
return Response(serializer.data)
@action(methods=['get'], detail=False,
url_path='workscope', url_name='questioncat_workscope', pagination_class = None, permission_classes=[])
def workscope(self, request):
"""
工作类别下的全部分类
"""
queryset = WorkScope.objects.get(id=request.query_params.get('id')).questioncat.all().order_by('pk')
serializer = QuestioncatSerializer(instance=queryset,many=True)
return Response(serializer.data)
class QuestionViewSet(ModelViewSet):
"""
题目:增删改查
"""
perms_map = (
{'get': 'question_view'}, {'post': 'question_create'},
{'put': 'question_update'}, {'delete': 'question_delete'})
queryset = Question.objects.filter(is_delete=0).all()
serializer_class = QuestionSerializer
pagination_class = CommonPagination
ordering_fields = ['id', 'name']
ordering = ['-create_time']
filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
filterset_fields = ['questioncat','level', 'type']
search_fields = ['name', 'options', 'resolution']
@action(methods=['post'], detail=False,
url_path='count', url_name='question_count')
def count(self, request):
ret = {'danxuan':0,'duoxuan':0,'panduan':0}
queryset = self.queryset
if request.data.get('ids',None):
queryset = queryset.filter(questioncat__in = request.data.get('ids'))
ret['danxuan'] = queryset.filter(type='单选').count()
ret['duoxuan'] = queryset.filter(type='多选').count()
ret['panduan'] = queryset.filter(type='判断').count()
return Response(ret)
@action(methods=['get'], detail=False,
url_path='export', url_name='export_question', perms_map=[{'*':'export_question'}])
def export(self, request):
queryset = self.filter_queryset(self.get_queryset())
path = export_question(queryset)
return Response({'path': path})
@action(methods=['get'], detail=False,
url_path='correct', url_name='correct_question', permission_classes=[IsAuthenticated])
def correct(self, request):
for i in Question.objects.all():
options = i.options
for k in options:
options[k] = str(options[k]).replace('<p>','').replace('</p>','')\
.replace('&times;','×').replace('&beta;','β').replace('&alpha;','α')\
.replace('&gamma;','γ').replace('&nbsp;',' ')
i.options = options
i.save()
return Response()
@action(methods=['post'], detail=False,
url_path='import', url_name='import_question',perms_map=[{'post':'question_import'}])
def import_question(self, request):
"""
导入题目
"""
xlsxpath = request.data['path']
fullpath = settings.BASE_DIR + xlsxpath
wb = load_workbook(fullpath)
sheet = wb.worksheets[0]
qlist = ['A','B','C','D','E','F']
leveldict = {'':'','':'','':''}
notinlist = []
# 验证文件内容
if sheet['a2'].value != '题目类型':
return Response({"error":"类型列错误!"})
if sheet['b2'].value != '分类':
return Response({"error":"分类列错误!"})
if sheet['c2'].value != '题目':
return Response({"error":"题目列错误!"})
questioncatdict = {}
questioncats = Questioncat.objects.filter(is_delete=0)
for i in questioncats:
questioncatdict[i.name] = i.id
i = 3
while sheet['c'+str(i)].value:
type = sheet['a'+str(i)].value.replace(' ', '')
questioncat = sheet['b'+str(i)].value.replace(' ', '')
name = sheet['c'+str(i)].value
answer = {}
if sheet['d'+str(i)].value:
answer['A'] = sheet['d'+str(i)].value
if sheet['e'+str(i)].value:
answer['B'] = sheet['e'+str(i)].value
if sheet['f'+str(i)].value:
answer['C'] = sheet['f'+str(i)].value
if sheet['g'+str(i)].value:
answer['D'] = sheet['g'+str(i)].value
if sheet['h'+str(i)].value:
answer['E'] = sheet['h'+str(i)].value
if sheet['i'+str(i)].value:
answer['F'] = sheet['i'+str(i)].value
right = sheet['j'+str(i)].value.replace(' ', '')
resolution = sheet['k'+str(i)].value
level = sheet['l'+str(i)].value
if level:
level = level.replace(' ', '')
if questioncat not in questioncatdict:
return Response({"error":"不存在分类("+questioncat+")!请先新建"})
else:
cateobj = Questioncat.objects.get(id=questioncatdict[questioncat])
if type == '单选':
if Question.objects.filter(type='单选',name=name, is_delete=0).exists():
notinlist.append(i)
else:
if right in ['A','B','C','D','E','F']:
obj = Question()
obj.type = '单选'
obj.questioncat = cateobj
obj.name = name
obj.options=answer
obj.right = right
obj.resolution = resolution if resolution else ''
if level in leveldict:
obj.level = leveldict[level]
else:
obj.level = ''
obj.save()
elif type == '多选':
right = list(right)
if Question.objects.filter(type='多选', name=name, is_delete=0).exists():
notinlist.append(i)
else:
if [False for c in right if c not in qlist]:
pass
else:
obj = Question()
obj.type = '多选'
obj.questioncat = cateobj
obj.name = name
obj.options=answer
obj.right = right
obj.resolution = resolution if resolution else ''
if level in leveldict:
obj.level = leveldict[level]
else:
obj.level = ''
obj.save()
elif type == '判断':
if right == 'A' or right == '' or right == '正确':
right = 'A'
else:
right = 'B'
if Question.objects.filter(type='判断',name=name, is_delete=0).exists():
notinlist.append(i)
else:
obj = Question()
obj.type = '判断'
obj.questioncat = cateobj
obj.name = name
obj.options={'A':'','B':''}
obj.right = right
obj.resolution = resolution if resolution else ''
if level in leveldict:
obj.level = leveldict[level]
else:
obj.level = ''
obj.save()
i = i +1
return Response(status=status.HTTP_200_OK)
class ExerciseView(APIView):
perms_map=[{'post':'exercise'}]
def post(self, request):
questioncat = request.data['questioncat']
queryset = Question.objects.filter(is_delete=0,questioncat=questioncat).order_by('type','pk', 'name')
if 'ydtms' in request.data and request.data['ydtms']:
queryset = queryset.exclude(id__in = request.data['ydtms'])
if 'ydtms_' in request.data and request.data['ydtms_']:
consumer = request.user
process = consumer.process
process['cat'+str(questioncat)] = request.data['ydtms_']
consumer.process = process
consumer.save()
count = queryset.count()
pg = CommonPagination()
p = pg.paginate_queryset(queryset=queryset,request=request,view=self)
serializer = QuestionSerializer(instance=p,many=True)
collects = request.user.collects.all().values_list('id',flat=True) #当前用户收藏的题目
results = serializer.data
for i in results:
if i['id'] in collects:
i['is_collect'] = True
else:
i['is_collect'] = False
return Response({'count':count, 'results':results})