Files
Django/jituan/services/kefu_menu.py

69 lines
2.6 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
def _is_super_permissions(permissions):
return isinstance(permissions, _AllPermissions)
def _page_visible(page, permissions, user, is_super):
if is_super:
return True
if page.require_super:
return False
if page.require_group_manage:
perms_list = list(permissions) if not _is_super_permissions(permissions) else ['000001']
return can_manage_admin_assignments(user, perms_list)
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
is_super = _is_super_permissions(permissions)
pages = list(KefuMenuPage.query.all().order_by('sort_order', 'page_id'))
if not pages:
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:
pages = []
visible_ids = []
for page in pages:
if not page.path:
continue
if _page_visible(page, permissions, request.user, is_super):
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