From d604deccee4c605cd07c70eda8aa76ad8923b381 Mon Sep 17 00:00:00 2001 From: qdp-odoo Date: Thu, 5 Sep 2019 13:29:35 +0000 Subject: [PATCH] [IMP] account: speedup of the aged partner balance Removed a browse on partners made in a loop, for a substantial gain of time and DB queries. Observed gain for a real data DB with 500 partners to print in the aged report: time (ms) # queries Before patch 4583 1623 After patch 2932 553 Gain 1651 (36%) 1070 (66%) closes odoo/odoo#36488 Signed-off-by: Quentin De Paoli (qdp) --- .../report/account_aged_partner_balance.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/addons/account/report/account_aged_partner_balance.py b/addons/account/report/account_aged_partner_balance.py index b58d0c6376f..0b678992f25 100644 --- a/addons/account/report/account_aged_partner_balance.py +++ b/addons/account/report/account_aged_partner_balance.py @@ -7,7 +7,6 @@ from odoo.tools import float_is_zero from datetime import datetime from dateutil.relativedelta import relativedelta - class ReportAgedPartnerBalance(models.AbstractModel): _name = 'report.account.report_agedpartnerbalance' @@ -70,9 +69,13 @@ class ReportAgedPartnerBalance(models.AbstractModel): partner_ids = self.env['res.partner'].search([('category_id', 'in', ctx['partner_categories'].ids)]).ids arg_list += (tuple(partner_ids or [0]),) arg_list += (date_from, tuple(company_ids)) + query = ''' - SELECT DISTINCT l.partner_id, UPPER(res_partner.name) - FROM account_move_line AS l left join res_partner on l.partner_id = res_partner.id, account_account, account_move am + SELECT DISTINCT l.partner_id, res_partner.name AS name, UPPER(res_partner.name) AS UPNAME, CASE WHEN prop.value_text IS NULL THEN 'normal' ELSE prop.value_text END AS trust + FROM account_move_line AS l + LEFT JOIN res_partner ON l.partner_id = res_partner.id + LEFT JOIN ir_property prop ON (prop.res_id = 'res.partner,'||res_partner.id AND prop.name='trust' AND prop.company_id=%s), + account_account, account_move am WHERE (l.account_id = account_account.id) AND (l.move_id = am.id) AND (am.state IN %s) @@ -81,6 +84,7 @@ class ReportAgedPartnerBalance(models.AbstractModel): AND (l.date <= %s) AND l.company_id IN %s ORDER BY UPPER(res_partner.name)''' + arg_list = (self.env.company.id,) + arg_list cr.execute(query, arg_list) partners = cr.dictfetchall() @@ -211,21 +215,18 @@ class ReportAgedPartnerBalance(models.AbstractModel): if not float_is_zero(values[str(i)], precision_rounding=self.env.company.currency_id.rounding): at_least_one_amount = True values['total'] = sum([values['direction']] + [values[str(i)] for i in range(5)]) - ## Add for total + # Add for total total[(i + 1)] += values['total'] values['partner_id'] = partner['partner_id'] if partner['partner_id']: - #browse the partner name and trust field in sudo, as we may not have full access to the record (but we still have to see it in the report) - browsed_partner = self.env['res.partner'].sudo().browse(partner['partner_id']) - values['name'] = browsed_partner.name and len(browsed_partner.name) >= 45 and browsed_partner.name[0:40] + '...' or browsed_partner.name - values['trust'] = browsed_partner.trust + values['name'] = len(partner['name']) >= 45 and partner['name'][0:40] + '...' or partner['name'] + values['trust'] = partner['trust'] else: values['name'] = _('Unknown Partner') values['trust'] = False if at_least_one_amount or (self._context.get('include_nullified_amount') and lines[partner['partner_id']]): res.append(values) - return res, total, lines @api.model