From a24aa746028630eaac0f5c8928e9cb22e1bcdf48 Mon Sep 17 00:00:00 2001 From: FrancoisGe Date: Mon, 20 Nov 2023 15:54:08 +0000 Subject: [PATCH] [FIX] web: m2o field use the right context When we save a many2one in a dialog opened by the external button, we trigger a "read" of the "display_name" to update it if the changes made in the dialog have had an impact on it. Before this commit, the context used for this "read" was completely wrong, it was an unevaluated string. This commit will therefore allow you to use the evaluated context. closes odoo/odoo#142862 X-original-commit: 7e9c8d41f5d035a00117198539ddebdbd8b4aa7c Signed-off-by: Aaron Bohy (aab) Signed-off-by: Francois Georis (fge) --- .../views/fields/many2one/many2one_field.js | 5 ++-- .../views/fields/many2one_field_tests.js | 25 ++++++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/addons/web/static/src/views/fields/many2one/many2one_field.js b/addons/web/static/src/views/fields/many2one/many2one_field.js index 174263bceb3..5dfd143c011 100644 --- a/addons/web/static/src/views/fields/many2one/many2one_field.js +++ b/addons/web/static/src/views/fields/many2one/many2one_field.js @@ -115,9 +115,10 @@ export class Many2OneField extends Component { onRecordSaved: async (record) => { const resId = this.value[0]; const fields = ["display_name"]; - const { context } = this.props; // use unity read + relatedFields from Field Component - const records = await this.orm.read(this.relation, [resId], fields, { context }); + const records = await this.orm.read(this.relation, [resId], fields, { + context: this.context, + }); await this.updateRecord(m2oTupleFromData(records[0])); }, onClose: () => this.focusInput(), diff --git a/addons/web/static/tests/views/fields/many2one_field_tests.js b/addons/web/static/tests/views/fields/many2one_field_tests.js index f3142597a97..17a3cbe479a 100644 --- a/addons/web/static/tests/views/fields/many2one_field_tests.js +++ b/addons/web/static/tests/views/fields/many2one_field_tests.js @@ -378,16 +378,22 @@ QUnit.module("Fields", (hooks) => { arch: `
- + +
`, - mockRPC(route, { method }) { + mockRPC(route, { args, method, model, kwargs }) { if (method === "get_formview_id") { return Promise.resolve(false); } if (method === "web_save") { assert.step("web_save"); } + if (method === "read" && model === "partner" && args[0][0] === 4) { + assert.step(`read partner: ${args[1]}`); + assert.strictEqual(kwargs.context.blip, 10); + assert.strictEqual(kwargs.context.blop, 3); + } }, }); @@ -402,7 +408,7 @@ QUnit.module("Fields", (hooks) => { // save and close modal await clickSave(target.querySelectorAll(".modal")[1]); - assert.verifySteps(["web_save"]); + assert.verifySteps(["web_save", "read partner: display_name"]); // save form await clickSave(target); assert.verifySteps([]); @@ -4572,21 +4578,16 @@ QUnit.module("Fields", (hooks) => { `, mockRPC(route, { method, kwargs }) { if (method === "name_search") { - return Promise.resolve([ - [1, false] - ]); + return Promise.resolve([[1, false]]); } }, }); const input = target.querySelector(".o_field_many2one input"); await click(input); - + await triggerEvents(input, null, ["input", "change"]); - let dropdown = target.querySelector(".o_field_many2one[name='trululu'] .dropdown-menu") - assert.strictEqual( - dropdown.querySelector("a.dropdown-item").text, - "Unnamed" - ); + const dropdown = target.querySelector(".o_field_many2one[name='trululu'] .dropdown-menu"); + assert.strictEqual(dropdown.querySelector("a.dropdown-item").text, "Unnamed"); }); });