123 lines
3.8 KiB
Plaintext
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
|