Files
Django/jituan/views_dashou_exam.py

171 lines
7.1 KiB
Python

"""打手考试:后台管理 + 小程序接口。"""
from rest_framework.parsers import FormParser, JSONParser, MultiPartParser
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from backend.utils import verify_kefu_permission
from jituan.services.dashou_exam import has_exam_manage_perm
EXAM_PERM_HINT = '无权限(需 dsks666 打手接单考试管理,或 8080a 小程序配置)'
def _check_exam_perm(request, phone):
kefu, permissions = verify_kefu_permission(request, phone)
if kefu is None:
return None, permissions
if not has_exam_manage_perm(permissions):
return None, Response({'code': 403, 'msg': EXAM_PERM_HINT})
return request.user, None
class DashouExamStatusView(APIView):
"""小程序:考试状态(抢单前检查) POST /jituan/dashou-exam/status"""
permission_classes = [IsAuthenticated]
parser_classes = [JSONParser]
def post(self, request):
from jituan.services.dashou_exam import get_exam_status
data = get_exam_status(request, request.user)
return Response({'code': 200, 'msg': '成功', 'data': data})
class DashouExamBundleView(APIView):
"""小程序:拉取整套考题(含答案与解析,前端本地判分) POST /jituan/dashou-exam/bundle"""
permission_classes = [IsAuthenticated]
parser_classes = [JSONParser]
def post(self, request):
from jituan.services.dashou_exam import build_exam_bundle
data, err = build_exam_bundle(request, request.user)
if err:
return Response({'code': 400, 'msg': err})
return Response({'code': 200, 'msg': '成功', 'data': data})
class DashouExamMarkPassedView(APIView):
"""小程序:前端判分通过后登记 POST /jituan/dashou-exam/mark-passed"""
permission_classes = [IsAuthenticated]
parser_classes = [JSONParser]
def post(self, request):
from jituan.services.dashou_exam import mark_exam_passed
data, err = mark_exam_passed(request, request.user)
if err:
return Response({'code': 400, 'msg': err})
return Response({'code': 200, 'msg': '考试通过', 'data': data})
class DashouExamConfigAdminView(APIView):
"""后台:考试配置 GET/SAVE POST /jituan/houtai/dashou-exam-config"""
permission_classes = [IsAuthenticated]
parser_classes = [JSONParser]
def post(self, request):
phone = (request.data.get('phone') or request.data.get('username') or '').strip()
if not phone:
return Response({'code': 401, 'msg': '缺少客服账号'})
user, err_resp = _check_exam_perm(request, phone)
if err_resp:
return err_resp
action = (request.data.get('action') or 'get').strip()
from jituan.services.dashou_exam import (
build_admin_config_payload,
build_group_exam_overview,
save_admin_config,
)
if action == 'overview':
data, err = build_group_exam_overview(request)
if err:
return Response({'code': 400, 'msg': err})
return Response({'code': 0, 'data': data})
if action == 'save':
data, err = save_admin_config(request, user, request.data)
if err:
return Response({'code': 400, 'msg': err})
return Response({'code': 0, 'msg': '保存成功', 'data': {'config': data}})
payload = build_admin_config_payload(request, user, request.data)
return Response({'code': 0, 'data': payload})
class DashouExamQuestionListView(APIView):
"""后台:题库列表 POST /jituan/houtai/dashou-exam-question-list"""
permission_classes = [IsAuthenticated]
parser_classes = [JSONParser]
def post(self, request):
phone = (request.data.get('phone') or request.data.get('username') or '').strip()
if not phone:
return Response({'code': 401, 'msg': '缺少客服账号'})
user, err_resp = _check_exam_perm(request, phone)
if err_resp:
return err_resp
from jituan.services.dashou_exam import list_admin_questions
return Response({'code': 0, 'data': list_admin_questions(request, user, request.data)})
class DashouExamQuestionManageView(APIView):
"""后台:题目增删改 POST /jituan/houtai/dashou-exam-question-manage"""
permission_classes = [IsAuthenticated]
parser_classes = [JSONParser]
def post(self, request):
phone = (request.data.get('phone') or request.data.get('username') or '').strip()
if not phone:
return Response({'code': 401, 'msg': '缺少客服账号'})
user, err_resp = _check_exam_perm(request, phone)
if err_resp:
return err_resp
action = (request.data.get('action') or '').strip()
qid = request.data.get('question_id') or request.data.get('id')
from jituan.services.dashou_exam import (
create_question,
delete_question,
update_question,
)
if action == 'create':
data, err = create_question(request, user, request.data)
elif action == 'update':
if not qid:
return Response({'code': 400, 'msg': '缺少题目ID'})
data, err = update_question(request, user, int(qid), request.data)
elif action == 'delete':
if not qid:
return Response({'code': 400, 'msg': '缺少题目ID'})
data, err = delete_question(request, user, int(qid), request.data)
else:
return Response({'code': 400, 'msg': '无效 action'})
if err:
return Response({'code': 400, 'msg': err})
return Response({'code': 0, 'msg': '成功', 'data': data})
class DashouExamImageManageView(APIView):
"""后台:题目图片 POST /jituan/houtai/dashou-exam-image-manage"""
permission_classes = [IsAuthenticated]
parser_classes = [MultiPartParser, FormParser, JSONParser]
def post(self, request):
phone = (request.data.get('phone') or request.data.get('username') or '').strip()
if not phone:
return Response({'code': 401, 'msg': '缺少客服账号'})
user, err_resp = _check_exam_perm(request, phone)
if err_resp:
return err_resp
action = (request.data.get('action') or 'upload').strip()
from jituan.services.dashou_exam import delete_question_image, upload_question_image
if action == 'delete':
image_id = request.data.get('image_id')
if not image_id:
return Response({'code': 400, 'msg': '缺少 image_id'})
data, err = delete_question_image(request, user, int(image_id), request.data)
else:
qid = request.data.get('question_id')
file_obj = request.FILES.get('file')
if not qid or not file_obj:
return Response({'code': 400, 'msg': '缺少题目或图片'})
data, err = upload_question_image(request, user, int(qid), file_obj, request.data)
if err:
return Response({'code': 400, 'msg': err})
return Response({'code': 0, 'msg': '成功', 'data': data})