diff --git a/addons/account/models/partner.py b/addons/account/models/partner.py index 51387f43a84..724709514dc 100644 --- a/addons/account/models/partner.py +++ b/addons/account/models/partner.py @@ -4,7 +4,7 @@ import time import logging -from psycopg2 import sql, errors as sql_errors +from psycopg2 import sql, DatabaseError from odoo import api, fields, models, _ from odoo.osv import expression @@ -649,7 +649,11 @@ class ResPartner(models.Model): """).format(field=sql.Identifier(field)) self.env.cr.execute(query, {'partner_ids': tuple(self.ids), 'n': n}) self.invalidate_recordset([field]) - except (sql_errors.SerializationFailure, sql_errors.LockNotAvailable): + except DatabaseError as e: + # 55P03 LockNotAvailable + # 40001 SerializationFailure + if e.pgcode not in ('55P03', '40001'): + raise e _logger.debug('Another transaction already locked partner rows. Cannot update partner ranks.') @api.model diff --git a/addons/account/tests/test_sequence_mixin.py b/addons/account/tests/test_sequence_mixin.py index cbcf30b1235..5319657343c 100644 --- a/addons/account/tests/test_sequence_mixin.py +++ b/addons/account/tests/test_sequence_mixin.py @@ -280,7 +280,7 @@ class TestSequenceMixin(TestSequenceMixinCommon): self.assertEqual(copies[5].name, 'XMISC/2019/00004') # Can't have twice the same name - with self.assertRaises(psycopg2.errors.IntegrityError), mute_logger('odoo.sql_db'), self.env.cr.savepoint(): + with self.assertRaises(psycopg2.DatabaseError), mute_logger('odoo.sql_db'), self.env.cr.savepoint(): copies[0].name = 'XMISC/2019/00001' # Lets remove the order by date diff --git a/addons/account_sequence/models/sequence_mixin.py b/addons/account_sequence/models/sequence_mixin.py index 0b53ecbddcc..bb6a25ab99e 100644 --- a/addons/account_sequence/models/sequence_mixin.py +++ b/addons/account_sequence/models/sequence_mixin.py @@ -1,4 +1,4 @@ -from psycopg2 import errors +from psycopg2 import DatabaseError from odoo import models from odoo.tools import mute_logger @@ -36,7 +36,10 @@ class SequenceMixin(models.AbstractModel): self[self._sequence_field] = sequence self.flush_recordset([self._sequence_field]) break - except (errors.ExclusionViolation, errors.UniqueViolation): - pass + except DatabaseError as e: + # 23P01 ExclusionViolation + # 23505 UniqueViolation + if e.pgcode not in ('23P01', '23505'): + raise e self._compute_split_sequence() self.flush_recordset(['sequence_prefix', 'sequence_number'])