From 9355631e89e76cf0d3be5aa2e7b2dfaf1e4014d2 Mon Sep 17 00:00:00 2001 From: Noe Antoine Date: Fri, 28 Jan 2022 09:32:13 +0000 Subject: [PATCH] [FIX][IMP] portal_rating: round decimal ratings to two decimals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When hovering the number of stars of a course in front-end, for instance, one can see "4,16666666666667 stars on 5". This is not very convenient. The number is rounded up to two decimals instead. -> "4,17 stars on 5". Same fix is done in backend in slides-specific kanban view of ratings. Value is now rounded. Finally _rating_get_repartition is fixed round values to the nearest half value. We generally receive integer values between 0 and 5 but other values may exist. Getting a repartition rounded at nearest half integer is sufficient notably when looking at star-based display which covers only complete or half complete stars. Task-2728564 Part-of: odoo/odoo#82792 Co-authored-by: Noé Antoine Co-authored-by: Thibault Delavallée --- addons/portal_rating/static/src/js/portal_chatter.js | 5 +++-- addons/portal_rating/static/src/xml/portal_tools.xml | 5 ++++- addons/rating/models/rating_mixin.py | 10 ++++++---- addons/website_slides/views/rating_rating_views.xml | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/addons/portal_rating/static/src/js/portal_chatter.js b/addons/portal_rating/static/src/js/portal_chatter.js index 450b52be20a..d9107a2b24c 100644 --- a/addons/portal_rating/static/src/js/portal_chatter.js +++ b/addons/portal_rating/static/src/js/portal_chatter.js @@ -138,13 +138,14 @@ PortalChatter.include({ if (!result['rating_stats']) { return; } + const self = this; const ratingData = { 'avg': Math.round(result['rating_stats']['avg'] * 100) / 100, 'percent': [], }; - _.each(_.keys(result['rating_stats']['percent']).reverse(), function (rating) { + _.each(_.sortBy(_.keys(result['rating_stats']['percent'])).reverse(), function (rating) { ratingData['percent'].push({ - 'num': rating, + 'num': self.roundToHalf(rating), 'percent': utils.round_precision(result['rating_stats']['percent'][rating], 0.01), }); }); diff --git a/addons/portal_rating/static/src/xml/portal_tools.xml b/addons/portal_rating/static/src/xml/portal_tools.xml index c52e4ab33c6..1b38cadf85c 100644 --- a/addons/portal_rating/static/src/xml/portal_tools.xml +++ b/addons/portal_rating/static/src/xml/portal_tools.xml @@ -4,7 +4,10 @@ -
+
diff --git a/addons/rating/models/rating_mixin.py b/addons/rating/models/rating_mixin.py index 2b8ec44136d..3018e28762b 100644 --- a/addons/rating/models/rating_mixin.py +++ b/addons/rating/models/rating_mixin.py @@ -6,7 +6,7 @@ import operator from odoo import api, fields, models, tools from odoo.addons.rating.models import rating_data from odoo.osv import expression -from odoo.tools.float_utils import float_compare +from odoo.tools.float_utils import float_compare, float_round class RatingMixin(models.AbstractModel): @@ -224,17 +224,19 @@ class RatingMixin(models.AbstractModel): base_domain = expression.AND([self._rating_domain(), [('rating', '>=', 1)]]) if domain: base_domain += domain - data = self.env['rating.rating'].read_group(base_domain, ['rating'], ['rating', 'res_id']) + rg_data = self.env['rating.rating'].read_group(base_domain, ['rating'], ['rating', 'res_id']) # init dict with all posible rate value, except 0 (no value for the rating) values = dict.fromkeys(range(1, 6), 0) - values.update((d['rating'], d['rating_count']) for d in data) + for rating_rg in rg_data: + rating_val_round = float_round(rating_rg['rating'], precision_digits=1) + values[rating_val_round] = values.get(rating_val_round, 0) + rating_rg['rating_count'] # add other stats if add_stats: rating_number = sum(values.values()) result = { 'repartition': values, 'avg': sum(float(key * values[key]) for key in values) / rating_number if rating_number > 0 else 0, - 'total': sum(it['rating_count'] for it in data), + 'total': sum(it['rating_count'] for it in rg_data), } return result return values diff --git a/addons/website_slides/views/rating_rating_views.xml b/addons/website_slides/views/rating_rating_views.xml index 247e0eed7c9..e94addc7d59 100644 --- a/addons/website_slides/views/rating_rating_views.xml +++ b/addons/website_slides/views/rating_rating_views.xml @@ -12,7 +12,7 @@ - +