Files
Django/jituan/services/kefu_menu.py

86 lines
3.1 KiB
Python
Raw 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 backend.utils import _AllPermissions, verify_kefu_permission
from jituan.models import KefuMenuPage
from jituan.services.admin_context import (
build_admin_club_context,
can_manage_admin_assignments,
is_system_super_admin,
)
def _is_super_permissions(permissions):
return isinstance(permissions, _AllPermissions)
def _has_super_perm(permissions):
"""俱乐部超级管理权限 000001角色/后台用户等),不含集团级配置。"""
if _is_super_permissions(permissions):
return True
return '000001' in permissions
def _page_visible(page, permissions, user):
# 集团级页面:数据范围、俱乐部密钥等,俱乐部 000001 不可见
if page.require_group_manage:
return can_manage_admin_assignments(user)
# 俱乐部超管页面:角色管理、后台用户等
if page.require_super:
return _has_super_perm(permissions) or is_system_super_admin(user)
# 000001 拥有全部业务功能菜单(订单/用户/财务等),但不绕过上面的集团级限制
if _is_super_permissions(permissions):
return True
codes = page.perm_codes or []
if not codes:
return False
return any(code in permissions for code in codes)
def build_menu_access_payload(request, username=None):
"""
根据用户 gvsdsdk 权限计算可见菜单 page_id 列表。
返回 (payload, error_response)error_response 非空时表示校验失败。
"""
phone = (username or getattr(request.user, 'Phone', '') or '').strip()
kefu, permissions = verify_kefu_permission(request, phone)
if kefu is None:
return None, permissions
pages = list(KefuMenuPage.query.all().order_by('sort_order', 'page_id'))
need_seed = not pages or not any(p.page_id == 'miniapp.assets' for p in pages)
if need_seed:
try:
from django.core.management import call_command
call_command('seed_kefu_menu')
pages = list(KefuMenuPage.query.all().order_by('sort_order', 'page_id'))
except Exception:
if not pages:
pages = []
visible_ids = []
for page in pages:
if not page.path:
continue
if _page_visible(page, permissions, request.user):
visible_ids.append(page.page_id)
for page in pages:
if page.path:
continue
children = [p for p in pages if p.parent_id == page.page_id and p.path]
if any(child.page_id in visible_ids for child in children):
visible_ids.append(page.page_id)
club_ctx = build_admin_club_context(request.user)
path_by_id = {p.page_id: p.path for p in pages if p.path}
visible_paths = [path_by_id[pid] for pid in visible_ids if pid in path_by_id]
return {
'visible_page_ids': sorted(set(visible_ids)),
'visible_paths': visible_paths,
'can_switch_club': bool(club_ctx.get('can_switch_club')),
'is_group_admin': bool(club_ctx.get('is_group_admin')),
'menu_ready': bool(pages),
}, None