From 8811e3e975bf5399e67fd6c221c5d30f5036aa9a Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Thu, 21 May 2026 21:33:11 +0200 Subject: [PATCH] [FIX] edi_core_oca: use savepoint to prevent state corruption on errors Some errors such as ValueError, FileNotFoundError, exceptions.UserError, exceptions.ValidationError, are caught, never re-raised, and the transaction is finally committed. Which means a UserError/ValidationError gets committed, leading to corruption of the processed data. --- edi_core_oca/models/edi_backend.py | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/edi_core_oca/models/edi_backend.py b/edi_core_oca/models/edi_backend.py index 037ead3e9..de323684d 100644 --- a/edi_core_oca/models/edi_backend.py +++ b/edi_core_oca/models/edi_backend.py @@ -143,7 +143,8 @@ def exchange_generate(self, exchange_record, store=True, force=False, **kw): if output: message = exchange_record._exchange_status_message("generate_ok") try: - self._validate_data(exchange_record, output) + with self.env.cr.savepoint(): + self._validate_data(exchange_record, output) except EDIValidationError as err: traceback = _get_exception_traceback() error = _get_exception_msg(err) @@ -231,8 +232,9 @@ def exchange_send(self, exchange_record): message = None res = "" try: - self._exchange_send(exchange_record) - _logger.debug("%s sent", exchange_record.identifier) + with self.env.cr.savepoint(): + self._exchange_send(exchange_record) + _logger.debug("%s sent", exchange_record.identifier) except self._send_retryable_exceptions() as err: traceback = _get_exception_traceback() error = _get_exception_msg(err) @@ -459,7 +461,8 @@ def exchange_process(self, exchange_record): message = None res = None try: - res = self._exchange_process(exchange_record) + with self.env.cr.savepoint(): + res = self._exchange_process(exchange_record) except self._swallable_exceptions() as err: if self.env.context.get("_edi_process_break_on_error"): raise @@ -515,12 +518,14 @@ def exchange_receive(self, exchange_record): error = traceback = False message = None content = None + res = None try: - content = self._exchange_receive(exchange_record) - # Ignore result of FileNotFoundError/OSError - if content is not None: - exchange_record._set_file_content(content) - self._validate_data(exchange_record) + with self.env.cr.savepoint(): + content = self._exchange_receive(exchange_record) + # Ignore result of FileNotFoundError/OSError + if content is not None: + exchange_record._set_file_content(content) + self._validate_data(exchange_record) except EDIValidationError as err: traceback = _get_exception_traceback() error = _get_exception_msg(err)