summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwan <wan@odoo.com>2020-08-31 07:42:47 +0000
committerwan <wan@odoo.com>2020-09-01 07:58:14 +0000
commitb0e0035b585f976e912e97e7f95f66b525bc8e43 (patch)
tree8de172cee94e386ce5d18ad0f38c0e6ef6545ce4
parentff26e093c98a5b933620642e242530a8931c1471 (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.py9
-rw-r--r--addons/account/models/partner.py6
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: