diff --git a/addons/web/static/src/core/user_service.js b/addons/web/static/src/core/user_service.js index dea43afbe4f..4a701687646 100644 --- a/addons/web/static/src/core/user_service.js +++ b/addons/web/static/src/core/user_service.js @@ -3,8 +3,11 @@ import { registry } from "./registry"; export const userService = { - start() { + dependencies: ["rpc"], + async: ["hasGroup"], + start(env, { rpc }) { const sessionInfo = odoo.session_info; + const groupProms = {}; const context = { ...sessionInfo.user_context, @@ -20,6 +23,20 @@ export const userService = { updateContext(update) { Object.assign(context, update); }, + hasGroup(group) { + if (!context.uid) { + return Promise.resolve(false); + } + if (!groupProms[group]) { + groupProms[group] = rpc("/web/dataset/call_kw/res.users/has_group", { + model: "res.users", + method: "has_group", + args: [group], + kwargs: { context }, + }); + } + return groupProms[group]; + }, name: sessionInfo.name, userName: sessionInfo.username, isAdmin: sessionInfo.is_admin, diff --git a/addons/web/static/tests/core/user_service_tests.js b/addons/web/static/tests/core/user_service_tests.js new file mode 100644 index 00000000000..69ff33a9f04 --- /dev/null +++ b/addons/web/static/tests/core/user_service_tests.js @@ -0,0 +1,27 @@ +/** @odoo-module **/ + +import { registry } from "@web/core/registry"; +import { userService } from "@web/core/user_service"; +import { makeTestEnv } from "../helpers/mock_env"; + +const serviceRegistry = registry.category("services"); + +QUnit.module("UserService"); + +QUnit.test("successive calls to hasGroup", async (assert) => { + serviceRegistry.add("user", userService); + const groups = ["x"]; + const mockRPC = (route, args) => { + assert.step(`${args.model}/${args.method}/${args.args[0]}`); + return groups.includes(args.args[0]); + }; + const env = await makeTestEnv({ mockRPC }); + let hasGroupX = await env.services.user.hasGroup("x"); + let hasGroupY = await env.services.user.hasGroup("y"); + assert.strictEqual(hasGroupX, true); + assert.strictEqual(hasGroupY, false); + let hasGroupXAgain = await env.services.user.hasGroup("x"); + assert.strictEqual(hasGroupXAgain, true); + + assert.verifySteps(["res.users/has_group/x", "res.users/has_group/y"]); +});