"""视图辅助:以商家身份代理调用现有订单 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。""" 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')