diff options
| author | wan <wan@odoo.com> | 2020-08-31 07:42:47 +0000 |
|---|---|---|
| committer | wan <wan@odoo.com> | 2020-09-01 07:58:14 +0000 |
| commit | b0e0035b585f976e912e97e7f95f66b525bc8e43 (patch) | |
| tree | 8de172cee94e386ce5d18ad0f38c0e6ef6545ce4 | |
| parent | ff26e093c98a5b933620642e242530a8931c1471 (diff) | |
[IMP] account: reduce number of queries of customer/supplier rank
By counting the number of customers/suppliers before doing the query and
updating all at once, we can reduce the number of queries done quite a
lot for big batches of invoices.
closes odoo/odoo#56829
Signed-off-by: Quentin De Paoli (qdp) <qdp@openerp.com>
Signed-off-by: wan <william-andre@users.noreply.github.com>
| -rw-r--r-- | addons/account/models/account_move.py | 9 | ||||
| -rw-r--r-- | addons/account/models/partner.py | 6 |
2 files changed, 10 insertions, 5 deletions
diff --git a/addons/account/models/account_move.py b/addons/account/models/account_move.py index 77e94d25009..dd28b712f8b 100644 --- a/addons/account/models/account_move.py +++ b/addons/account/models/account_move.py @@ -2403,11 +2403,16 @@ class AccountMove(models.Model): user_id=move.journal_id.sale_activity_user_id.id or move.invoice_user_id.id, ) + customer_count, supplier_count = defaultdict(int), defaultdict(int) for move in to_post: if move.is_sale_document(): - move.partner_id._increase_rank('customer_rank') + customer_count[move.partner_id] += 1 elif move.is_purchase_document(): - move.partner_id._increase_rank('supplier_rank') + supplier_count[move.partner_id] += 1 + for partner, count in customer_count.items(): + partner._increase_rank('customer_rank', count) + for partner, count in supplier_count.items(): + partner._increase_rank('supplier_rank', count) # Trigger action for paid invoices in amount is zero to_post.filtered( diff --git a/addons/account/models/partner.py b/addons/account/models/partner.py index 160536e4849..98adb41cb91 100644 --- a/addons/account/models/partner.py +++ b/addons/account/models/partner.py @@ -492,16 +492,16 @@ class ResPartner(models.Model): vals['supplier_rank'] = 1 return super().create(vals_list) - def _increase_rank(self, field): + def _increase_rank(self, field, n=1): if self.ids and field in ['customer_rank', 'supplier_rank']: try: with self.env.cr.savepoint(flush=False): query = sql.SQL(""" SELECT {field} FROM res_partner WHERE ID IN %(partner_ids)s FOR UPDATE NOWAIT; - UPDATE res_partner SET {field} = {field} + 1 + UPDATE res_partner SET {field} = {field} + %(n)s WHERE id IN %(partner_ids)s """).format(field=sql.Identifier(field)) - self.env.cr.execute(query, {'partner_ids': tuple(self.ids)}) + self.env.cr.execute(query, {'partner_ids': tuple(self.ids), 'n': n}) for partner in self: self.env.cache.remove(partner, partner._fields[field]) except DatabaseError as e: |
