diff --git a/addons/account/models/partner.py b/addons/account/models/partner.py index 114afa929d0..21621cb17b1 100644 --- a/addons/account/models/partner.py +++ b/addons/account/models/partner.py @@ -3,7 +3,8 @@ import time import logging -import psycopg2 + +from psycopg2 import sql, DatabaseError from odoo import api, fields, models, _ from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT @@ -504,14 +505,18 @@ class ResPartner(models.Model): return super().create(vals_list) def _increase_rank(self, field): - if self.ids: + if self.ids and field in ['customer_rank', 'supplier_rank']: try: with self.env.cr.savepoint(): - self.env.cr.execute("SELECT "+field+" FROM res_partner WHERE ID IN %(partner_ids)s FOR UPDATE NOWAIT", {'partner_ids': tuple(self.ids)}) - self.env.cr.execute("UPDATE res_partner SET "+field+"="+field+"+1 WHERE ID IN %(partner_ids)s", {'partner_ids': tuple(self.ids)}) + query = sql.SQL(""" + SELECT {field} FROM res_partner WHERE ID IN %(partner_ids)s FOR UPDATE NOWAIT; + UPDATE res_partner SET {field} = {field} + 1 + WHERE id IN %(partner_ids)s + """).format(field=sql.Identifier(field)) + self.env.cr.execute(query, {'partner_ids': tuple(self.ids)}) for partner in self: self.env.cache.remove(partner, partner._fields[field]) - except psycopg2.DatabaseError as e: + except DatabaseError as e: if e.pgcode == '55P03': _logger.debug('Another transaction already locked partner rows. Cannot update partner ranks.') else: