Commit 69b47872 authored by Kazuhiko Shiozaki's avatar Kazuhiko Shiozaki Committed by Jérome Perrin

py2/py3: unicode() does not exist in Python 3.

parent 36733bd3
"""Returns the `text_content` that should be set on the translation data script for this RJS website.
"""
import json
from Products.ERP5Type.Utils import str2unicode, unicode2str
portal = context.getPortalObject()
Base_translateString = context.Base_translateString
......@@ -38,14 +39,13 @@ tmp = {}
for language in context.getAvailableLanguageSet():
tmp[language] = {}
for word in translatable_message_set:
tmp[language][word] = unicode(Base_translateString(word, lang = language), 'utf-8')
tmp[language][word] = str2unicode(Base_translateString(word, lang = language))
# We pass unicode to this json.dump(ensure_ascii=False), so that it produce
# UTF-8 string and not escaped characters. At the end we return an UTF-8
# encoded string and not an unicode instance, because text_content property
# is usually UTF-8 encoded str (not unicode).
return (u"""/**
return unicode2str(u"""/**
* This translation data is generated automatically and updated with upgrader in post-upgarde.
* Do not edit manually, but use "Update Translation Data" action on web site to update from
* Localizer and from data-i18n tags on web pages.
......@@ -64,4 +64,4 @@ return (u"""/**
sort_keys=True,
indent=2,
ensure_ascii=False,
separators=(',', ': ')).splitlines()))).encode('utf-8')
separators=(',', ': ')).splitlines())))
......@@ -2,6 +2,7 @@ from Products.PythonScripts.standard import Object
from ZODB.POSException import ConflictError
from zExceptions import Unauthorized
from Products.ERP5Type.Document import newTempBase
import six
Base_translateString = context.Base_translateString
try:
......@@ -23,6 +24,20 @@ result = []
binary_data_explanation = Base_translateString("Binary data can't be displayed")
base_error_message = Base_translateString('(value retrieval failed)')
def get_value_as_text(value):
"""check if values are unicode convertible (binary are not)
"""
if not isinstance(value, six.text_type):
try:
if isinstance(value, bytes):
value.decode('utf-8')
else:
str(value)
except UnicodeDecodeError:
value = binary_data_explanation
return value
for prop_dict in sorted(context.getPropertyMap(), key=lambda prop: prop['id']):
prop = prop_dict['id']
error = False
......@@ -42,22 +57,9 @@ for prop_dict in sorted(context.getPropertyMap(), key=lambda prop: prop['id']):
error = True
new_value = base_error_message
if new_value != old_value or error:
# check if values are unicode convertible (binary are not)
if isinstance(new_value, (str, unicode)):
try:
unicode(str(new_value), 'utf-8')
except UnicodeDecodeError:
new_value = binary_data_explanation
if isinstance(old_value, (str, unicode)):
try:
unicode(str(old_value), 'utf-8')
except UnicodeDecodeError:
old_value = binary_data_explanation
if isinstance(current_value, (str, unicode)):
try:
unicode(str(current_value), 'utf-8')
except UnicodeDecodeError:
current_value = binary_data_explanation
new_value = get_value_as_text(new_value)
old_value = get_value_as_text(old_value)
current_value = get_value_as_text(current_value)
x = {'property_name': prop,
'new_value': new_value,
'old_value': old_value,
......
......@@ -53,7 +53,7 @@ def checkPythonScript(script_instance, script_path):
'DateTime', 'whrandom', 'reorder', 'sets', 'test', 'math']
code = script_instance.body()
if six.PY2:
code = unicode(code, 'utf8')
code = six.text_type(code, 'utf8')
for annotation in json.loads(portal.ERP5Site_checkPythonSourceCodeAsJSON(
{'bound_names': extra_builtins +
script_instance.getBindingAssignments().getAssignedNamesInOrder(),
......@@ -80,7 +80,7 @@ def checkComponent(component_instance):
jio_key=component_relative_url,),)
code = component_instance.getTextContent()
if six.PY2:
code = unicode(code, 'utf8')
code = six.text_type(code, 'utf8')
for annotation in json.loads(portal.ERP5Site_checkPythonSourceCodeAsJSON(
{'code': code}))['annotations']:
annotation['component_path'] = component_relative_url
......
......@@ -706,7 +706,7 @@ class ListBoxRenderer:
"""Return the title. Make sure that it is in unicode.
"""
if six.PY2:
return unicode(self.field.get_value('title'), self.getEncoding())
return six.text_type(self.field.get_value('title'), self.getEncoding())
else:
return self.field.get_value('title')
......@@ -898,7 +898,7 @@ class ListBoxRenderer:
"""
columns = self.field.get_value('columns')
if six.PY2:
return [(str(c[0]), unicode(c[1], self.getEncoding())) for c in columns]
return [(str(c[0]), six.text_type(c[1], self.getEncoding())) for c in columns]
else:
return columns
......@@ -910,7 +910,7 @@ class ListBoxRenderer:
all_column_list = list(self.getColumnList())
all_column_id_set = {c[0] for c in all_column_list}
if six.PY2:
all_column_list.extend((str(c[0]), unicode(c[1], self.getEncoding()))
all_column_list.extend((str(c[0]), six.text_type(c[1], self.getEncoding()))
for c in self.field.get_value('all_columns')
if c[0] not in all_column_id_set)
else:
......@@ -932,7 +932,7 @@ class ListBoxRenderer:
stat_columns = self.field.get_value('stat_columns')
if stat_columns:
if six.PY2:
stat_column_list = [(str(c[0]), unicode(c[1], self.getEncoding())) for c in stat_columns]
stat_column_list = [(str(c[0]), six.text_type(c[1], self.getEncoding())) for c in stat_columns]
else:
stat_column_list = stat_columns
else:
......@@ -965,7 +965,7 @@ class ListBoxRenderer:
"""
domain_root_list = self.field.get_value('domain_root_list')
if six.PY2:
return [(str(c[0]), unicode(c[1], self.getEncoding())) for c in domain_root_list]
return [(str(c[0]), six.text_type(c[1], self.getEncoding())) for c in domain_root_list]
else:
return domain_root_list
......@@ -975,7 +975,7 @@ class ListBoxRenderer:
"""
report_root_list = self.field.get_value('report_root_list')
if six.PY2:
return [(str(c[0]), unicode(c[1], self.getEncoding())) for c in report_root_list]
return [(str(c[0]), six.text_type(c[1], self.getEncoding())) for c in report_root_list]
else:
return report_root_list
......@@ -985,7 +985,7 @@ class ListBoxRenderer:
titles are in unicode"""
display_style_list = self.field.get_value('display_style_list')
if six.PY2:
return [(str(c[0]), unicode(c[1], self.getEncoding())) for c in \
return [(str(c[0]), six.text_type(c[1], self.getEncoding())) for c in \
display_style_list]
else:
return display_style_list
......@@ -1752,7 +1752,7 @@ class ListBoxRenderer:
if not isinstance(processed_value, six.text_type):
if six.PY2:
processed_value = unicode(str(processed_value), self.getEncoding(), 'replace')
processed_value = six.text_type(str(processed_value), self.getEncoding(), 'replace')
else:
processed_value = str(processed_value).encode(
self.getEncoding(), 'replace').decode()
......@@ -2382,7 +2382,7 @@ class ListBoxRendererLine:
processed_value = u''
elif not isinstance(processed_value, six.text_type):
if six.PY2:
processed_value = unicode(str(processed_value), renderer.getEncoding(), 'replace')
processed_value = six.text_type(str(processed_value), renderer.getEncoding(), 'replace')
else:
processed_value = str(processed_value).encode(
renderer.getEncoding(), 'replace').decode()
......
......@@ -44,6 +44,7 @@ from ZODB.POSException import ConflictError
from Products.ERP5Type.Utils import UpperCase
from zLOG import LOG
import six
try:
from zExceptions import ResourceLockedError
......@@ -304,18 +305,16 @@ if ReportTool:
#LOG('ReportTool_renderPDF', 0, 'encoding = %r' % encoding)
rhandler = ERP5ResourceHandler(context, getattr(self, 'resourcePath', None))
# if zope gives us the xml in unicode
# we need to encode it before it can be parsed
template_xml = getattr(context, templatename)(*args, **kwargs)
if type(template_xml) is type(u''):
template_xml = self._encode(template_xml, encoding)
if type(document_xml) is type(u''):
document_xml = self._encode(document_xml, encoding)
if not isinstance(template_xml, six.text_type):
template_xml = template_xml.decode(encoding)
if not isinstance(document_xml, six.text_type):
document_xml = document_xml.decode(encoding)
#LOG('ReportTool_renderPDF', 0, 'template_xml = %r, document_xml = %r' % (template_xml, document_xml))
# XXXXX Because reportlab does not support UTF-8, use Latin-1. What a mess.
template_xml = unicode(template_xml,encoding).encode('iso-8859-1')
document_xml = unicode(document_xml,encoding).encode('iso-8859-1','replace')
template_xml = template_xml.encode('iso-8859-1')
document_xml = document_xml.encode('iso-8859-1', 'replace')
encoding = 'iso-8859-1'
# create the PDFTemplate from xml
......
......@@ -894,7 +894,9 @@ class ODFStrategy(Implicit):
if isinstance(field_value, six.text_type):
value = field_value
elif field_value is not None:
value = unicode(str(field_value), 'utf-8')
value = str(field_value)
if six.PY2:
value = value.decode('utf-8')
return value
class ODTStrategy(ODFStrategy):
......
......@@ -98,7 +98,7 @@ def asString(value):
if value is None:
result = ''
else:
if six.PY2 and isinstance(value, unicode):
if six.PY2 and isinstance(value, six.text_type):
result = value.encode('utf-8')
elif six.PY3 and isinstance(value, bytes):
result = value.decode('utf-8')
......
......@@ -1389,10 +1389,14 @@ class TestZodbPropertySheet(ERP5TypeTestCase):
with self.assertRaises(TypeError):
person.setSocialTitle(social_title_value)
# Passing a unicode object to a not-Value setter should raise
with self.assertRaises(TypeError):
organisation = self.portal.organisation_module.newContent()
person.setSubordination(unicode(organisation.getRelativeUrl()))
if six.PY2:
# Passing a unicode object to a not-Value setter should raise
person.setSubordination(six.text_type(organisation.getRelativeUrl()))
else:
# Passing a bytes object to a not-Value setter should raise
person.setSubordination(organisation.getRelativeUrl().encode())
from Products.ERP5Type.Tool.ComponentTool import ComponentTool
......
......@@ -535,7 +535,7 @@ class SafeHTML:
# avoid breaking now.
# continue into the loop with repaired html
else:
if isinstance(orig, unicode):
if isinstance(orig, six.text_type):
orig = orig.encode('utf-8')
data.setData(orig)
break
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment