diff --git a/addons/web/static/src/model/relational_model/record.js b/addons/web/static/src/model/relational_model/record.js index 664c29a89b1..e585e3a0b5c 100644 --- a/addons/web/static/src/model/relational_model/record.js +++ b/addons/web/static/src/model/relational_model/record.js @@ -1044,7 +1044,7 @@ export class Record extends DataPoint { } } if (Object.keys(changes).length > 0) { - const initialChanges = pick(this._changes, ...Object.keys(changes)); + const initialChanges = pick(this.data, ...Object.keys(changes)); this._applyChanges(changes); try { await this._onUpdate({ withoutParentUpdate }); diff --git a/addons/web/static/tests/views/fields/one2many_field_tests.js b/addons/web/static/tests/views/fields/one2many_field_tests.js index 03eab2b81ba..a4863babf62 100644 --- a/addons/web/static/tests/views/fields/one2many_field_tests.js +++ b/addons/web/static/tests/views/fields/one2many_field_tests.js @@ -14177,4 +14177,46 @@ QUnit.module("Fields", (hooks) => { ]); assert.verifySteps(["get_views", "web_read", "web_save"]); }); + + QUnit.test("one2many causes an onchange on the parent which fails", async function (assert) { + serverData.models.partner.onchanges = { + turtles: function () {}, + }; + serviceRegistry.add("error", errorService); + + await makeView({ + type: "form", + resModel: "partner", + serverData, + arch: ` +
+ + + + + +
`, + mockRPC(route, args) { + if (args.method === "onchange" && args.model === "partner") { + throw makeServerError(); + } + }, + resId: 1, + }); + + await click(target.querySelector(".o_data_cell")); + assert.strictEqual( + target.querySelector(".o_field_widget[name='turtle_foo'] input").value, + "blip" + ); + + // onchange on parent record fails + await editInput(target, ".o_field_widget[name='turtle_foo'] input", "new value"); + await nextTick(); + assert.strictEqual( + target.querySelector(".o_field_widget[name='turtle_foo'] input").value, + "blip" + ); + assert.containsOnce(target, ".o_error_dialog"); + }); });