[FIX] web: load SubViews without previous' view _view_ref context keys

On a form view (of model A), define a many2one (model B) with a [form|tree]_view_ref context key
In that view, have a x2m field (model C) with a different [form|tree]_view_ref context key

Before this commit, the second load_views (i.e. on the model C) crashed because
the wrong context key was sent to the server, which returned the view to which the _view_ref points
i.e. the view of the model B

After this commit, we clean the context of subviews loading, because those keys are only useful for the python
and one shot. Hence, there is no crash

OPW 1903780

closes odoo/odoo#28260
This commit is contained in:
Lucas Perais (lpe)
2018-11-13 09:02:24 +00:00
parent 1a0f5a50af
commit 3a0f9da0eb
2 changed files with 59 additions and 1 deletions
@@ -168,9 +168,12 @@ var FormViewDialog = ViewDialog.extend({
if (self.recordID) {
self.model.addFieldsInfo(self.recordID, viewInfo);
}
var refinedContext = _.pick(self.context, function (value, key) {
return key.indexOf('_view_ref') === -1;
});
var formview = new FormView(viewInfo, {
modelName: self.res_model,
context: self.context,
context: refinedContext,
ids: self.res_id ? [self.res_id] : [],
currentId: self.res_id || undefined,
index: 0,
@@ -365,6 +365,61 @@ QUnit.module('Views', {
form.destroy();
});
QUnit.test('Form dialog and subview with _view_ref contexts', function (assert) {
assert.expect(2);
this.data.instrument.records = [{id: 1, name: 'Tromblon', badassery: [1]}];
this.data.partner.records[0].instrument = 1;
var form = createView({
View: FormView,
model: 'partner',
data: this.data,
arch: '<form>' +
'<field name="name"/>' +
'<field name="instrument" context="{\'tree_view_ref\': \'some_tree_view\'}"/>' +
'</form>',
res_id: 1,
archs: {
'instrument,false,form': '<form>'+
'<field name="name"/>'+
'<field name="badassery" context="{\'tree_view_ref\': \'some_other_tree_view\'}"/>' +
'</form>',
'badassery,false,list': '<tree>'+
'<field name="level"/>'+
'</tree>',
},
viewOptions: {
mode: 'edit',
},
mockRPC: function(route, args) {
if (args.method === 'get_formview_id') {
return $.when(false);
}
return this._super(route, args);
},
interceptsPropagate: {
load_views: function (ev) {
var evaluatedContext = ev.data.context.eval();
if (ev.data.modelName === 'instrument') {
assert.deepEqual(evaluatedContext, {tree_view_ref: 'some_tree_view'},
'The correct _view_ref should have been sent to the server, first time');
}
if (ev.data.modelName === 'badassery') {
assert.deepEqual(evaluatedContext, {tree_view_ref: 'some_other_tree_view'},
'The correct _view_ref should have been sent to the server for the subview');
}
},
},
});
form.$('.o_field_widget[name="instrument"] button.o_external_button').click();
form.destroy();
});
});
});