53 lines
1.8 KiB
Python
53 lines
1.8 KiB
Python
"""视图辅助:以商家身份代理调用现有订单 View(不修改原接口)。"""
|
||
import logging
|
||
|
||
from backend.utils import pick_order_id
|
||
from merchant_ops.services.authz import StaffAuthError, member_has_perm
|
||
from orders.models import MerchantOrderExt, MerchantOrderDispatch
|
||
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。"""
|
||
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')
|