changeset 9fa57d58ee48 in tryton:5.2 details: https://hg.tryton.org/tryton?cmd=changeset;node=9fa57d58ee48 description: Guess encoding when sending bytes to a Char widget
issue8824 review258401002 (grafted from 08f29b53ce8609dc4891cc7b7c66acaf2794df69) diffstat: tryton/common/htmltextbuffer.py | 21 ++++++++++++--------- tryton/gui/window/view_form/model/field.py | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) diffs (80 lines): diff -r c6f600efb7e8 -r 9fa57d58ee48 tryton/common/htmltextbuffer.py --- a/tryton/common/htmltextbuffer.py Mon Nov 18 12:27:19 2019 +0100 +++ b/tryton/common/htmltextbuffer.py Thu Nov 21 15:38:10 2019 +0100 @@ -9,6 +9,17 @@ from gi.repository import Gtk, Gdk, Pango + +def guess_decode(bytes, errors='strict'): + for encoding in [sys.getfilesystemencoding(), 'utf-8', 'utf-16', 'utf-32']: + try: + return bytes.decode(encoding) + except UnicodeDecodeError: + continue + else: + return bytes.decode('ascii', errors=errors) + + MIME = Gdk.Atom.intern('text/html', False) # Disable serialize/deserialize registration function because it does not work # on GTK-3, the "guint8 *data" is converted into a Gtk.TextIter @@ -269,15 +280,7 @@ def deserialize(register, content, iter_, text, create_tags, data): if not isinstance(text, str): - for encoding in [sys.getfilesystemencoding(), - 'utf-8', 'utf-16', 'utf-32']: - try: - text = text.decode(encoding) - except UnicodeDecodeError: - continue - break - else: - text = text.decode('ascii', errors='replace') + text = guess_decode(text, errors='replace') text, tags = parse_markup(normalize_markup(text, method='xml')) offset = iter_.get_offset() content.insert(iter_, text) diff -r c6f600efb7e8 -r 9fa57d58ee48 tryton/gui/window/view_form/model/field.py --- a/tryton/gui/window/view_form/model/field.py Mon Nov 18 12:27:19 2019 +0100 +++ b/tryton/gui/window/view_form/model/field.py Thu Nov 21 15:38:10 2019 +0100 @@ -3,6 +3,7 @@ import os from itertools import chain import tempfile +import logging import locale from tryton.common import \ domain_inversion, eval_domain, localize_domain, \ @@ -15,9 +16,12 @@ from decimal import Decimal import math from tryton.common import RPCExecute, RPCException +from tryton.common.htmltextbuffer import guess_decode from tryton.pyson import PYSONDecoder from tryton.config import CONFIG +logger = logging.getLogger(__name__) + class Field(object): ''' @@ -203,6 +207,17 @@ def get(self, record): return super(CharField, self).get(record) or self._default + def set_client(self, record, value, force_change=False): + if isinstance(value, bytes): + try: + value = guess_decode(value) + except UnicodeDecodeError: + logger.warning( + "The encoding can not be guessed for field '%(name)s'", + {'name': self.name}) + value = None + super().set_client(record, value, force_change) + class SelectionField(Field):