feat(jituan): 集团多俱乐部改造 — club 隔离、财务/提现/分红/展示配置
This commit is contained in:
102
jituan/services/admin_context.py
Normal file
102
jituan/services/admin_context.py
Normal file
@@ -0,0 +1,102 @@
|
||||
"""集团后台管理员俱乐部上下文。"""
|
||||
from jituan.constants import (
|
||||
ADMIN_ROLE_LABELS,
|
||||
DATA_SCOPE_ALL,
|
||||
DATA_SCOPE_SINGLE,
|
||||
CLUB_ID_DEFAULT,
|
||||
)
|
||||
from jituan.models import AdminAssignment, Club
|
||||
|
||||
def build_admin_club_context(user):
|
||||
"""
|
||||
根据 admin_assignment + 超管推断后台登录后的俱乐部上下文。
|
||||
返回 dict 供前端存储与请求头使用。
|
||||
"""
|
||||
yonghuid = user.UserUID
|
||||
is_super = bool(user.IsSuperuser) or user.UserType == 'admin'
|
||||
|
||||
assignments = list(
|
||||
AdminAssignment.query.filter(yonghuid=yonghuid, status=1).order_by('-is_primary', 'club_id')
|
||||
)
|
||||
|
||||
clubs_qs = Club.query.filter(status=1).order_by('sort_order', 'club_id')
|
||||
all_clubs = [
|
||||
{'club_id': c.club_id, 'name': c.name}
|
||||
for c in clubs_qs
|
||||
]
|
||||
|
||||
if is_super and not assignments:
|
||||
return _pack(
|
||||
scope=DATA_SCOPE_ALL,
|
||||
club_id=CLUB_ID_DEFAULT,
|
||||
is_group_admin=True,
|
||||
assignments=[],
|
||||
clubs=all_clubs,
|
||||
can_switch_club=True,
|
||||
role_code='GROUP_SUPER_ADMIN',
|
||||
role_name=ADMIN_ROLE_LABELS['GROUP_SUPER_ADMIN'],
|
||||
)
|
||||
|
||||
if not assignments:
|
||||
return _pack(
|
||||
scope=DATA_SCOPE_SINGLE,
|
||||
club_id=CLUB_ID_DEFAULT,
|
||||
is_group_admin=False,
|
||||
assignments=[],
|
||||
clubs=all_clubs,
|
||||
can_switch_club=len(all_clubs) > 1,
|
||||
role_code='CLUB_ADMIN',
|
||||
role_name='子公司客服(默认)',
|
||||
)
|
||||
|
||||
primary = next((a for a in assignments if a.is_primary), assignments[0])
|
||||
has_group = any(a.club_id is None or a.data_scope == DATA_SCOPE_ALL for a in assignments)
|
||||
allowed_club_ids = {a.club_id for a in assignments if a.club_id}
|
||||
|
||||
if has_group:
|
||||
scope = DATA_SCOPE_ALL
|
||||
club_id = CLUB_ID_DEFAULT
|
||||
else:
|
||||
scope = DATA_SCOPE_SINGLE
|
||||
club_id = primary.club_id or CLUB_ID_DEFAULT
|
||||
|
||||
visible_clubs = all_clubs if has_group else [
|
||||
c for c in all_clubs if c['club_id'] in allowed_club_ids
|
||||
]
|
||||
|
||||
role_code = primary.role_code or 'CLUB_ADMIN'
|
||||
return _pack(
|
||||
scope=scope,
|
||||
club_id=club_id,
|
||||
is_group_admin=has_group,
|
||||
assignments=assignments,
|
||||
clubs=visible_clubs,
|
||||
can_switch_club=has_group or len(visible_clubs) > 1,
|
||||
role_code=role_code,
|
||||
role_name=ADMIN_ROLE_LABELS.get(role_code, role_code),
|
||||
)
|
||||
|
||||
|
||||
def _pack(scope, club_id, is_group_admin, assignments, clubs, can_switch_club,
|
||||
role_code, role_name):
|
||||
return {
|
||||
'scope': scope,
|
||||
'club_id': club_id,
|
||||
'is_group_admin': is_group_admin,
|
||||
'role_code': role_code,
|
||||
'role_name': role_name,
|
||||
'perm_source': 'gvsdsdk',
|
||||
'perm_note': '功能菜单权限仍由 gvsdsdk UserRole→Permission 控制;本表仅管数据范围',
|
||||
'assignments': [
|
||||
{
|
||||
'club_id': a.club_id,
|
||||
'role_code': a.role_code,
|
||||
'role_name': ADMIN_ROLE_LABELS.get(a.role_code, a.role_code),
|
||||
'data_scope': a.data_scope,
|
||||
'is_primary': a.is_primary,
|
||||
}
|
||||
for a in assignments
|
||||
],
|
||||
'clubs': clubs,
|
||||
'can_switch_club': can_switch_club,
|
||||
}
|
||||
Reference in New Issue
Block a user