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