changeset b769201e0227 in tryton:default
details: https://hg.tryton.org/tryton?cmd=changeset&node=b769201e0227
description:
        Catch more exceptions on CSV import/export and improve message

        issue10979
        review387401002
diffstat:

 tryton/gui/window/win_export.py |  13 +++++----
 tryton/gui/window/win_import.py |  56 +++++++++++++++++++++-------------------
 2 files changed, 37 insertions(+), 32 deletions(-)

diffs (103 lines):

diff -r c4114052833f -r b769201e0227 tryton/gui/window/win_export.py
--- a/tryton/gui/window/win_export.py   Wed Dec 29 12:22:11 2021 +0100
+++ b/tryton/gui/window/win_export.py   Wed Dec 29 12:34:05 2021 +0100
@@ -375,9 +375,11 @@
             else:
                 fileno, fname = tempfile.mkstemp(
                     '.csv', common.slugify(self.name) + '_')
-                self.export_csv(fname, fields2, data, paths, popup=False)
-                os.close(fileno)
-                common.file_open(fname, 'csv')
+                if self.export_csv(fname, fields2, data, paths, popup=False):
+                    os.close(fileno)
+                    common.file_open(fname, 'csv')
+                else:
+                    os.close(fileno)
         self.destroy()
 
     def export_csv(self, fname, fields, data, paths, popup=True):
@@ -402,9 +404,8 @@
                 else:
                     common.message(_('%d records saved.') % len(data))
             return True
-        except IOError as exception:
-            common.warning(_("Operation failed.\nError message:\n%s")
-                % exception, _('Error'))
+        except (IOError, UnicodeEncodeError, csv.Error) as exception:
+            common.warning(str(exception), _('Export failed'))
             return False
 
     @classmethod
diff -r c4114052833f -r b769201e0227 tryton/gui/window/win_import.py
--- a/tryton/gui/window/win_import.py   Wed Dec 29 12:22:11 2021 +0100
+++ b/tryton/gui/window/win_import.py   Wed Dec 29 12:34:05 2021 +0100
@@ -117,8 +117,8 @@
                 open(fname, 'r', encoding=encoding, newline=''),
                 quotechar=self.get_quotechar(),
                 delimiter=self.get_delimiter())
-        except IOError:
-            common.warning(_('Error opening CSV file'), _('Error'))
+        except (IOError, UnicodeDecodeError, csv.Error) as exception:
+            common.warning(str(exception), _("Detection failed"))
             return True
         self.sig_unsel_all()
         word = ''
@@ -192,30 +192,34 @@
         skip = self.csv_skip.get_value_as_int()
         encoding = self.get_encoding()
         locale_format = self.csv_locale.get_active()
-        reader = csv.reader(
-            open(fname, 'r', encoding=encoding),
-            quotechar=self.get_quotechar(),
-            delimiter=self.get_delimiter())
-        data = []
-        for i, line in enumerate(reader):
-            if i < skip or not line:
-                continue
-            row = []
-            for field, val in zip(fields, line):
-                if locale_format and val:
-                    type_ = self.fields_data[field]['type']
-                    if type_ in ['integer', 'biginteger']:
-                        val = locale.atoi(val)
-                    elif type_ == 'float':
-                        val = locale.atof(val)
-                    elif type_ == 'numeric':
-                        val = Decimal(locale.delocalize(val))
-                    elif type_ in ['date', 'datetime']:
-                        val = date_parse(val, common.date_format())
-                    elif type_ == 'binary':
-                        val = base64.b64decode(val)
-                row.append(val)
-            data.append(row)
+        try:
+            reader = csv.reader(
+                open(fname, 'r', encoding=encoding),
+                quotechar=self.get_quotechar(),
+                delimiter=self.get_delimiter())
+            data = []
+            for i, line in enumerate(reader):
+                if i < skip or not line:
+                    continue
+                row = []
+                for field, val in zip(fields, line):
+                    if locale_format and val:
+                        type_ = self.fields_data[field]['type']
+                        if type_ in ['integer', 'biginteger']:
+                            val = locale.atoi(val)
+                        elif type_ == 'float':
+                            val = locale.atof(val)
+                        elif type_ == 'numeric':
+                            val = Decimal(locale.delocalize(val))
+                        elif type_ in ['date', 'datetime']:
+                            val = date_parse(val, common.date_format())
+                        elif type_ == 'binary':
+                            val = base64.b64decode(val)
+                    row.append(val)
+                data.append(row)
+        except (IOError, UnicodeDecodeError, csv.Error) as exception:
+            common.warning(str(exception), _("Import failed"))
+            return
         try:
             count = RPCExecute(
                 'model', self.model, 'import_data', fields, data,

Reply via email to