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,