[FIX] web: Pivot: handle __count__ measure

The former implementation of the Pivot view used __count__ as
magic field to display the number of records in groups. However,
in filters defined in xml, __count is used instead of __count__,
so it crashed when such filters were activated.

With the new views, we made those filters work by using __count.
However, if a user saved filters using __count__ at that time as
favorite, activating them in the new views produces a crash as
well.

This rev. adds a compatibility layer to ensure that the pivot
view handles both __count__ and __count measures uniformly.
This commit is contained in:
Aaron Bohy
2017-08-24 07:20:22 +02:00
parent db0810dc6e
commit acb9d60d94
2 changed files with 41 additions and 1 deletions
@@ -222,6 +222,17 @@ var PivotModel = AbstractModel.extend({
* @returns {Deferred}
*/
load: function (params) {
// In the preview implementation of the pivot view (a.k.a. version 2),
// the virtual field used to display the number of records was named
// __count__, whereas __count is actually the one used in xml. So
// basically, activating a filter specifying __count as measures crashed.
// Unfortunately, as __count__ was used in the JS, all filters saved as
// favorite at that time were saved with __count__, and not __count.
// So in order the make them still work with the new implementation, we
// simply rename __count__ into __count at this unique entry point.
var measures = _.map(params.measures, function (measure) {
return measure === '__count__' ? '__count' : measure;
});
this.initialDomain = params.domain;
this.initialRowGroupBys = params.rowGroupBys;
this.fields = params.fields;
@@ -231,7 +242,7 @@ var PivotModel = AbstractModel.extend({
context: _.extend({}, session.user_context, params.context),
groupedBy: params.groupedBy,
colGroupBys: params.colGroupBys,
measures: params.measures,
measures: measures,
sorted_column: {},
};
this.defaultGroupedBy = params.groupedBy;
@@ -859,4 +859,33 @@ QUnit.module('Views', {
pivot.destroy();
});
QUnit.test('pivot still handles __count__ measure', function (assert) {
// for retro-compatibility reasons, the pivot view still handles
// '__count__' measure.
assert.expect(2);
var pivot = createView({
View: PivotView,
model: "partner",
data: this.data,
arch: '<pivot></pivot>',
mockRPC: function (route, args) {
if (args.method === 'read_group') {
assert.deepEqual(args.kwargs.fields, ['__count'],
"should make a read_group with field __count");
}
return this._super(route, args);
},
viewOptions: {
context: {
pivot_measures: ['__count__'],
},
},
});
var $countMeasure = pivot.$buttons.find('li[data-field=__count]');
assert.ok($countMeasure.hasClass('selected'), "The count measure should be activated");
pivot.destroy();
});
});});