From fcc5ce9d4621eeb307475e5152ce820f9bc0a306 Mon Sep 17 00:00:00 2001 From: Adrien Dieudonne Date: Mon, 24 Apr 2017 08:02:06 +0200 Subject: [PATCH] [FIX] web: BasicModel: handle many2many default values Before this fix, default values for many2many fields (i.e. 'replace' commands) weren't correctly handled by the model, so the default values weren't set for those fields. --- .../static/src/js/views/basic/basic_model.js | 6 ++- .../static/tests/views/basic_model_tests.js | 53 ++++++++++++++++++- 2 files changed, 56 insertions(+), 3 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 dcc73a2845b..e6e2053d911 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -2120,7 +2120,7 @@ var BasicModel = AbstractModel.extend({ viewType: params.viewType, }); - var defs = []; // FIXME: remove defs? + var defs = []; _.each(fieldNames, function (name) { var field = params.fields[name]; data[name] = null; @@ -2192,7 +2192,9 @@ var BasicModel = AbstractModel.extend({ } if (value[0] === 6) { // REPLACE_WITH - x2manyList._changes = []; + x2manyList.res_ids = value[2]; + x2manyList.count = x2manyList.res_ids.length; + defs.push(self._readUngroupedList(x2manyList)); } } else { // value is an id diff --git a/addons/web/static/tests/views/basic_model_tests.js b/addons/web/static/tests/views/basic_model_tests.js index ec9700b66f3..2c8ced4b217 100644 --- a/addons/web/static/tests/views/basic_model_tests.js +++ b/addons/web/static/tests/views/basic_model_tests.js @@ -462,7 +462,7 @@ QUnit.module('Views', { }); QUnit.test('can make a default_record, no onchange', function (assert) { - assert.expect(3); + assert.expect(5); this.params.context = {}; this.params.fieldNames = ['product_id', 'category', 'product_ids']; @@ -472,6 +472,10 @@ QUnit.module('Views', { var model = createModel({ Model: BasicModel, data: this.data, + mockRPC: function (route, args) { + assert.step(args.method); + return this._super(route, args); + }, }); model.load(this.params).then(function (resultID) { @@ -480,6 +484,53 @@ QUnit.module('Views', { assert.deepEqual(record.data.product_ids.data, [], "o2m default should be []"); assert.deepEqual(record.data.category.data, [], "m2m default should be []"); }); + + assert.verifySteps(['default_get'], + "there should be default_get"); + + model.destroy(); + }); + + QUnit.test('can make a default_record with default relational values', function (assert) { + assert.expect(7); + + this.data.partner.fields.product_id.default = 37; + this.data.partner.fields.product_ids.default = [ + [0, false, {name: 'xmac'}], + [0, false, {name: 'xcloud'}] + ]; + this.data.partner.fields.category.default = [ + [6, false, [12, 14]] + ]; + + this.params.fieldNames = ['product_id', 'category', 'product_ids']; + this.params.res_id = undefined; + this.params.type = 'record'; + + var model = createModel({ + Model: BasicModel, + data: this.data, + mockRPC: function (route, args) { + assert.step(args.method); + return this._super(route, args); + }, + }); + + model.load(this.params).then(function (resultID) { + var record = model.get(resultID); + assert.deepEqual(record.data.product_id.data.display_name, 'xphone', + "m2o default should be xphone"); + assert.deepEqual(record.data.product_ids.data.length, + 2, "o2m default should have two records"); + assert.deepEqual(record.data.product_ids.data[0].data.name, + 'xmac', "first o2m default value should be xmac"); + assert.deepEqual(record.data.category.res_ids, [12, 14], + "m2m default should be [12, 14]"); + }); + + assert.verifySteps(['default_get', 'name_get'], + "there should be default_get and name_get"); + model.destroy(); });