feat: 打手接单考试(按俱乐部题库、配置与通过状态)
This commit is contained in:
159
jituan/views_dashou_exam.py
Normal file
159
jituan/views_dashou_exam.py
Normal file
@@ -0,0 +1,159 @@
|
||||
"""打手考试:后台管理 + 小程序接口。"""
|
||||
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
|
||||
|
||||
EXAM_PERM = '8080a'
|
||||
|
||||
|
||||
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': '缺少客服账号'})
|
||||
kefu, permissions = verify_kefu_permission(request, phone)
|
||||
if kefu is None:
|
||||
return permissions
|
||||
if EXAM_PERM not in permissions:
|
||||
return Response({'code': 403, 'msg': '无权限'})
|
||||
action = (request.data.get('action') or 'get').strip()
|
||||
from jituan.services.dashou_exam import build_admin_config_payload, save_admin_config
|
||||
if action == 'save':
|
||||
data, err = save_admin_config(request, request.data)
|
||||
if err:
|
||||
return Response({'code': 400, 'msg': err})
|
||||
return Response({'code': 0, 'msg': '保存成功', 'data': {'config': data}})
|
||||
payload = build_admin_config_payload(request)
|
||||
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': '缺少客服账号'})
|
||||
kefu, permissions = verify_kefu_permission(request, phone)
|
||||
if kefu is None:
|
||||
return permissions
|
||||
if EXAM_PERM not in permissions:
|
||||
return Response({'code': 403, 'msg': '无权限'})
|
||||
from jituan.services.dashou_exam import list_admin_questions
|
||||
return Response({'code': 0, 'data': list_admin_questions(request)})
|
||||
|
||||
|
||||
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': '缺少客服账号'})
|
||||
kefu, permissions = verify_kefu_permission(request, phone)
|
||||
if kefu is None:
|
||||
return permissions
|
||||
if EXAM_PERM not in permissions:
|
||||
return Response({'code': 403, 'msg': '无权限'})
|
||||
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, request.data)
|
||||
elif action == 'update':
|
||||
if not qid:
|
||||
return Response({'code': 400, 'msg': '缺少题目ID'})
|
||||
data, err = update_question(request, int(qid), request.data)
|
||||
elif action == 'delete':
|
||||
if not qid:
|
||||
return Response({'code': 400, 'msg': '缺少题目ID'})
|
||||
data, err = delete_question(request, int(qid))
|
||||
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': '缺少客服账号'})
|
||||
kefu, permissions = verify_kefu_permission(request, phone)
|
||||
if kefu is None:
|
||||
return permissions
|
||||
if EXAM_PERM not in permissions:
|
||||
return Response({'code': 403, 'msg': '无权限'})
|
||||
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, int(image_id))
|
||||
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, int(qid), file_obj)
|
||||
if err:
|
||||
return Response({'code': 400, 'msg': err})
|
||||
return Response({'code': 0, 'msg': '成功', 'data': data})
|
||||
Reference in New Issue
Block a user