From d7eb116fa8b9d5e9cd75f628a3a9e6e53fcbd744 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Tue, 28 Feb 2017 16:17:28 +0100 Subject: [PATCH] [FIX] web: properly compute contexts in some cases When we have a many2one widget in a one2many, editable, the context was not properly computed: it expected the parent to be a record object, but in that case, it is a list object. --- .../static/src/js/views/basic/basic_model.js | 14 +++++-- .../test/fields/relational_fields_tests.js | 38 +++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) 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 c5d212ff930..5f1e6ccbb9c 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -1555,6 +1555,9 @@ var BasicModel = AbstractModel.extend({ var evalContext = this.get(element.id, {raw: true}).data; if (element.parentID) { var parent = this.get(element.parentID, {raw: true}); + if (parent.type === 'list' && this.localData[element.parentID].parentID) { + parent = this.get(this.localData[element.parentID].parentID, {raw: true}); + } _.extend(evalContext, {parent: parent.data}); } context.set_eval_context(evalContext); @@ -1846,11 +1849,12 @@ var BasicModel = AbstractModel.extend({ dataPoint = self.localData[list._cache[id]]; } else { dataPoint = self._makeDataPoint({ - modelName: list.model, data: _.findWhere(records, {id: id}), - fields: list.fields, - fieldNames: list.fieldNames, fieldAttrs: list.fieldAttrs, + fieldNames: list.fieldNames, + fields: list.fields, + modelName: list.model, + parentID: list.id, }); // add many2one records @@ -1862,7 +1866,8 @@ var BasicModel = AbstractModel.extend({ data: { id: dataPoint.data[name][0], display_name: dataPoint.data[name][1], - } + }, + parentID: dataPoint.id, }); dataPoint.data[name] = r.id; @@ -1905,6 +1910,7 @@ var BasicModel = AbstractModel.extend({ fieldNames: list.fieldNames, fieldAttrs: list.fieldAttrs, modelName: list.model, + parentID: list.id, }); // add many2one records diff --git a/addons/web/static/test/fields/relational_fields_tests.js b/addons/web/static/test/fields/relational_fields_tests.js index 294a3cb44d5..583f9adfdd1 100644 --- a/addons/web/static/test/fields/relational_fields_tests.js +++ b/addons/web/static/test/fields/relational_fields_tests.js @@ -1431,6 +1431,44 @@ QUnit.module('relational_fields', { form.destroy(); }); + QUnit.test('one2many list, editable, with many2one and with context with parent key', function (assert) { + assert.expect(1); + + this.data.partner.records[0].p = [2]; + this.data.partner.records[1].product_id = 37; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '', + res_id: 1, + mockRPC: function (route, args) { + if (args.method === 'name_search') { + assert.strictEqual(args.kwargs.context.partner_foo, "yop", + "should have correctly evaluated parent foo field"); + } + return this._super.apply(this, arguments); + }, + }); + + form.$buttons.find('.o_form_button_edit').click(); + + form.$('tr.o_data_row:eq(0) td:contains(xphone)').click(); + + // trigger a name search + form.$('table td input.o_form_input').click(); + + form.destroy(); + }); + QUnit.test('one2many list edition, some basic functionality', function (assert) { assert.expect(3);