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

fixup! py2/py3: Make Products code compatible with both python2 and python3.

parent 133364a5
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
import six import six
from six import string_types as basestring from six import string_types as basestring
from Products.ERP5Type.Utils import ensure_list, bytes2str from Products.ERP5Type.Utils import ensure_list, bytes2str, str2bytes
import fnmatch, gc, glob, imp, os, re, shutil, sys, time, tarfile import fnmatch, gc, glob, imp, os, re, shutil, sys, time, tarfile
from collections import defaultdict from collections import defaultdict
from Shared.DC.ZRDB import Aqueduct from Shared.DC.ZRDB import Aqueduct
...@@ -350,6 +350,8 @@ class BusinessTemplateArchive(object): ...@@ -350,6 +350,8 @@ class BusinessTemplateArchive(object):
self._writeString(obj, path) self._writeString(obj, path)
else: else:
if isinstance(obj, str): if isinstance(obj, str):
obj = str2bytes(obj)
if isinstance(obj, bytes):
self.revision.hash(path, obj) self.revision.hash(path, obj)
obj = BytesIO(obj) obj = BytesIO(obj)
else: else:
...@@ -825,7 +827,7 @@ class ObjectTemplateItem(BaseTemplateItem): ...@@ -825,7 +827,7 @@ class ObjectTemplateItem(BaseTemplateItem):
obj = obj._getCopy(context) obj = obj._getCopy(context)
data = getattr(aq_base(obj), record_id, None) data = getattr(aq_base(obj), record_id, None)
if unicode_data: if unicode_data:
if not isinstance(data, six.text_type): if not (six.PY2 and isinstance(data, six.text_type)):
break break
try: try:
data = data.encode(aq_base(obj).output_encoding) data = data.encode(aq_base(obj).output_encoding)
...@@ -3523,7 +3525,7 @@ class PortalTypeRolesTemplateItem(BaseTemplateItem): ...@@ -3523,7 +3525,7 @@ class PortalTypeRolesTemplateItem(BaseTemplateItem):
path = self.__class__.__name__ path = self.__class__.__name__
for key in self._objects: for key in self._objects:
xml_data = self.generateXml(key) xml_data = self.generateXml(key)
if isinstance(xml_data, six.text_type): if six.PY2 and isinstance(xml_data, six.text_type):
xml_data = xml_data.encode('utf-8') xml_data = xml_data.encode('utf-8')
name = key.split('/', 1)[1] name = key.split('/', 1)[1]
bta.addObject(xml_data, name=name, path=path) bta.addObject(xml_data, name=name, path=path)
...@@ -3537,7 +3539,7 @@ class PortalTypeRolesTemplateItem(BaseTemplateItem): ...@@ -3537,7 +3539,7 @@ class PortalTypeRolesTemplateItem(BaseTemplateItem):
xml_type_roles_list = xml.findall('role') xml_type_roles_list = xml.findall('role')
for role in xml_type_roles_list: for role in xml_type_roles_list:
id = role.get('id') id = role.get('id')
if isinstance(id, six.text_type): if six.PY2 and isinstance(id, six.text_type):
id = id.encode('utf_8', 'backslashreplace') id = id.encode('utf_8', 'backslashreplace')
type_role_property_dict = {'id': id} type_role_property_dict = {'id': id}
# uniq # uniq
...@@ -3546,7 +3548,7 @@ class PortalTypeRolesTemplateItem(BaseTemplateItem): ...@@ -3546,7 +3548,7 @@ class PortalTypeRolesTemplateItem(BaseTemplateItem):
property_id = property_node.get('id') property_id = property_node.get('id')
if property_node.text: if property_node.text:
value = property_node.text value = property_node.text
if isinstance(value, six.text_type): if six.PY2 and isinstance(value, six.text_type):
value = value.encode('utf_8', 'backslashreplace') value = value.encode('utf_8', 'backslashreplace')
type_role_property_dict[property_id] = value type_role_property_dict[property_id] = value
# multi # multi
...@@ -3555,7 +3557,7 @@ class PortalTypeRolesTemplateItem(BaseTemplateItem): ...@@ -3555,7 +3557,7 @@ class PortalTypeRolesTemplateItem(BaseTemplateItem):
property_id = property_node.get('id') property_id = property_node.get('id')
if property_node.text: if property_node.text:
value = property_node.text value = property_node.text
if isinstance(value, six.text_type): if six.PY2 and isinstance(value, six.text_type):
value = value.encode('utf_8', 'backslashreplace') value = value.encode('utf_8', 'backslashreplace')
type_role_property_dict.setdefault(property_id, []).append(value) type_role_property_dict.setdefault(property_id, []).append(value)
type_roles_list.append(type_role_property_dict) type_roles_list.append(type_role_property_dict)
...@@ -4964,7 +4966,7 @@ class LocalRolesTemplateItem(BaseTemplateItem): ...@@ -4964,7 +4966,7 @@ class LocalRolesTemplateItem(BaseTemplateItem):
xml_data += '\n </local_role_group_ids>' xml_data += '\n </local_role_group_ids>'
xml_data += '\n</local_roles_item>' xml_data += '\n</local_roles_item>'
if isinstance(xml_data, six.text_type): if six.PY2 and isinstance(xml_data, six.text_type):
xml_data = xml_data.encode('utf8') xml_data = xml_data.encode('utf8')
return xml_data return xml_data
......
...@@ -1066,7 +1066,7 @@ class TemplateTool (BaseTool): ...@@ -1066,7 +1066,7 @@ class TemplateTool (BaseTool):
installed_revision=installed_revision, installed_revision=installed_revision,
repository=repository, repository=repository,
**property_dict) **property_dict)
obj.setUid(uid) obj.setUid(bytes2str(uid))
result_list.append(obj) result_list.append(obj)
result_list.sort(key=lambda x: x.getTitle()) result_list.sort(key=lambda x: x.getTitle())
return result_list return result_list
......
...@@ -53,10 +53,7 @@ def hashPdataObject(pdata_object): ...@@ -53,10 +53,7 @@ def hashPdataObject(pdata_object):
while pdata_object is not None: while pdata_object is not None:
chunk = pdata_object.aq_base chunk = pdata_object.aq_base
md5_hash.update(chunk.data) md5_hash.update(chunk.data)
if six.PY2: pdata_object = chunk.next
pdata_object = chunk.next
else:
pdata_object = chunk.__next__
chunk._p_deactivate() chunk._p_deactivate()
return md5_hash.hexdigest() return md5_hash.hexdigest()
......
...@@ -34,6 +34,7 @@ from Products.ERP5Type.Globals import InitializeClass ...@@ -34,6 +34,7 @@ from Products.ERP5Type.Globals import InitializeClass
from Products.ERP5Type.Base import Base from Products.ERP5Type.Base import Base
from Products.ERP5Type.TransactionalVariable import getTransactionalVariable from Products.ERP5Type.TransactionalVariable import getTransactionalVariable
from Products.ERP5Type.Errors import SimulationError from Products.ERP5Type.Errors import SimulationError
from Products.ERP5Type.Utils import ensure_list
SIMULATION_PRIORITY = 3 SIMULATION_PRIORITY = 3
...@@ -77,7 +78,7 @@ class SimulableMixin(Base): ...@@ -77,7 +78,7 @@ class SimulableMixin(Base):
ignore.update(kw) ignore.update(kw)
tv[ignore_key] = ignore tv[ignore_key] = ignore
transaction.get().addBeforeCommitHook(before_commit) transaction.get().addBeforeCommitHook(before_commit)
for k, v in item_list: for k, v in ensure_list(item_list):
if not v: if not v:
ignore.add(k) ignore.add(k)
elif k not in ignore: elif k not in ignore:
......
...@@ -12,8 +12,10 @@ if translation_service is not None : ...@@ -12,8 +12,10 @@ if translation_service is not None :
if not encoding: if not encoding:
return translation_service.translate(catalog, msg, lang=lang, **kw) return translation_service.translate(catalog, msg, lang=lang, **kw)
msg = translation_service.translate(catalog, msg, lang=lang, **kw) msg = translation_service.translate(catalog, msg, lang=lang, **kw)
if isinstance(msg, six.text_type): if six.PY2 and isinstance(msg, six.text_type):
msg = msg.encode(encoding) msg = msg.encode(encoding)
elif six.PY3 and isinstance(msg, six.binary_type):
msg = msg.decode(encoding)
return msg return msg
except AttributeError: # This happens in unit testing, because it is not able to find something with get_context() except AttributeError: # This happens in unit testing, because it is not able to find something with get_context()
pass pass
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
""" """
from OFS.SimpleItem import SimpleItem from OFS.SimpleItem import SimpleItem
from Products.ERP5Type.Utils import ensure_list
from Products.ERP5Type.Globals import InitializeClass, DTMLFile, PersistentMapping, get_request from Products.ERP5Type.Globals import InitializeClass, DTMLFile, PersistentMapping, get_request
from AccessControl import ClassSecurityInfo from AccessControl import ClassSecurityInfo
from ZTUtils import make_query from ZTUtils import make_query
...@@ -434,7 +435,7 @@ class SelectionTool( BaseTool, SimpleItem ): ...@@ -434,7 +435,7 @@ class SelectionTool( BaseTool, SimpleItem ):
selection_uid_dict[int(uid)] = 1 selection_uid_dict[int(uid)] = 1
except (ValueError, TypeError): except (ValueError, TypeError):
selection_uid_dict[uid] = 1 selection_uid_dict[uid] = 1
self.setSelectionCheckedUidsFor(list_selection_name, selection_uid_dict.keys(), REQUEST=REQUEST) self.setSelectionCheckedUidsFor(list_selection_name, ensure_list(selection_uid_dict.keys()), REQUEST=REQUEST)
if REQUEST is not None: if REQUEST is not None:
return self._redirectToOriginalForm(REQUEST=REQUEST, form_id=form_id, return self._redirectToOriginalForm(REQUEST=REQUEST, form_id=form_id,
query_string=query_string, no_reset=True) query_string=query_string, no_reset=True)
......
...@@ -46,6 +46,7 @@ from Products.PluggableAuthService.plugins.CookieAuthHelper import CookieAuthHel ...@@ -46,6 +46,7 @@ from Products.PluggableAuthService.plugins.CookieAuthHelper import CookieAuthHel
from Products.ERP5Type.Cache import CachingMethod from Products.ERP5Type.Cache import CachingMethod
from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod from Products.ERP5Type.UnrestrictedMethod import UnrestrictedMethod
from Products.ERP5Type.Utils import bytes2str
from Products.ERP5Security.ERP5UserManager import ERP5UserManager, \ from Products.ERP5Security.ERP5UserManager import ERP5UserManager, \
_AuthenticationFailure _AuthenticationFailure
from Products import ERP5Security from Products import ERP5Security
...@@ -64,7 +65,7 @@ class AESCipher: ...@@ -64,7 +65,7 @@ class AESCipher:
def encrypt(self, login): def encrypt(self, login):
iv = Random.new().read(AES.block_size) iv = Random.new().read(AES.block_size)
encryptor = AES.new(self.encryption_key, self.mode, IV=iv) encryptor = AES.new(self.encryption_key, self.mode, IV=iv)
return urlsafe_b64encode(iv + encryptor.encrypt(login.ljust(((len(login)-1)/16+1)*16))) return urlsafe_b64encode(iv + encryptor.encrypt(login.ljust(((len(login)-1)//16+1)*16)))
def decrypt(self, crypted_login): def decrypt(self, crypted_login):
decoded_crypted_login = urlsafe_b64decode(crypted_login) decoded_crypted_login = urlsafe_b64decode(crypted_login)
...@@ -217,13 +218,13 @@ class ERP5KeyAuthPlugin(ERP5UserManager, CookieAuthHelper): ...@@ -217,13 +218,13 @@ class ERP5KeyAuthPlugin(ERP5UserManager, CookieAuthHelper):
def encrypt(self, login): def encrypt(self, login):
"""Encrypt the login""" """Encrypt the login"""
cipher = globals()['%sCipher' % self._getCipher()](self.encryption_key) cipher = globals()['%sCipher' % self._getCipher()](self.encryption_key)
return cipher.encrypt(login) return bytes2str(cipher.encrypt(login))
security.declarePrivate('decrypt') security.declarePrivate('decrypt')
def decrypt(self, crypted_login): def decrypt(self, crypted_login):
"""Decrypt string and return the login""" """Decrypt string and return the login"""
cipher = globals()['%sCipher' % self._getCipher()](self.encryption_key) cipher = globals()['%sCipher' % self._getCipher()](self.encryption_key)
return cipher.decrypt(crypted_login) return bytes2str(cipher.decrypt(crypted_login))
#################################### ####################################
#ILoginPasswordHostExtractionPlugin# #ILoginPasswordHostExtractionPlugin#
......
...@@ -114,7 +114,7 @@ class Message(Persistent): ...@@ -114,7 +114,7 @@ class Message(Persistent):
if self.domain is None: if self.domain is None:
# Map the translated string with given parameters # Map the translated string with given parameters
if type(self.mapping) is dict: if type(self.mapping) is dict:
if isinstance(message, six.text_type) : if six.PY2 and isinstance(message, six.text_type) :
message = message.encode('utf-8') message = message.encode('utf-8')
message = Template(message).substitute(self.mapping) message = Template(message).substitute(self.mapping)
else: else:
...@@ -124,7 +124,7 @@ class Message(Persistent): ...@@ -124,7 +124,7 @@ class Message(Persistent):
if self.mapping: if self.mapping:
unicode_mapping = {} unicode_mapping = {}
for k, v in six.iteritems(self.mapping): for k, v in six.iteritems(self.mapping):
if isinstance(v, str): if six.PY2 and isinstance(v, str):
v = v.decode('utf-8') v = v.decode('utf-8')
unicode_mapping[k] = v unicode_mapping[k] = v
else: else:
...@@ -139,9 +139,9 @@ class Message(Persistent): ...@@ -139,9 +139,9 @@ class Message(Persistent):
message = translated_message message = translated_message
if isinstance(self.message, str): if isinstance(self.message, str):
if isinstance(message, six.text_type): if six.PY2 and isinstance(message, six.text_type):
message = message.encode('utf-8') message = message.encode('utf-8')
elif isinstance(message, str): elif six.PY2 and isinstance(message, str):
message = message.decode('utf-8') message = message.decode('utf-8')
return message return message
...@@ -154,7 +154,7 @@ class Message(Persistent): ...@@ -154,7 +154,7 @@ class Message(Persistent):
Return the translated message as a string object. Return the translated message as a string object.
""" """
message = self.translate() message = self.translate()
if isinstance(message, six.text_type): if six.PY2 and isinstance(message, six.text_type):
message = message.encode('utf-8') message = message.encode('utf-8')
return message return message
...@@ -163,7 +163,7 @@ class Message(Persistent): ...@@ -163,7 +163,7 @@ class Message(Persistent):
Return the translated message as a unicode object. Return the translated message as a unicode object.
""" """
message = self.translate() message = self.translate()
if isinstance(message, str): if six.PY2 and isinstance(message, str):
message = message.decode('utf-8') message = message.decode('utf-8')
return message return message
......
...@@ -219,7 +219,7 @@ def DA__call__(self, REQUEST=None, __ick__=None, src__=0, test__=0, **kw): ...@@ -219,7 +219,7 @@ def DA__call__(self, REQUEST=None, __ick__=None, src__=0, test__=0, **kw):
if src__: return query if src__: return query
if self.cache_time_ > 0 and self.max_cache_ > 0: if self.cache_time_ > 0 and self.max_cache_ > 0:
result=self._cached_result(DB__, query, self.max_rows_, c) result=self._cached_result(DB__, str2bytes(query), self.max_rows_, c)
else: else:
try: try:
result=DB__.query(query, self.max_rows_) result=DB__.query(query, self.max_rows_)
......
...@@ -18,6 +18,7 @@ import string ...@@ -18,6 +18,7 @@ import string
import sys import sys
import time import time
import traceback import traceback
import urllib
from six.moves import configparser from six.moves import configparser
from contextlib import contextmanager from contextlib import contextmanager
from io import BytesIO from io import BytesIO
......
...@@ -76,17 +76,17 @@ class AutoQuery(Query): ...@@ -76,17 +76,17 @@ class AutoQuery(Query):
# Recreate value as a dict and pass it to buildSingleQuery. # Recreate value as a dict and pass it to buildSingleQuery.
range = kw.pop('range') range = kw.pop('range')
assert len(kw) == 1, repr(kw) assert len(kw) == 1, repr(kw)
key, value = kw.items()[0] key, value = list(kw.items())[0]
query = sql_catalog.buildSingleQuery(key, {'query': value, query = sql_catalog.buildSingleQuery(key, {'query': value,
'range': range}) 'range': range})
elif operator == 'in': elif operator == 'in':
# 'in' is a *comparison* operator, not a logical operator. # 'in' is a *comparison* operator, not a logical operator.
# Transform kw into the proper form. # Transform kw into the proper form.
assert len(kw) == 1, repr(kw) assert len(kw) == 1, repr(kw)
key, value = kw.items()[0] key, value = list(kw.items())[0]
query = sql_catalog.buildSingleQuery(key, {'query': value, query = sql_catalog.buildSingleQuery(key, {'query': value,
'operator': operator}) 'operator': operator})
elif len(kw) == 1 and isinstance(kw.values()[0], (tuple, list)) and \ elif len(kw) == 1 and isinstance(list(kw.values())[0], (tuple, list)) and \
operator in ('and', 'or'): operator in ('and', 'or'):
# If there is only one parameter, and operator was given and is a # If there is only one parameter, and operator was given and is a
# known logical operator, then operator will apply to it. # known logical operator, then operator will apply to it.
...@@ -94,7 +94,7 @@ class AutoQuery(Query): ...@@ -94,7 +94,7 @@ class AutoQuery(Query):
# kw = {'portal_type': ['!=a', '!=b'], 'operator': 'AND'} # kw = {'portal_type': ['!=a', '!=b'], 'operator': 'AND'}
# In such case, expected result is # In such case, expected result is
# "portal_type!='a' AND portal_type!='b'" # "portal_type!='a' AND portal_type!='b'"
key, value = kw.items()[0] key, value = list(kw.items())[0]
query = sql_catalog.buildSingleQuery(key, value, logical_operator=operator) query = sql_catalog.buildSingleQuery(key, value, logical_operator=operator)
else: else:
# Otherwise, the operator will apply to the relationship between # Otherwise, the operator will apply to the relationship between
...@@ -102,7 +102,7 @@ class AutoQuery(Query): ...@@ -102,7 +102,7 @@ class AutoQuery(Query):
if operator is None: if operator is None:
operator = 'and' operator = 'and'
if self.search_key is not None: if self.search_key is not None:
key, value = kw.items()[0] key, value = list(kw.items())[0]
kw = {key: {'query': value, 'key': self.search_key}} kw = {key: {'query': value, 'key': self.search_key}}
query = sql_catalog.buildQuery(kw, operator=operator, ignore_empty_string=self.ignore_empty_string) query = sql_catalog.buildQuery(kw, operator=operator, ignore_empty_string=self.ignore_empty_string)
if self.table_alias_list is not None: if self.table_alias_list is not None:
......
...@@ -2129,7 +2129,7 @@ class Catalog(Folder, ...@@ -2129,7 +2129,7 @@ class Catalog(Folder,
if len(empty_value_dict): if len(empty_value_dict):
LOG('SQLCatalog', WARNING, 'Discarding columns with empty values: %r' % (empty_value_dict, )) LOG('SQLCatalog', WARNING, 'Discarding columns with empty values: %r' % (empty_value_dict, ))
if len(unknown_column_dict): if len(unknown_column_dict):
message = 'Unknown columns ' + repr(unknown_column_dict.keys()) message = 'Unknown columns ' + repr(ensure_list(unknown_column_dict.keys()))
if ignore_unknown_columns: if ignore_unknown_columns:
LOG('SQLCatalog', WARNING, message) LOG('SQLCatalog', WARNING, message)
else: else:
......
...@@ -58,7 +58,10 @@ class lexer(object): ...@@ -58,7 +58,10 @@ class lexer(object):
write_tables=False) write_tables=False)
sys.stdout, sys.stderr = sys.__stdout__, sys.__stderr__ sys.stdout, sys.stderr = sys.__stdout__, sys.__stderr__
# Emit all logs with regular Zope logging # Emit all logs with regular Zope logging
for line in output.getvalue().split('\n'): value = output.getvalue()
if six.PY3:
value = value.decode()
for line in value.split('\n'):
if len(line): if len(line):
LOG('lexer', 0, line) LOG('lexer', 0, line)
......
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