144 lines
4.1 KiB
JavaScript
Executable File
144 lines
4.1 KiB
JavaScript
Executable File
odoo.define('web_cohort.CohortModel', function (require) {
|
|
'use strict';
|
|
|
|
var AbstractModel = require('web.AbstractModel');
|
|
|
|
var CohortModel = AbstractModel.extend({
|
|
//--------------------------------------------------------------------------
|
|
// Public
|
|
//--------------------------------------------------------------------------
|
|
|
|
/**
|
|
* @override
|
|
* @returns {Object}
|
|
*/
|
|
__get: function () {
|
|
const { rangeDescription, comparisonRangeDescription } = this.timeRanges;
|
|
return Object.assign({}, this.data, {
|
|
hasContent: !this._isEmpty(),
|
|
isSample: this.isSampleModel,
|
|
rangeDescription,
|
|
comparisonRangeDescription
|
|
});
|
|
},
|
|
/**
|
|
* @override
|
|
* @param {Object} params
|
|
* @param {string} params.modelName
|
|
* @param {string} params.dateStart
|
|
* @param {string} params.dateStop
|
|
* @param {string} params.measure
|
|
* @param {string} params.interval
|
|
* @param {Array[]} params.domain
|
|
* @param {string} params.mode
|
|
* @param {string} params.timeline
|
|
* @param {Object} params.timeRanges
|
|
* @returns {Promise}
|
|
*/
|
|
__load: function (params) {
|
|
this.modelName = params.modelName;
|
|
this.dateStart = params.dateStart;
|
|
this.dateStop = params.dateStop;
|
|
this.measure = params.measure;
|
|
this.interval = params.interval;
|
|
this.domain = params.domain;
|
|
this.mode = params.mode;
|
|
this.timeline = params.timeline;
|
|
this.data = {
|
|
measure: this.measure,
|
|
interval: this.interval,
|
|
};
|
|
this.context = params.context;
|
|
this.timeRanges = params.timeRanges;
|
|
return this._fetchData();
|
|
},
|
|
/**
|
|
* Reload data.
|
|
*
|
|
* @param {any} handle
|
|
* @param {Object} params
|
|
* @param {string} [params.measure]
|
|
* @param {string} [params.interval]
|
|
* @param {Array[]} [params.domain]
|
|
* @param {Object} [params.timeRanges]
|
|
* @returns {Promise}
|
|
*/
|
|
__reload: function (handle, params) {
|
|
if ('measure' in params) {
|
|
this.data.measure = params.measure;
|
|
}
|
|
if ('interval' in params) {
|
|
this.data.interval = params.interval;
|
|
}
|
|
if ('domain' in params) {
|
|
this.domain = params.domain;
|
|
}
|
|
if ('timeRanges' in params) {
|
|
this.timeRanges = params.timeRanges;
|
|
}
|
|
return this._fetchData();
|
|
},
|
|
|
|
//--------------------------------------------------------------------------
|
|
// Private
|
|
//--------------------------------------------------------------------------
|
|
|
|
/**
|
|
* Fetch cohort data.
|
|
*
|
|
* @private
|
|
* @returns {Promise}
|
|
*/
|
|
_fetchData: function () {
|
|
const domains = this._getDomains();
|
|
const proms = domains.map(domain => {
|
|
return this._rpc({
|
|
model: this.modelName,
|
|
method: 'get_cohort_data',
|
|
kwargs: {
|
|
date_start: this.dateStart,
|
|
date_stop: this.dateStop,
|
|
measure: this.data.measure,
|
|
interval: this.data.interval,
|
|
domain: domain,
|
|
mode: this.mode,
|
|
timeline: this.timeline,
|
|
context: this.context
|
|
}
|
|
});
|
|
});
|
|
return Promise.all(proms).then(([report, comparisonReport]) => {
|
|
this.data.report = report;
|
|
this.data.comparisonReport = comparisonReport;
|
|
});
|
|
},
|
|
/**
|
|
* @private
|
|
* @returns {Array[]}
|
|
*/
|
|
_getDomains: function () {
|
|
const { range, comparisonRange } = this.timeRanges;
|
|
if (!range) {
|
|
return [this.domain];
|
|
}
|
|
return [
|
|
this.domain.concat(range),
|
|
this.domain.concat(comparisonRange),
|
|
];
|
|
},
|
|
/**
|
|
* @override
|
|
*/
|
|
_isEmpty() {
|
|
let rowCount = this.data.report.rows.length;
|
|
if (this.data.comparisonReport) {
|
|
rowCount += this.data.comparisonReport.rows.length;
|
|
}
|
|
return rowCount === 0;
|
|
},
|
|
});
|
|
|
|
return CohortModel;
|
|
|
|
});
|