diff --git a/addons/project/models/project.py b/addons/project/models/project.py index 90c88841b06..356193b8985 100644 --- a/addons/project/models/project.py +++ b/addons/project/models/project.py @@ -158,15 +158,21 @@ class Project(models.Model): return self.env['ir.config_parameter'].sudo().get_param('project.rating_status_period') or 'monthly' def _compute_attached_docs_count(self): - Attachment = self.env['ir.attachment'] + self.env.cr.execute( + """ + SELECT coalesce(task.project_id, project.id), count(*) + FROM ir_attachment attachment + LEFT JOIN project_task task ON attachment.res_model = 'project.task' AND task.id = attachment.res_id + LEFT JOIN project_project project ON attachment.res_model = 'project.project' AND project.id = attachment.res_id + WHERE project.id IN %(project_ids)s + OR task.project_id IN %(project_ids)s + GROUP BY coalesce(task.project_id, project.id) + """, + {"project_ids": tuple(self.ids)} + ) + docs_count = dict(self.env.cr.fetchall()) for project in self: - project.doc_count = Attachment.search_count([ - '|', - '&', - ('res_model', '=', 'project.project'), ('res_id', '=', project.id), - '&', - ('res_model', '=', 'project.task'), ('res_id', 'in', project.task_ids.ids) - ]) + project.doc_count = docs_count.get(project.id, 0) def _compute_task_count(self): task_data = self.env['project.task'].read_group(