From 8d2336abb340d06c64ff62c398e4ec7f7eabe54c Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Fri, 24 Feb 2017 12:09:56 +0100 Subject: [PATCH] [FIX] web: default_get on x2many may return a list of ids --- .../static/src/js/views/basic/basic_model.js | 69 ++++++++++++------- .../static/test/views/basic_model_tests.js | 25 +++++++ 2 files changed, 68 insertions(+), 26 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 12738a1235d..a66e3a9d3ab 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -500,38 +500,55 @@ var BasicModel = AbstractModel.extend({ }); record._changes[name] = x2manyList.id; var many2ones = {}; - _.each(result[name], function (command) { - if (command[0] === 0) { - // CREATE - var r = self._makeDataPoint({ + var r; + _.each(result[name], function (value) { + if (_.isArray(value)) { + // value is a command + if (value[0] === 0) { + // CREATE + r = self._makeDataPoint({ + modelName: x2manyList.model, + context: x2manyList.context, + fields: field.relatedFields, + fieldAttrs: field.fieldAttrs, + }); + x2manyList._changes.push(r.id); + r._changes = value[2]; + + // this is necessary so the fields are initialized + for (var fieldName in value[2]) { + r.data[fieldName] = null; + } + + for (var name in r._changes) { + if (r.fields[name].type === 'many2one') { + var rec = self._makeDataPoint({ + context: r.context, + modelName: r.fields[name].relation, + data: {id: r._changes[name]} + }); + r._changes[name] = rec.id; + many2ones[name] = true; + } + } + } + if (value[0] === 6) { + // REPLACE_WITH + x2manyList._changes = []; + } + } else { + // value is an id + r = self._makeDataPoint({ modelName: x2manyList.model, context: x2manyList.context, fields: field.relatedFields, fieldAttrs: field.fieldAttrs, + res_id: value, }); + if (!x2manyList._changes) { + x2manyList._changes = []; + } x2manyList._changes.push(r.id); - r._changes = command[2]; - - // this is necessary so the fields are initialized - for (var fieldName in command[2]) { - r.data[fieldName] = null; - } - - for (var name in r._changes) { - if (r.fields[name].type === 'many2one') { - var rec = self._makeDataPoint({ - context: r.context, - modelName: r.fields[name].relation, - data: {id: r._changes[name]} - }); - r._changes[name] = rec.id; - many2ones[name] = true; - } - } - } - if (command[0] === 6) { - // REPLACE_WITH - x2manyList._changes = []; } }); diff --git a/addons/web/static/test/views/basic_model_tests.js b/addons/web/static/test/views/basic_model_tests.js index 4d8fa4bf095..5fba6cd4444 100644 --- a/addons/web/static/test/views/basic_model_tests.js +++ b/addons/web/static/test/views/basic_model_tests.js @@ -810,5 +810,30 @@ QUnit.module('Views', { model.destroy(); }); + QUnit.test('default_get on x2many may return a list of ids', function (assert) { + assert.expect(1); + + this.data.partner.fields.category.default = [12, 14]; + + var model = createModel({ + Model: BasicModel, + data: this.data, + }); + + var params = { + fieldNames: ['category'], + fields: this.data.partner.fields, + modelName: 'partner', + }; + + model.makeDefaultRecord('partner', params).then(function (resultID) { + var record = model.get(resultID); + assert.ok(_.isEqual(record.data.category.res_ids, [12, 14]), + "category field should have correct default value"); + }); + + model.destroy(); + }); + });});