[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 <rco@odoo.com>
This commit is contained in:
Raphael Collet
2023-09-27 03:01:45 +00:00
parent 2f2deeb35f
commit 225af5eb84
2 changed files with 16 additions and 16 deletions
+9 -9
View File
@@ -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):
+7 -7
View File
@@ -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):