[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:
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user