changeset 77c4bf83616f in tryton:5.4
details: https://hg.tryton.org/tryton?cmd=changeset;node=77c4bf83616f
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 57da0b1a926a -r 77c4bf83616f 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 57da0b1a926a -r 77c4bf83616f 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):
 

Reply via email to