[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.
This commit is contained in:
Adrien Dieudonne
2017-04-24 17:29:52 +02:00
parent 6d4e223c18
commit fcc5ce9d46
2 changed files with 56 additions and 3 deletions
@@ -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
@@ -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();
});