Files
Django/jituan/services/club_user_access.py
XingQue 955b76cbea fix: 俱乐部超管可审本店提现与订单,禁跨店改单
放宽身份校验与权限推断,列表带回俱乐部信息,写操作按本店范围拦截。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 18:39:46 +08:00

61 lines
2.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""后台按俱乐部校验用户/订单是否在当前数据范围内。"""
from rest_framework.response import Response
from jituan.constants import CLUB_ID_DEFAULT, DATA_SCOPE_ALL
from jituan.services.club_context import resolve_club_id_from_request, resolve_club_scope
def user_belongs_to_request(user, request):
if resolve_club_scope(request) == DATA_SCOPE_ALL:
return True
club_id = resolve_club_id_from_request(request)
user_club = getattr(user, 'ClubID', None) or ''
return user_club == club_id
def forbid_if_user_out_of_scope(request, user):
"""不属于当前俱乐部时返回 Response否则返回 None。"""
if user_belongs_to_request(user, request):
return None
return Response({'code': 403, 'msg': '该用户不属于当前俱乐部数据范围'})
def list_response_meta(request):
return {
'club_id': resolve_club_id_from_request(request),
'scope': resolve_club_scope(request),
}
def order_belongs_to_request(order, request):
if resolve_club_scope(request) == DATA_SCOPE_ALL:
return True
club_id = resolve_club_id_from_request(request)
order_club = (getattr(order, 'ClubID', None) or '').strip()
if club_id == CLUB_ID_DEFAULT:
return order_club in (club_id, '', None) or not order_club
return order_club == club_id
def forbid_if_order_out_of_scope(request, order):
if order_belongs_to_request(order, request):
return None
return Response({'code': 403, 'msg': '该订单不属于当前俱乐部数据范围'})
def forbid_if_order_mutate_out_of_scope(request, order):
"""
订单写操作闸门:
- SINGLE_CLUB只能处理当前俱乐部订单
- ALL_CLUBS仅集团高管可处理本店超管须切到具体俱乐部
"""
if resolve_club_scope(request) == DATA_SCOPE_ALL:
from jituan.services.group_finance_gate import has_group_finance_exec
if not has_group_finance_exec(request.user, request):
return Response({
'code': 403,
'msg': '跨俱乐部订单处理仅集团高管可执行,请切换到具体俱乐部后再操作',
})
return None
return forbid_if_order_out_of_scope(request, order)