Merge PR #1565 into 12.0

Signed-off-by pedrobaeza
pull/1579/head
OCA-git-bot 2020-04-15 07:23:15 +00:00
commit f9dfffbb6d
1 changed files with 71 additions and 20 deletions

View File

@ -6,6 +6,7 @@ odoo.define('web_pivot_computed_measure.PivotModel', function (require) {
var core = require('web.core'); var core = require('web.core');
var PivotModel = require('web.PivotModel'); var PivotModel = require('web.PivotModel');
var ComparisonUtils = require('web.dataComparisonUtils');
var _t = core._t; var _t = core._t;
@ -102,6 +103,35 @@ odoo.define('web_pivot_computed_measure.PivotModel', function (require) {
return _.contains(this.data.measures, field); return _.contains(this.data.measures, field);
}, },
/**
* Helper function to add computed measure fields data into 'dataPoint'
*
* @param {Object} dataPoint
* @param {Object} dataPointComp
*/
_fillComputedMeasuresData: function (dataPoint, dataPointComp) {
var self = this;
_.each(this._computed_measures, function (cm) {
if (!self._isMeasureEnabled(cm.id)) {
return;
}
if (dataPointComp) {
var resData =
py.eval(cm.operation, dataPointComp.data);
var resComparison =
py.eval(cm.operation, dataPointComp.comparison);
dataPoint[cm.id] = {
data: resData,
comparisonData: resComparison,
variation: ComparisonUtils.computeVariation(
resData, resComparison),
};
} else {
dataPoint[cm.id] = py.eval(cm.operation, dataPoint);
}
});
},
/** /**
* Fill the dataPoints with the computed measures values * Fill the dataPoints with the computed measures values
* *
@ -109,22 +139,43 @@ odoo.define('web_pivot_computed_measure.PivotModel', function (require) {
*/ */
_mergeData: function (data, comparisonData, groupBys) { _mergeData: function (data, comparisonData, groupBys) {
var res = this._super.apply(this, arguments); var res = this._super.apply(this, arguments);
var l = groupBys.length; // Cached loop (This is not python! hehe) var len = groupBys.length; // Cached loop (This is not python! hehe)
for (var index = 0; index < l; ++index) { for (var index = 0; index < len; ++index) {
if (data.length) { if (res.length) {
var l2 = data[index].length; var len2 = res[index].length;
for (var k = 0; k < l2; ++k) { for (var k = 0; k < len2; ++k) {
var dataPoint = data[index][k]; var dataPoint = res[index][k];
if (_.isEmpty(dataPoint)) { if (_.isEmpty(dataPoint)) {
break; break;
} }
var l3 = this._computed_measures.length; if ('__comparisonDomain' in dataPoint) {
for (var x = 0; x < l3; ++x) { // Transform comparison dataPoint object to be compatible
var cm = this._computed_measures[x]; var pairsDataPoint = _.pairs(dataPoint);
if (!this._isMeasureEnabled(cm.id)) { var dataPointComp = {
continue; data: _.object(_.map(
} pairsDataPoint, (item) => {
dataPoint[cm.id] = py.eval(cm.operation, dataPoint); return [
item[0],
item[1] && item[1].data,
];
})),
comparison: _.object(_.map(
pairsDataPoint, (item) => {
return [
item[0],
item[1] && item[1].comparisonData,
];
})),
};
// Update datas. Required by computed measures that uses
// other computed measures to work
this._fillComputedMeasuresData(dataPointComp.data);
this._fillComputedMeasuresData(dataPointComp.comparison);
// Update comparison dataPoint
this._fillComputedMeasuresData(dataPoint, dataPointComp);
} else {
// Update standard dataPoint
this._fillComputedMeasuresData(dataPoint);
} }
} }
} }