diff --git a/addons/web/static/src/legacy/js/views/basic/basic_model.js b/addons/web/static/src/legacy/js/views/basic/basic_model.js index ee04484b781..8e56448968f 100644 --- a/addons/web/static/src/legacy/js/views/basic/basic_model.js +++ b/addons/web/static/src/legacy/js/views/basic/basic_model.js @@ -381,6 +381,8 @@ var BasicModel = AbstractModel.extend({ }) .then(function () { _.each(records, function (record) { + // discard any changes to prevent creating a new record with auto-save + self.discardChanges(record.id); var parent = record.parentID && self.localData[record.parentID]; if (parent && parent.type === 'list') { parent.data = _.without(parent.data, record.id); diff --git a/addons/web/static/tests/views/form/form_view_tests.js b/addons/web/static/tests/views/form/form_view_tests.js index ba3f1b14ee5..8a4d0ad4fc6 100644 --- a/addons/web/static/tests/views/form/form_view_tests.js +++ b/addons/web/static/tests/views/form/form_view_tests.js @@ -13307,4 +13307,50 @@ QUnit.module("Views", (hooks) => { assert.verifySteps(['danger:Please click on the "save" button first']); } ); + + QUnit.test("prevent recreating a deleted record", async (assert) => { + serverData.models.partner.records.length = 1; + + serverData.actions[1] = { + id: 1, + name: "Partner", + res_model: "partner", + type: "ir.actions.act_window", + views: [ + [false, "list"], + [false, "form"], + ], + }; + serverData.views = { + "partner,false,list": ` + + + `, + "partner,false,form": ` +
+ + + +
`, + "partner,false,search": "", + }; + + const webClient = await createWebClient({ serverData }); + await doAction(webClient, 1); + + assert.containsOnce(target, ".o_data_row"); + assert.strictEqual(target.querySelector(".o_data_row").textContent, "name"); + await click(target, ".o_data_row .o_data_cell"); + + await editInput(target, ".o_field_char .o_input", "now dirty"); + assert.isVisible(target.querySelector(".o_form_status_indicator_buttons")); + + await click(target, ".o_cp_action_menus .dropdown-toggle"); + await click(target.querySelectorAll(".o_cp_action_menus .dropdown-item")[1]); + assert.containsOnce(target, ".modal"); + + await click(target, ".modal-footer button.btn-primary"); + assert.containsOnce(target, ".o_list_view"); + assert.containsNone(target, ".o_data_row"); + }); });