"""集团后台管理员俱乐部上下文。""" 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, }