From 225af5eb84d7da928edae7a169fcd19b2016e89a Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Tue, 5 Sep 2023 15:04:11 +0200 Subject: [PATCH] [FIX] sale_project, sale_timesheet: fix the SQL mess of _get_sale_order_items_query() closes odoo/odoo#134677 Related: odoo/enterprise#47759 Signed-off-by: Raphael Collet --- addons/sale_project/models/project.py | 18 +++++++++--------- addons/sale_timesheet/models/project.py | 14 +++++++------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/sale_project/models/project.py b/addons/sale_project/models/project.py index 90ffd9ed39d..4ddc74a0f72 100755 --- a/addons/sale_project/models/project.py +++ b/addons/sale_project/models/project.py @@ -8,12 +8,11 @@ from datetime import date from odoo import api, fields, models, _, _lt from odoo.exceptions import ValidationError, AccessError from odoo.osv import expression -from odoo.tools import Query - -from functools import reduce +from odoo.tools import Query, SQL from odoo.addons.project.models.project_task import CLOSED_STATES + class Project(models.Model): _inherit = 'project.project' @@ -296,7 +295,7 @@ class Project(models.Model): ]) project_query = self.env['project.project']._where_calc(project_domain) self._apply_ir_rules(project_query, 'read') - project_query_str, project_params = project_query.select('id', 'sale_line_id') + project_sql = project_query.select('id', 'sale_line_id') Task = self.env['project.task'] task_domain = [('project_id', 'in', self.ids), ('sale_line_id', '!=', False)] @@ -307,7 +306,7 @@ class Project(models.Model): ]) task_query = Task._where_calc(task_domain) Task._apply_ir_rules(task_query, 'read') - task_query_str, task_params = task_query.select(f'{Task._table}.project_id AS id', f'{Task._table}.sale_line_id') + task_sql = task_query.select(f'{Task._table}.project_id AS id', f'{Task._table}.sale_line_id') ProjectMilestone = self.env['project.milestone'] milestone_domain = [('project_id', 'in', self.ids), ('allow_billable', '=', True), ('sale_line_id', '!=', False)] @@ -319,7 +318,7 @@ class Project(models.Model): ]) milestone_query = ProjectMilestone._where_calc(milestone_domain) ProjectMilestone._apply_ir_rules(milestone_query) - milestone_query_str, milestone_params = milestone_query.select( + milestone_sql = milestone_query.select( f'{ProjectMilestone._table}.project_id AS id', f'{ProjectMilestone._table}.sale_line_id', ) @@ -327,13 +326,14 @@ class Project(models.Model): SaleOrderLine = self.env['sale.order.line'] sale_order_line_domain = [('order_id', 'any', [('analytic_account_id', 'in', self.analytic_account_id.ids)])] sale_order_line_query = SaleOrderLine._where_calc(sale_order_line_domain) - sale_order_line_query_str, sale_order_line_query_params = sale_order_line_query.select( + sale_order_line_sql = sale_order_line_query.select( f'{SaleOrderLine._table}.project_id AS id', f'{SaleOrderLine._table}.id AS sale_line_id', ) - query = Query(self._cr, 'project_sale_order_item', ' UNION '.join([project_query_str, task_query_str, milestone_query_str, sale_order_line_query_str])) - query._where_params = project_params + task_params + milestone_params + sale_order_line_query_params + query = Query(self._cr, 'project_sale_order_item', SQL('(%s)', SQL(' UNION ').join([ + project_sql, task_sql, milestone_sql, sale_order_line_sql, + ]))) return query def get_panel_data(self): diff --git a/addons/sale_timesheet/models/project.py b/addons/sale_timesheet/models/project.py index b45bdbb4d32..c8dd3f1ca7e 100644 --- a/addons/sale_timesheet/models/project.py +++ b/addons/sale_timesheet/models/project.py @@ -7,6 +7,7 @@ from collections import defaultdict from odoo import api, fields, models, _, _lt from odoo.osv import expression +from odoo.tools import SQL from odoo.exceptions import ValidationError, UserError # YTI PLEASE SPLIT ME @@ -327,7 +328,7 @@ class Project(models.Model): ]) timesheet_query = Timesheet._where_calc(timesheet_domain) Timesheet._apply_ir_rules(timesheet_query, 'read') - timesheet_query_str, timesheet_params = timesheet_query.select( + timesheet_sql = timesheet_query.select( f'{Timesheet._table}.project_id AS id', f'{Timesheet._table}.so_line AS sale_line_id', ) @@ -341,17 +342,16 @@ class Project(models.Model): ]) employee_mapping_query = EmployeeMapping._where_calc(employee_mapping_domain) EmployeeMapping._apply_ir_rules(employee_mapping_query, 'read') - employee_mapping_query_str, employee_mapping_params = employee_mapping_query.select( + employee_mapping_sql = employee_mapping_query.select( f'{EmployeeMapping._table}.project_id AS id', f'{EmployeeMapping._table}.sale_line_id', ) - query._tables['project_sale_order_item'] = ' UNION '.join([ + query._tables['project_sale_order_item'] = SQL('(%s)', SQL(' UNION ').join([ query._tables['project_sale_order_item'], - timesheet_query_str, - employee_mapping_query_str, - ]) - query._where_params += timesheet_params + employee_mapping_params + timesheet_sql, + employee_mapping_sql, + ])) return query def _get_profitability_labels(self):