From 01d7f98e2428f339f2019640091b0220664f5e78 Mon Sep 17 00:00:00 2001 From: Mathieu Duckerts-Antoine Date: Fri, 20 May 2022 14:27:34 +0000 Subject: [PATCH] [IMP] web: search: domain evaluation uses action context MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit It is now possible to get access to the action context keys when the search filters are evaluated. This means that a search arch filter like can be safely evaluated if "my_value" is in the action context (or in the user context or is builtin as before). closes odoo/odoo#91959 Signed-off-by: Géry Debongnie --- .../control_panel_model_extension.js | 5 ++++- addons/web/static/src/search/search_model.js | 4 +++- .../control_panel/control_panel_tests.js | 22 +++++++++++++++++++ .../static/tests/search/search_model_tests.js | 19 ++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/legacy/js/control_panel/control_panel_model_extension.js b/addons/web/static/src/legacy/js/control_panel/control_panel_model_extension.js index 46e6571f589..b2c19d6b250 100644 --- a/addons/web/static/src/legacy/js/control_panel/control_panel_model_extension.js +++ b/addons/web/static/src/legacy/js/control_panel/control_panel_model_extension.js @@ -429,7 +429,10 @@ odoo.define("web/static/src/js/control_panel/control_panel_model_extension.js", const groups = this._getGroups(); const userContext = this.env.session.user_context; try { - return Domain.prototype.stringToArray(this._getDomain(groups), userContext); + return Domain.prototype.stringToArray( + this._getDomain(groups), + Object.assign({}, this.actionContext, userContext) + ); } catch (err) { throw new Error( `${this.env._t("Control panel model extension failed to evaluate domain")}:/n${JSON.stringify(err)}` diff --git a/addons/web/static/src/search/search_model.js b/addons/web/static/src/search/search_model.js index b8995f199c2..9ca0506e4c4 100644 --- a/addons/web/static/src/search/search_model.js +++ b/addons/web/static/src/search/search_model.js @@ -1423,7 +1423,9 @@ export class SearchModel extends EventBus { let domain; try { domain = Domain.and(domains); - return params.raw ? domain : domain.toList(this.userService.context); + return params.raw ? domain : domain.toList( + Object.assign({}, this.globalContext, this.userService.context) + ); } catch (error) { throw new Error( `${this.env._t("Failed to evaluate the domain")} ${domain.toString()}.\n${ diff --git a/addons/web/static/tests/legacy/control_panel/control_panel_tests.js b/addons/web/static/tests/legacy/control_panel/control_panel_tests.js index 7fe27ac1b3f..5b23b597743 100644 --- a/addons/web/static/tests/legacy/control_panel/control_panel_tests.js +++ b/addons/web/static/tests/legacy/control_panel/control_panel_tests.js @@ -281,5 +281,27 @@ odoo.define('web.control_panel_tests', function (require) { "hasn't autofocused search field"); }); + QUnit.test("dynamic domains evaluation using global context", async function (assert) { + const arch = ` + + + + `; + const context = { + search_default_filter: true, + my_date: "2021-09-17", + }; + const fields = this.fields; + const searchMenuTypes = ['filter']; + const controlPanel = await createControlPanel({ + cpModelConfig: { arch, fields, searchMenuTypes, context }, + cpProps: { fields, searchMenuTypes }, + }); + assert.deepEqual( + controlPanel.getQuery().domain, + [['date_deadline', '<', "2021-09-17"]] + ); + }); + }); }); diff --git a/addons/web/static/tests/search/search_model_tests.js b/addons/web/static/tests/search/search_model_tests.js index 90a0bfd9f43..f5c7d0ebaed 100644 --- a/addons/web/static/tests/search/search_model_tests.js +++ b/addons/web/static/tests/search/search_model_tests.js @@ -870,4 +870,23 @@ QUnit.module("Search", (hooks) => { model.toggleSearchItem(i + 1); } }); + + QUnit.test("dynamic domains evaluation using global context", async function (assert) { + const searchViewArch = ` + + + + `; + + const model = await makeSearchModel({ + serverData, + searchViewArch, + context: { + "my_date": "2021-09-17" + } + }); + + model.toggleSearchItem(1); + assert.deepEqual(model.domain, [['date_deadline', '<', "2021-09-17"]]); + }); });