[FIX] web: BasicModel: recursively fetch x2manys

Before this commit, x2many fields embedded in x2many fields were
not fetched. This was for example the case for many2many_tags in
one2many fields.

This commit enables the recursive fetch of x2many fields.

There is still a missing piece, as the list of fields to fetch for
those embedded x2manys is still unknown. This will come in a
future commit.
This commit is contained in:
Aaron Bohy
2017-04-11 19:44:38 +02:00
parent 942074557b
commit 0111882af1
2 changed files with 21 additions and 28 deletions
@@ -1631,7 +1631,10 @@ var BasicModel = AbstractModel.extend({
}
record.data[fieldName] = list.id;
if (!field.__no_fetch) {
defs.push(self._readUngroupedList(list));
var def = self._readUngroupedList(list).then(function () {
return self._fetchX2ManysBatched(list);
});
defs.push(def);
}
}
});
@@ -2166,27 +2169,6 @@ var BasicModel = AbstractModel.extend({
// add many2one records
self._parseServerData(list.fieldNames, dataPoint.fields, dataPoint.data);
list._cache[id] = dataPoint.id;
_.each(list.fieldNames, function (fieldName) {
var field = dataPoint.fields[fieldName];
var val = dataPoint.data[fieldName];
if (field.type === 'one2many' || field.type === 'many2many') {
var r = self._makeDataPoint({
count: val.length,
fieldAttrs: field.fieldAttrs,
fields: field.relatedFields,
limit: field.limit,
modelName: field.relation,
res_ids: val,
static: true,
type: 'list',
parentID: list.id,
rawContext: field.context,
relationField: field.relation_field,
});
dataPoint.data[fieldName] = r.id;
}
});
}
list.data.push(dataPoint.id);
});
@@ -94,7 +94,7 @@ QUnit.module('relational_fields', {
turtle_qux: {string: "Qux", type: "float", digits: [16,1], required: true, default: 1.5},
turtle_trululu: {string: "Trululu", type: "many2one", relation: 'partner'},
product_id: {string: "Product", type: "many2one", relation: 'product', required: true},
partner_ids: {string: "Partner", type: "one2many", relation: 'partner'},
partner_ids: {string: "Partner", type: "many2many", relation: 'partner'},
},
records: [{
id: 1,
@@ -1980,12 +1980,11 @@ QUnit.module('relational_fields', {
form.destroy();
});
QUnit.test('one2many inception part 1', function (assert) {
assert.expect(2);
QUnit.test('many2one and many2many in one2many', function (assert) {
assert.expect(4);
this.data.turtle.records[1].product_id = 37;
this.data.partner.records[0].turtles = [2,3];
this.data.partner.records[2].turtles = [1,3];
this.data.partner.records[0].turtles = [2, 3];
var form = createView({
View: FormView,
@@ -2002,16 +2001,28 @@ QUnit.module('relational_fields', {
'</form>' +
'<tree>' +
'<field name="display_name"/>' +
'<field name="partner_ids"/>' +
'<field name="product_id"/>' +
'<field name="partner_ids" widget="many2many_tags"/>' +
'</tree>' +
'</field>' +
'</group>' +
'</form>',
debug: true,
res_id: 1,
});
assert.strictEqual(form.$('.o_data_row').length, 2,
'should display the 2 turtles');
assert.strictEqual(form.$('.o_data_row:first td:nth(1)').text(), 'xphone',
"should correctly display the m2o");
assert.strictEqual(form.$('.o_data_row:first td:nth(2) .badge').length, 2,
"m2m should contain two tags");
// the next assert doesn't work for now because the relatedFields of
// the m2m embedded in the o2m aren't correctly computed (['id'] instead)
// of ['id', 'display_name', 'color'], so the badges are empty as the
// display_name is unknown
// assert.strictEqual(form.$('.o_data_row:first td:nth(2) .badge:first span').text(),
// 'second record', "m2m should contain two tags");
form.$('.o_data_row:first').click();