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 f93635618e3..9139906f982 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -770,6 +770,7 @@ var BasicModel = AbstractModel.extend({ var onchangeDef; if (onChangeFields.length) { onchangeDef = self._applyOnChange(record, onChangeFields).then(function (result) { + delete record._warning; return _.keys(changes).concat(Object.keys(result && result.value || {})); }); } else { @@ -884,6 +885,7 @@ var BasicModel = AbstractModel.extend({ title: result.warning.title, type: 'dialog', }); + record._warning = true; } var defs = []; _.each(result.value, function (val, name) { @@ -2045,7 +2047,11 @@ var BasicModel = AbstractModel.extend({ } } if (shouldApplyOnchange) { - return self._applyOnChange(record, fields_key); + return self._applyOnChange(record, fields_key).then(function () { + if (record._warning) { + return $.Deferred().reject(); + } + }); } else { return $.when(); } diff --git a/addons/web/static/test/views/form_tests.js b/addons/web/static/test/views/form_tests.js index 49c563fc9cc..e40bb20c139 100644 --- a/addons/web/static/test/views/form_tests.js +++ b/addons/web/static/test/views/form_tests.js @@ -1868,6 +1868,50 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('do nothing if add a line in one2many result in a onchange with a warning', function (assert) { + assert.expect(2); + + this.data.partner.onchanges = { foo: true }; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
', + res_id: 2, + mockRPC: function (route, args) { + if (args.method === 'onchange') { + return $.when({ + value: {}, + warning: { + title: "Warning", + message: "You must first select a partner" + } + }); + } + return this._super.apply(this, arguments); + }, + intercepts: { + warning: function () { + assert.step("should have triggered a warning"); + }, + }, + }); + + // go to edit mode, click to add a record in the o2m + form.$buttons.find('.o_form_button_edit').click(); + form.$('.o_form_field_x2many_list_row_add a').click(); + assert.strictEqual(form.$('tr.o_data_row').length, 0, + "should not have added a line"); + form.destroy(); + }); + QUnit.test('attrs are properly transmitted to new records', function (assert) { assert.expect(2);