From 1e1a8b8a70444d11dc6c9ffae43fc75ea12b6c3a Mon Sep 17 00:00:00 2001 From: Isabelle RICHARD Date: Wed, 11 Dec 2019 09:52:33 +0100 Subject: [PATCH] [IMP] Improve aggregate sum on views list with the sum of roundings --- smile_decimal_precision/__manifest__.py | 1 + .../static/src/js/list_renderer.js | 57 +++++++++++++++++++ smile_decimal_precision/views/templates.xml | 13 +++++ 3 files changed, 71 insertions(+) create mode 100644 smile_decimal_precision/static/src/js/list_renderer.js create mode 100644 smile_decimal_precision/views/templates.xml diff --git a/smile_decimal_precision/__manifest__.py b/smile_decimal_precision/__manifest__.py index 2d9676fed..b42d6a7f5 100644 --- a/smile_decimal_precision/__manifest__.py +++ b/smile_decimal_precision/__manifest__.py @@ -18,6 +18,7 @@ "data": [ "views/decimal_precision_view.xml", "views/res_currency_view.xml", + "views/templates.xml", ], "auto_install": True, "installable": True, diff --git a/smile_decimal_precision/static/src/js/list_renderer.js b/smile_decimal_precision/static/src/js/list_renderer.js new file mode 100644 index 000000000..894245c81 --- /dev/null +++ b/smile_decimal_precision/static/src/js/list_renderer.js @@ -0,0 +1,57 @@ +odoo.define('smile_decimal_precision.ListRenderer', function (require) { + "use strict"; + +var ListRenderer = require('web.ListRenderer'); +var field_utils = require('web.field_utils'); + +ListRenderer.include({ + + _computeColumnAggregates: function (data, column) { + var attrs = column.attrs; + var field = this.state.fields[attrs.name]; + if (!field) { + return; + } + var type = field.type; + if (type !== 'integer' && type !== 'float' && type !== 'monetary') { + return; + } + var func = (attrs.sum && 'sum') || (attrs.avg && 'avg') || + (attrs.max && 'max') || (attrs.min && 'min'); + if (func) { + var count = 0; + var aggregateValue = (func === 'max') ? -Infinity : (func === 'min') ? Infinity : 0; + _.each(data, function (d) { + count += 1; + var value = (d.type === 'record') ? d.data[attrs.name] : d.aggregateValues[attrs.name]; + // Added by Smile + var formatFunc = field_utils.format[column.attrs.widget]; + if (!formatFunc) { + formatFunc = field_utils.format[field.type]; + } + value = field_utils.parse.float( + formatFunc(value, d.fields[attrs.name], {noSymbol: true})); + // End by Smile + if (func === 'avg') { + aggregateValue += value; + } else if (func === 'sum') { + aggregateValue += value; + } else if (func === 'max') { + aggregateValue = Math.max(aggregateValue, value); + } else if (func === 'min') { + aggregateValue = Math.min(aggregateValue, value); + } + }); + if (func === 'avg') { + aggregateValue = count ? aggregateValue / count : aggregateValue; + } + column.aggregate = { + help: attrs[func], + value: aggregateValue, + }; + } + }, + +}); + +}); diff --git a/smile_decimal_precision/views/templates.xml b/smile_decimal_precision/views/templates.xml new file mode 100644 index 000000000..f8d9e09d3 --- /dev/null +++ b/smile_decimal_precision/views/templates.xml @@ -0,0 +1,13 @@ + + + + + + + + +