From e9f21c9583384a5fb02eb63ab38cd214c657e1b8 Mon Sep 17 00:00:00 2001 From: abderraouf Date: Tue, 19 Apr 2022 12:47:31 +0000 Subject: [PATCH] [FIX] project : average rating is wrong in tasks analysis Before this commit: - Join between task and rating is made on parent_res_id - Displayed value is the sum of tasks average_rating - No Unit test to cover this case - Measure displayed when customer rating setting is not active - [Demo data] Each task is rated one time so average_rating and last_rating are the same After this commit: - Join is made on res_id which is the task_id - Displayed value is the avg of tasks average_rating - Unit test added to cover mesaures calculation - Measure dusplayed only when setting active - New demo record added to let average_rating be different from last_rating closes odoo/odoo#89764 X-original-commit: 3a5d816ef26a164fc38965154e38b45e33f9a81e Signed-off-by: Laurent Stukkens (ltu) Signed-off-by: Xavier --- addons/project/report/project_report.py | 4 +-- addons/project/tests/__init__.py | 1 + addons/project/tests/test_project_report.py | 40 +++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 addons/project/tests/test_project_report.py diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py index 96d889f602f..3c304d73464 100644 --- a/addons/project/report/project_report.py +++ b/addons/project/report/project_report.py @@ -31,7 +31,7 @@ class ReportProjectTaskUser(models.Model): working_hours_open = fields.Float(string='Working Hours to Assign', digits=(16, 2), readonly=True, group_operator="avg", help="Number of Working Hours to open the task") working_hours_close = fields.Float(string='Working Hours to Close', digits=(16, 2), readonly=True, group_operator="avg", help="Number of Working Hours to close the task") rating_last_value = fields.Float('Rating Value (/5)', group_operator="avg", readonly=True, groups="project.group_project_rating") - rating_avg = fields.Float('Average Rating', readonly=True) + rating_avg = fields.Float('Average Rating', readonly=True, group_operator='avg', groups="project.group_project_rating") priority = fields.Selection([ ('0', 'Low'), ('1', 'High') @@ -110,7 +110,7 @@ class ReportProjectTaskUser(models.Model): return f""" project_task t LEFT JOIN project_task_user_rel tu on t.id=tu.task_id - LEFT JOIN rating_rating rt ON rt.parent_res_id = t.id + LEFT JOIN rating_rating rt ON rt.res_id = t.id AND rt.res_model = 'project.task' AND rt.consumed = True AND rt.rating >= {RATING_LIMIT_MIN} diff --git a/addons/project/tests/__init__.py b/addons/project/tests/__init__.py index 7ec177dccbe..5a27c35173e 100644 --- a/addons/project/tests/__init__.py +++ b/addons/project/tests/__init__.py @@ -21,3 +21,4 @@ from . import test_personal_stages from . import test_task_dependencies from . import test_task_follow from . import test_task_tracking +from . import test_project_report diff --git a/addons/project/tests/test_project_report.py b/addons/project/tests/test_project_report.py new file mode 100644 index 00000000000..8fd2006d44c --- /dev/null +++ b/addons/project/tests/test_project_report.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.tests import tagged +from .test_project_base import TestProjectCommon + +@tagged('post_install', '-at_install') +class TestProjectReport(TestProjectCommon): + def test_avg_rating_measure(self): + rating_vals = { + 'res_model_id': self.env['ir.model']._get('project.task').id, + 'rated_partner_id': self.partner_1.id, + 'partner_id': self.partner_1.id, + 'consumed': True, + } + self.env['rating.rating'].create([ + {**rating_vals, 'rating': 5, 'res_id': self.task_1.id}, + {**rating_vals, 'rating': 4, 'res_id': self.task_1.id}, + {**rating_vals, 'rating': 4.25, 'res_id': self.task_2.id}, + ]) + self.assertEqual(self.task_1.rating_avg, 4.5) + self.assertEqual(self.task_1.rating_last_value, 5.0) + + self.assertEqual(self.task_2.rating_avg, 4.25) + self.assertEqual(self.task_2.rating_last_value, 4.25) + + task_3 = self.env['project.task'].create({ + 'name': 'task 3', + 'project_id': self.project_pigs.id, + 'partner_id': self.partner_1.id, + 'user_ids': self.task_1.user_ids, + }) + self.assertEqual(task_3.rating_avg, 0) + self.assertEqual(task_3.rating_last_value, 0) + + tasks = [self.task_1, self.task_2, task_3] + for task in tasks: + rating_values = task.read(['rating_avg', 'rating_last_value'])[0] + task_report = self.env['report.project.task.user'].search_read([('project_id', '=', self.project_pigs.id), ('task_id', '=', task.id)], ['rating_avg', 'rating_last_value'])[0] + self.assertDictEqual(task_report, rating_values, 'The rating average and the last rating value for the task 1 should be the same in the report and on the task.')