[FIX] web: properly loads default values for many2manys

Many2many default value can be a list of ids, and in that case, we did
not properly load data.

It could be seen by selecting a few contacts (in list view), then
opening the 'Merge contact' wizard in the sidebar (action menu).  Before
this commit, the wizard did show a list with some empty rows (for the
field partner_ids).
This commit is contained in:
Géry Debongnie
2017-05-18 11:33:32 +02:00
parent ba6a3a91ae
commit 3dd97db07f
2 changed files with 58 additions and 45 deletions
@@ -2300,60 +2300,48 @@ var BasicModel = AbstractModel.extend({
record._changes[name] = x2manyList.id;
var many2ones = {};
var r;
var isCommandList = result[name].length && _.isArray(result[name][0]);
if (!isCommandList) {
result[name] = [[6, false, result[name]]];
}
_.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,
fieldsInfo: fieldsInfo,
fields: fields,
viewType: viewType,
});
x2manyList._changes = x2manyList._changes || [];
x2manyList._changes.push(r.id);
// this is necessary so the fields are initialized
_.each(r.getFieldNames(), function (fieldName) {
r.data[fieldName] = null;
});
r._changes = _.defaults(value[2], r.data);
for (var name in r._changes) {
var isFieldInView = name in r.fields;
if (isFieldInView && 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.res_ids = value[2];
x2manyList.count = x2manyList.res_ids.length;
defs.push(self._readUngroupedList(x2manyList));
}
} else {
// value is an id
// value is a command
if (value[0] === 0) {
// CREATE
r = self._makeDataPoint({
modelName: x2manyList.model,
context: x2manyList.context,
fieldsInfo: fieldsInfo,
fields: fields,
res_id: value,
viewType: viewType,
});
if (!x2manyList._changes) {
x2manyList._changes = [];
}
x2manyList._changes = x2manyList._changes || [];
x2manyList._changes.push(r.id);
// this is necessary so the fields are initialized
_.each(r.getFieldNames(), function (fieldName) {
r.data[fieldName] = null;
});
r._changes = _.defaults(value[2], r.data);
for (var name in r._changes) {
var isFieldInView = name in r.fields;
if (isFieldInView && 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.res_ids = value[2];
x2manyList.count = x2manyList.res_ids.length;
defs.push(self._readUngroupedList(x2manyList));
}
});
@@ -3579,6 +3579,31 @@ QUnit.module('relational_fields', {
form.destroy();
});
QUnit.test('many2many list: list of id as default value', function (assert) {
assert.expect(1);
this.data.partner.fields.turtles.default = [2, 3];
this.data.partner.fields.turtles.type = "many2many";
var form = createView({
View: FormView,
model: 'partner',
data: this.data,
arch:'<form string="Partners">' +
'<field name="turtles">' +
'<tree>' +
'<field name="turtle_foo"/>' +
'</tree>' +
'</field>' +
'</form>',
});
assert.strictEqual(form.$('td.o_data_cell').text(), "blipkawa",
"should have loaded default data");
form.destroy();
});
QUnit.test('many2many list with x2many: add a record', function (assert) {
assert.expect(18);