From 1a4099a8dc1d902a2b416147de4c049995dcb155 Mon Sep 17 00:00:00 2001 From: tarteo Date: Fri, 8 Mar 2019 13:35:55 +0100 Subject: [PATCH] [ADD] web_group_by_percentage [ADD] web_group_by_percentage [ADD] web_group_by_percentage [FIX] Readme screenshot paths --- web_group_by_percentage/README.rst | 84 ++++++++++++++++ web_group_by_percentage/__init__.py | 0 web_group_by_percentage/__manifest__.py | 17 ++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 4 + web_group_by_percentage/readme/USAGE.rst | 4 + .../static/description/screenshot.png | Bin 0 -> 6563 bytes .../static/src/js/backend.js | 94 ++++++++++++++++++ .../static/src/scss/backend.scss | 3 + web_group_by_percentage/templates/assets.xml | 14 +++ 10 files changed, 221 insertions(+) create mode 100644 web_group_by_percentage/README.rst create mode 100644 web_group_by_percentage/__init__.py create mode 100644 web_group_by_percentage/__manifest__.py create mode 100644 web_group_by_percentage/readme/CONTRIBUTORS.rst create mode 100644 web_group_by_percentage/readme/DESCRIPTION.rst create mode 100644 web_group_by_percentage/readme/USAGE.rst create mode 100644 web_group_by_percentage/static/description/screenshot.png create mode 100644 web_group_by_percentage/static/src/js/backend.js create mode 100644 web_group_by_percentage/static/src/scss/backend.scss create mode 100644 web_group_by_percentage/templates/assets.xml diff --git a/web_group_by_percentage/README.rst b/web_group_by_percentage/README.rst new file mode 100644 index 00000000..ec71f08a --- /dev/null +++ b/web_group_by_percentage/README.rst @@ -0,0 +1,84 @@ +==================================== +Show percentage (of total) in groups +==================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/12.0/web_group_by_percentage + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-12-0/web-12-0-web_group_by_percentage + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/162/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module shows the percentage of the total sum in group by rows. + +.. image:: ../static/description/screenshot.png + :alt: Printscreen of percentages in group rows + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +To use this module, you need to: + +#. Go to any list view; +#. group by one or more fields. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Onestein + +Contributors +~~~~~~~~~~~~ + +* Dennis Sluijk + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_group_by_percentage/__init__.py b/web_group_by_percentage/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/web_group_by_percentage/__manifest__.py b/web_group_by_percentage/__manifest__.py new file mode 100644 index 00000000..44285045 --- /dev/null +++ b/web_group_by_percentage/__manifest__.py @@ -0,0 +1,17 @@ +{ + 'name': 'Show percentage (of total) in groups', + 'summary': 'Show the percentage of the total sum in group by rows', + 'author': 'Onestein, Odoo Community Association (OCA)', + 'development_status': 'Beta', + 'website': 'https://github.com/OCA/web', + 'category': 'Web', + 'license': 'AGPL-3', + 'version': '12.0.1.0.0', + 'depends': [ + 'web', + ], + 'data': [ + 'templates/assets.xml' + ], + 'installable': True, +} diff --git a/web_group_by_percentage/readme/CONTRIBUTORS.rst b/web_group_by_percentage/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..47b6403d --- /dev/null +++ b/web_group_by_percentage/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Dennis Sluijk diff --git a/web_group_by_percentage/readme/DESCRIPTION.rst b/web_group_by_percentage/readme/DESCRIPTION.rst new file mode 100644 index 00000000..d8d3c20b --- /dev/null +++ b/web_group_by_percentage/readme/DESCRIPTION.rst @@ -0,0 +1,4 @@ +This module shows the percentage of the total sum in group by rows. + +.. image:: ../static/description/screenshot.png + :alt: Printscreen of percentages in group rows diff --git a/web_group_by_percentage/readme/USAGE.rst b/web_group_by_percentage/readme/USAGE.rst new file mode 100644 index 00000000..e46283a9 --- /dev/null +++ b/web_group_by_percentage/readme/USAGE.rst @@ -0,0 +1,4 @@ +To use this module, you need to: + +#. Go to any list view; +#. group by one or more fields. diff --git a/web_group_by_percentage/static/description/screenshot.png b/web_group_by_percentage/static/description/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..cf3abdce885bfacee3cfa5faf597cca2f46c7757 GIT binary patch literal 6563 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 PvjCLkHRP(_S$_IAOjo%} literal 0 HcmV?d00001 diff --git a/web_group_by_percentage/static/src/js/backend.js b/web_group_by_percentage/static/src/js/backend.js new file mode 100644 index 00000000..dd38a533 --- /dev/null +++ b/web_group_by_percentage/static/src/js/backend.js @@ -0,0 +1,94 @@ +/* Copyright 2019 Onestein + * License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). */ + +odoo.define('web_group_by_percentage', function (require) { + "use strict"; + + var ListRenderer = require('web.ListRenderer'), + BasicModel = require('web.BasicModel'); + + ListRenderer.include({ + /** + * Render the percentage to the group row. + * + * @override + */ + _renderGroupRow: function (group) { + var self = this; + var res = this._super.apply(this, arguments); + _.each(group.aggregatePercentages, function (percentage, field) { + var cellIndex = _.findIndex(self.columns, function (column) { + if (field === column.attrs.name) { + return true; + } + }); + + var $cell = $(res.find('td').get(cellIndex - 1)); + var $b = $('') + .addClass('web_group_by_percentage') + .html(_.str.sprintf('%s%% ', percentage.toFixed(2))) + .data('percentage', percentage); + $cell.prepend($b); + }); + return res; + }, + }); + + BasicModel.include({ + /** + * Adds aggregatePercentages to the result. + * + * @override + */ + get: function () { + var result = this._super.apply(this, arguments), + dp = result && this.localData[result.id]; + if (dp) { + if (dp.aggregatePercentages) { + result.aggregatePercentages = $.extend({}, dp.aggregatePercentages); + } + } + return result; + }, + + /** + * Calculate percentages. + * + * @override + */ + _readGroup: function () { + var self = this, + res = this._super.apply(this, arguments); + res.done(function (list) { + // Calculate totals + var sums = {}; + _.each(list.data, function (groupId) { + var group = self.get(groupId); + _.each(group.aggregateValues, function (value, field) { + if (!(field in sums)) { + sums[field] = 0; + } + sums[field] += value; + }); + }); + + // Calculate percentages + _.each(list.data, function (groupId) { + var group = self.get(groupId), + aggregatePercentages = {}; + _.each(_.keys(sums), function (field) { + var percentage = 0; + if (sums[field]) { + percentage = (group.aggregateValues[field] / sums[field]) * 100; + } + aggregatePercentages[field] = percentage; + }); + var dp = self.localData[groupId]; + dp.aggregatePercentages = aggregatePercentages; + }); + return list; + }); + return res; + }, + }); +}); diff --git a/web_group_by_percentage/static/src/scss/backend.scss b/web_group_by_percentage/static/src/scss/backend.scss new file mode 100644 index 00000000..60215903 --- /dev/null +++ b/web_group_by_percentage/static/src/scss/backend.scss @@ -0,0 +1,3 @@ +.web_group_by_percentage { + font-weight: bold; +} diff --git a/web_group_by_percentage/templates/assets.xml b/web_group_by_percentage/templates/assets.xml new file mode 100644 index 00000000..89be0949 --- /dev/null +++ b/web_group_by_percentage/templates/assets.xml @@ -0,0 +1,14 @@ + + + + + +