Files
Django/merchant_ops/helpers.py
T

59 lines
2.0 KiB
Python

"""视图辅助:以商家身份代理调用现有订单 View(不修改原接口)。"""
import logging
from backend.utils import pick_order_id
from merchant_ops.services.authz import StaffAuthError, member_has_perm
from merchant_ops.models import MerchantOrderDispatch
from orders.models import MerchantOrderExt
from users.business_models import User
logger = logging.getLogger(__name__)
def get_merchant_user(merchant_id):
return User.query.get(UserUID=merchant_id)
def staff_can_access_order(member, order_id, perm_all='order_view_all', perm_self='order_view_self'):
ext = MerchantOrderExt.query.filter(
MerchantID=member.merchant_id,
Order__OrderID=order_id,
).first()
if not ext:
return False, None
if member_has_perm(member, perm_all):
return True, ext
if member_has_perm(member, perm_self):
disp = MerchantOrderDispatch.query.filter(order_id=order_id).first()
if disp and disp.staff_member_id == member.id:
return True, ext
return False, ext
def proxy_merchant_order_view(request, member, view_class, perm_code):
"""子客服通过商家 User 代理调用现有 View.post。"""
return proxy_as_merchant_user(request, member, view_class, perm_code)
def proxy_as_merchant_user(request, member, view_class, perm_code):
"""子客服以商家身份代理调用任意商家 View(订单/配置等)。"""
if not member_has_perm(member, perm_code):
raise StaffAuthError(403, f'无权限: {perm_code}')
order_id = pick_order_id(request.data)
if order_id:
ok, _ = staff_can_access_order(member, order_id)
if not ok:
raise StaffAuthError(403, '无权操作该订单')
merchant_user = get_merchant_user(member.merchant_id)
old_user = request.user
request.user = merchant_user
request._staff_member = member
try:
return view_class().post(request)
finally:
request.user = old_user
if hasattr(request, '_staff_member'):
delattr(request, '_staff_member')