From 501ae8dad2e9c9ac7db518b0ee1b39b2db57a75a Mon Sep 17 00:00:00 2001 From: Jason Van Malder Date: Tue, 10 Dec 2019 13:40:28 +0000 Subject: [PATCH] [FIX] odoo: fix translation import onconflict Issue - Export all english translation - Import the file and override existing terms Cause When importing, we try to insert the translation if it doesn't exists. If it exists, we do an update via a "onconflict" rule. This update can be done only one time but in the values to import there are things like: ``` ( 'Account', # translation 8, # numbers of duplicate ['account', 'account', 'account', 'account', # modules 'account', 'account_ponto', 'account_yodlee', 'payment'] ) ``` Solution It will not be fixed in stable to avoid performances issues. Instead, we will display a clearer error message. As it's a `psycopg2.ProgrammingError`, the cursor is aborted and we can no longer use it to retrieve translations. This is why I use a save point. OPW-2150610 closes odoo/odoo#41934 X-original-commit: e108770d55b42a1793085a169145492b39d0a15c Signed-off-by: Jason Van Malder --- odoo/addons/base/i18n/base.pot | 35 +++++++++++++------ .../base/wizard/base_import_language.py | 12 ++++++- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/odoo/addons/base/i18n/base.pot b/odoo/addons/base/i18n/base.pot index 84c5f806b7f..3afe8711235 100644 --- a/odoo/addons/base/i18n/base.pot +++ b/odoo/addons/base/i18n/base.pot @@ -11341,16 +11341,6 @@ msgstr "" msgid "File" msgstr "" -#. module: base -#: code:addons/base/wizard/base_import_language.py:0 -#, python-format -msgid "" -"File %r not imported due to format mismatch or a malformed file. (Valid formats are .csv, .po, .pot)\n" -"\n" -"Technical Details:\n" -"%s" -msgstr "" - #. module: base #: code:addons/base/models/ir_ui_view.py:0 #, python-format @@ -11385,6 +11375,31 @@ msgid "" " Useful to (hard) reset broken views or to read arch from file in dev-xml mode." msgstr "" +#. module: base +#: code:addons/base/wizard/base_import_language.py:0 +#, python-format +msgid "File %r not imported due to a malformed file.\n" +"\n" +"This issue can be caused by duplicates entries who are referring to the same field. Please check the content of the file you are trying to import.\n" +"\n" +"Technical Details:\n" +"%s" +msgstr "" + +#. module: base +#: code:addons/base/wizard/base_import_language.py:0 +#, python-format +msgid "File %r not imported due to format mismatch or a malformed file. (Valid formats are .csv, .po, .pot)\n" +"\n" +"Technical Details:\n" +"%s" +msgstr "" + +#. module: base +#: model:ir.model.fields,field_description:base.field_ir_attachment__datas_fname +msgid "Filename" +msgstr "" + #. module: base #: model:ir.model.fields,field_description:base.field_ir_actions_act_window__filter msgid "Filter" diff --git a/odoo/addons/base/wizard/base_import_language.py b/odoo/addons/base/wizard/base_import_language.py index d85fad07610..be2da88318b 100644 --- a/odoo/addons/base/wizard/base_import_language.py +++ b/odoo/addons/base/wizard/base_import_language.py @@ -5,8 +5,10 @@ import base64 import logging import os from tempfile import TemporaryFile +from psycopg2 import ProgrammingError +from contextlib import closing -from odoo import api, fields, models, tools, _ +from odoo import api, fields, models, tools, sql_db, _ from odoo.exceptions import UserError _logger = logging.getLogger(__name__) @@ -44,6 +46,14 @@ class BaseLanguageImport(models.TransientModel): tools.trans_load_data( this._cr, buf, fileformat, this.code, overwrite=self.overwrite ) + except ProgrammingError as e: + _logger.exception('File unsuccessfully imported, due to a malformed file.') + + with closing(sql_db.db_connect(self._cr.dbname).cursor()) as cr: + raise UserError(_('File %r not imported due to a malformed file.\n\n' + 'This issue can be caused by duplicates entries who are referring to the same field. ' + 'Please check the content of the file you are trying to import.\n\n' + 'Technical Details:\n%s') % tools.ustr(e)) except Exception as e: _logger.exception('File unsuccessfully imported, due to format mismatch.') raise UserError(