From e1abe0bb71ca5944c8a0ab377754ebb185643379 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 13 Jul 2026 11:27:21 +0800 Subject: [PATCH] fix: role dropdown filter by user org_type, add get_search_roleid.dspy --- json/userrole.json | 9 ++++++++- scripts/load_path.py | 1 + wwwroot/api/get_search_roleid.dspy | 32 ++++++++++++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 wwwroot/api/get_search_roleid.dspy diff --git a/json/userrole.json b/json/userrole.json index 4363c3e..00cbd06 100644 --- a/json/userrole.json +++ b/json/userrole.json @@ -4,7 +4,14 @@ "params": { "browserfields": { "exclouded": ["id", "orgid"], - "alters": {} + "alters": { + "roleid": { + "uitype": "code", + "dataurl": "{{entire_url('/rbac/api/get_search_roleid.dspy')}}", + "textField": "text", + "valueField": "value" + } + } }, "editexclouded": [ "id", diff --git a/scripts/load_path.py b/scripts/load_path.py index f9a590e..fea5808 100644 --- a/scripts/load_path.py +++ b/scripts/load_path.py @@ -79,6 +79,7 @@ PATHS_LOGINED = [ f"/{MOD}/usersync/index.dspy", f"/{MOD}/api/add_user.dspy", f"/{MOD}/api/update_user.dspy", + f"/{MOD}/api/get_search_roleid.dspy", ] diff --git a/wwwroot/api/get_search_roleid.dspy b/wwwroot/api/get_search_roleid.dspy new file mode 100644 index 0000000..9722194 --- /dev/null +++ b/wwwroot/api/get_search_roleid.dspy @@ -0,0 +1,32 @@ +"""Return role options filtered by the current user's org_type. +Used by userrole CRUD form to limit roleid dropdown to own org type roles.""" +userorgid = await get_userorgid() +if not userorgid: + return [{'value': '', 'text': '全部'}] + +async with get_sor_context(request._run_ns, 'rbac') as sor: + # Get user's org_type + org_recs = await sor.R('organization', {'id': userorgid}) + org_type = org_recs[0].org_type if org_recs else '' + + # If no org_type or owner-type (org 0), show all roles + if not org_type or userorgid == '0': + recs = await sor.sqlExe( + "SELECT id, CONCAT(orgtypeid, '.', name) as name FROM role " + "WHERE id NOT IN ('anonymous', 'any', 'logined') " + "AND orgtypeid != '*' AND name != '*' " + "AND orgtypeid IS NOT NULL AND name IS NOT NULL " + "ORDER BY orgtypeid, name", {}) + else: + # Filter to user's org_type only + recs = await sor.sqlExe( + "SELECT id, CONCAT(orgtypeid, '.', name) as name FROM role " + "WHERE id NOT IN ('anonymous', 'any', 'logined') " + "AND orgtypeid = ${ot}$ AND name != '*' AND name IS NOT NULL " + "ORDER BY name", + {'ot': org_type}) + + result = [{'value': '', 'text': '全部'}] + for r in recs: + result.append({'value': r.id, 'text': r.name}) + return result