From e3fdce964357a0bf38b3925637da2ed712e8e315 Mon Sep 17 00:00:00 2001 From: Martin Geubelle Date: Mon, 29 May 2017 17:07:28 +0200 Subject: [PATCH] [FIX] web: add parent in context after 'Save & New' When clicking on 'Save & New' in the form view dialog, a new default record is created. The parent was not correctly set in this record, which causes an error if `parent` was used in context. --- .../src/js/views/form/form_controller.js | 5 +- .../web/static/src/js/views/view_dialogs.js | 2 +- addons/web/static/tests/views/form_tests.js | 51 +++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js index 1833d263082..8ae66848b75 100644 --- a/addons/web/static/src/js/views/form/form_controller.js +++ b/addons/web/static/src/js/views/form/form_controller.js @@ -50,9 +50,11 @@ var FormController = BasicController.extend({ * This method switches the form view in edit mode, with a new record. * * @todo make record creation a basic controller feature + * @param {string} [parentID] if given, the parentID will be used as parent + * for the new record. * @returns {Deferred} */ - createRecord: function () { + createRecord: function (parentID) { var self = this; var record = this.model.get(this.handle, {raw: true}); return this.model.load({ @@ -60,6 +62,7 @@ var FormController = BasicController.extend({ fields: record.fields, fieldsInfo: record.fieldsInfo, modelName: this.modelName, + parentID: parentID, res_ids: record.res_ids, type: 'record', viewType: 'form', diff --git a/addons/web/static/src/js/views/view_dialogs.js b/addons/web/static/src/js/views/view_dialogs.js index 956886910ce..b84d60d5b7c 100644 --- a/addons/web/static/src/js/views/view_dialogs.js +++ b/addons/web/static/src/js/views/view_dialogs.js @@ -133,7 +133,7 @@ var FormViewDialog = ViewDialog.extend({ text: _t("Save & New"), classes: "btn-primary", click: function () { - this._save().then(self.form_view.createRecord.bind(self.form_view)); + this._save().then(self.form_view.createRecord.bind(self.form_view, self.parentID)); }, }); } diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index 14e7c08517d..9cce413b618 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -4709,5 +4709,56 @@ QUnit.module('Views', { form.destroy(); }); + QUnit.test('context is correctly passed after save & new in FormViewDialog', function (assert) { + assert.expect(3); + + var form = createView({ + View: FormView, + model: 'partner', + res_id: 4, + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '
', + archs: { + 'product,false,form': + '
' + + '' + + '' + + '' + + '' + + '' + + '
', + 'product,false,list': '' + }, + mockRPC: function (route, args) { + if (args.method === 'name_search') { + assert.strictEqual(args.kwargs.context.color, 4, + "should use the correct context"); + } + return this._super.apply(this, arguments); + }, + }); + + form.$buttons.find('.o_form_button_edit').click(); + form.$('.o_field_x2many_list_row_add a').click(); + assert.strictEqual($('.modal').length, 1, + "One FormViewDialog should be opened"); + // set a value on the m2o + var $dropdown = form.$('.o_field_many2one input').autocomplete('widget'); + $('.modal .o_field_many2one input').click(); + $dropdown.find('li:first()').click(); + + $('.modal .modal-footer button:eq(1)').click(); // Save & new + $('.modal .o_field_many2one input').click(); + $('.modal .modal-footer button:first').click(); // Save & close + form.destroy(); + }); + }); });