[FIX] project: fix traceback when opening customer rating view

If a project had a single rating associated to its tasks, opening the
customer rating view would create a traceback. This happened because
both the mail.thread model and the rating.parent.mixin model have a
rating_ids field, and project inherits from both of them (mail.thread
on its own doesn't have it, but the rating mixin adds it).
In the action_view_all_rating method, we try to access the first element of the
rating_ids recordset, if the rating_count field is equal to 1. But since
the rating_ids field belonged to the mail.thread mixin, and not to
the rating.parent.mixin, there could be occurences where rating_count was equal
to 1 while the recordset was actually empty ; accessing the first element of the
recordset would then create a traceback.

To fix this, the rating.parent.mixin model was put before the
mail.thread model in the _inherit list, this way the rating_ids field
from rating.parent.mixin has the priority. A test was also added to check
if the rating_ids is working correctly.

task-3360029

closes odoo/odoo#127243

X-original-commit: 1039c80a8ff5e219e9c2679505015288c8d8dd35
Signed-off-by: Xavier Bol (xbo) <xbo@odoo.com>
This commit is contained in:
dise
2023-07-04 16:41:08 +02:00
parent 328f0ec84c
commit 51f8d2a7e8
2 changed files with 17 additions and 1 deletions
+1 -1
View File
@@ -16,7 +16,7 @@ from .project_task import CLOSED_STATES
class Project(models.Model):
_name = "project.project"
_description = "Project"
_inherit = ['portal.mixin', 'mail.alias.mixin', 'mail.thread', 'mail.activity.mixin', 'rating.parent.mixin']
_inherit = ['portal.mixin', 'mail.alias.mixin', 'rating.parent.mixin', 'mail.thread', 'mail.activity.mixin']
_order = "sequence, name, id"
_rating_satisfaction_days = 30 # takes 30 days by default
_check_company_auto = True
+16
View File
@@ -226,3 +226,19 @@ class TestProjectBase(TestProjectCommon):
self.assertEqual(ProjectTask.search([('project_root_id', '=?', project.id)]), tasks)
self.assertEqual(ProjectTask.search([('project_root_id', 'not in', other_projects.ids), ('id', 'in', tasks.ids)]), tasks)
self.assertEqual(ProjectTask.search([('project_root_id', '!=', self.project_pigs.id), ('id', 'in', tasks.ids)]), tasks)
def test_add_customer_rating_project(self):
""" Tests that the rating_ids field contains a rating once created
"""
rate = self.env['rating.rating'].create({
'res_id': self.task_1.id,
'parent_res_id': self.project_pigs.id,
'res_model_id': self.env['ir.model']._get('project.task').id,
'parent_res_model_id': self.env['ir.model']._get('project.project').id,
})
rating = 5
self.task_1.rating_apply(rating, token=rate.access_token)
self.project_pigs.rating_ids.invalidate_recordset()
self.assertEqual(len(self.project_pigs.rating_ids), 1, "There should be 1 rating linked to the project")