Files
SMANAGE/_api_backup/TempLateAPI/GERP/API/MenuList.api
T
2026-06-16 11:55:14 +08:00

123 lines
3.8 KiB
Plaintext

from PDAPI import *
import TempLateAPI.GERP.API.FormAPI.FormData as FormData
from Utils.Models import GERPMenu, GERPUser, GERPCompany, GERPRole, UserRole
from Utils.Lib import PermissionVerifier
__metadata__ = {
"methods": ["GET"],
"blueprint": "GERP",
"permission": 1.0,
"attributes": [],
"limit": "10 per second"
}
def HandleRequest(_CleanedData):
current_user = UGM.GetELTUser()
if not current_user:
return {"code": 0, "data": []}, 200
user = GERPUser.query.filter(GERPUser.UserUUID == current_user.UserUUID).first()
if not user:
return {"code": 0, "data": []}, 200
current_role_uuid_str = flask.request.cookies.get("CurrentRoleUUID")
current_company_uuid = None
if current_role_uuid_str:
try:
role_uuid_bytes = UUIDObj(current_role_uuid_str).bytes
current_role = GERPRole.query.filter(GERPRole.RoleUUID == role_uuid_bytes).first()
if current_role and current_role.CompanyUUID:
current_company_uuid = current_role.CompanyUUID
except:
pass
query = GERPMenu.query.filter(GERPMenu.MenuStatus == 1)
if current_company_uuid:
query = query.filter(
db.or_(
GERPMenu.CompanyUUID.is_(None),
GERPMenu.CompanyUUID == current_company_uuid
)
)
else:
query = query.filter(GERPMenu.CompanyUUID.is_(None))
menus = query.order_by(
GERPMenu.MenuSort.asc(),
GERPMenu.MenuName.asc()
).all()
menu_uuids = set()
for menu in menus:
menu_uuids.add(menu.MenuUUID)
menu_map = {}
for menu in menus:
perm_level = menu.PermissionLevel if menu.PermissionLevel else 0
perm_attr_str = menu.PermissionAttr or ""
perm_attrs = [a.strip() for a in perm_attr_str.split(";") if a.strip()] if perm_attr_str else []
if perm_level > 0 and perm_attrs:
if not PermissionVerifier(perm_level, perm_attrs):
continue
menu_uuid_str = FormData.GetTable("Menu").KeyToUUIDConversion("MenuUUID", menu.MenuUUID, str)
parent_uuid_str = ""
if menu.ParentMenuUUID:
if menu.ParentMenuUUID in menu_uuids:
parent_uuid_str = FormData.GetTable("Menu").KeyToUUIDConversion("ParentMenuUUID", menu.ParentMenuUUID, str)
menu_map[menu.MenuUUID] = {
"id": menu.MenuName,
"title": menu.MenuTitle,
"icon": menu.MenuIcon or "",
"page": menu.MenuLink or "",
"parentUUID": parent_uuid_str,
"menuUUID": menu_uuid_str,
"sort": menu.MenuSort or 0,
"type": menu.MenuType or 0,
"children": []
}
root_menus = []
for menu_uuid, item in menu_map.items():
parent_uuid = item["parentUUID"]
if parent_uuid:
parent_found = False
for puuid, pitem in menu_map.items():
if pitem["menuUUID"] == parent_uuid:
pitem["children"].append(item)
parent_found = True
break
if not parent_found:
root_menus.append(item)
else:
root_menus.append(item)
for menu_uuid, item in menu_map.items():
item["children"].sort(key=lambda x: x["sort"])
root_menus.sort(key=lambda x: x["sort"])
result = []
for item in root_menus:
result.append(_format_menu_item(item))
return {"code": 0, "data": result}, 200
def _format_menu_item(item):
formatted = {
"Id": item["id"],
"Title": item["title"],
"Icon": item["icon"],
}
if item["type"] == 1 and item["page"]:
formatted["Page"] = item["page"]
if item["children"]:
formatted["Expanded"] = False
formatted["Children"] = [_format_menu_item(c) for c in item["children"]]
return formatted