[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) <qdp@openerp.com>
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user