diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index e737df9cc9e..efc7fbc1971 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -662,6 +662,10 @@ var BasicModel = AbstractModel.extend({ } var shouldReload = 'reload' in options ? options.reload : true; var method = self.isNew(record_id) ? 'create' : 'write'; + if (record._changes) { + // id never changes, and should not be written + delete record._changes.id; + } var changes = self._generateChanges(record); if (method === 'create') { @@ -673,8 +677,6 @@ var BasicModel = AbstractModel.extend({ } }); } - // make sure we don't write an undefined id - delete changes.id; // in the case of a write, only perform the RPC if there are changes to save if (method === 'create' || Object.keys(changes).length) { diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index d0662959290..617dc221651 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -787,6 +787,55 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('buttons in form view, new record, with field id in view', function (assert) { + assert.expect(6); + // buttons in form view are one of the rare example of situation when we + // save a record without reloading it immediately, because we only care + // about its id for the next step. But at some point, if the field id + // is in the view, it was registered in the changes, and caused invalid + // values in the record (data.id was set to null) + + var resID; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
', + mockRPC: function (route, args) { + assert.step(args.method); + if (args.method === 'create') { + return this._super.apply(this, arguments).then(function (result) { + resID = result; + return resID; + }); + } + return this._super.apply(this, arguments); + }, + }); + + testUtils.intercept(form, 'execute_action', function (event) { + assert.step('execute_action'); + assert.strictEqual(event.data.record_id, resID, + "execute action should be done on correct record id"); + event.data.on_success(); + }); + form.$('.o_form_statusbar button.p').click(); + + assert.verifySteps(['default_get', 'create', 'execute_action', 'read']); + form.destroy(); + }); + QUnit.test('change and save char', function (assert) { assert.expect(6); var form = createView({