Commit a17bb910 authored by Arnaud Fontaine's avatar Arnaud Fontaine

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

Done through various 2to3 fixers (zope.fixers, modernize, future) and manual
changes. This is a single commit so that we have a clearer picture of how code
converted with my2to3 should look like.

Except straightforward @implementer decorator 2to3 fixer, only product/ folder
was considered as the goal was to be able to create an ERP5Site.

* Use @implementer decorator introduced in zope.interface 3.6.0 (2010):

  The implements syntax used under Python 2.X does not work under 3.X, since it
  depends on how metaclasses are implemented and this has changed. Instead it
  now supports a decorator syntax (also under Python 2.X).

  Applied thanks to 2to3 `zope.fixers` package.

* Use `six.moves` rather than `future` install_aliases() feature because the
  latter use unicode_literals and "wraps" module aliases so that unicode() are
  returned for text rather than str() (Python2 standard library). This notably
  breaks BusinessTemplate code which uses urllib quote() for filesystem paths...

* No more unbound methods in python3 so use six.get_unbound_function().

* dict.(iteritems,iterkeys,itervalues)() => six.\1(dict) thanks to `dict_six`
  2to3 fixer from `modernize`:
  $ python-modernize -w -f dict_six product/

* Manually make sure that dict.{items,values,keys}() returns a real list when it
  is latter modified rather than a dict_{items,values,keys} (ensure_list()). By
  default, 2to3 blindly does list(dict.{items,values,keys}()) which is not
  acceptable from performances point of view. With my2to3, this will be possible
  to handle such case automatically.

* Replace cStringIO.StringIO() by six.moves.cStringIO() (a module alias for
  cStringIO.StringIO() on py2 and io.StringIO() on py3).

* Use six.text_type which maps to unicode() on py2 and str() on py3. This also
  makes a clearer difference between text and binary strings.

* Replace map()/filter() with lambda function by list comprehension (this has
  the benefit to avoid casting to list for py3 as it returns iterators).
parent a6e1d433
......@@ -36,6 +36,9 @@ from erp5.component.interface.IRule import IRule
from erp5.component.interface.IDivergenceController import IDivergenceController
from erp5.component.interface.IMovementCollectionUpdater import IMovementCollectionUpdater
@zope.interface.implementer(IRule,
IDivergenceController,
IMovementCollectionUpdater,)
class PaymentSimulationRule(RuleMixin, MovementCollectionUpdaterMixin):
"""
Payment Rule generates payment simulation movement from invoice
......@@ -49,11 +52,6 @@ class PaymentSimulationRule(RuleMixin, MovementCollectionUpdaterMixin):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IRule,
IDivergenceController,
IMovementCollectionUpdater,)
# Default Properties
property_sheets = (
PropertySheet.Base,
......
......@@ -31,8 +31,9 @@
from AccessControl import ClassSecurityInfo
from Products.ERP5Type import PropertySheet, Permissions, interfaces
from Products.ERP5Type.Core.Predicate import Predicate
from zope.interface import implements
from zope.interface import implementer
@implementer( interfaces.IPredicate,)
class Archive(Predicate):
"""
A Catalog Archive object
......@@ -47,9 +48,6 @@ class Archive(Predicate):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
implements( interfaces.IPredicate, )
# Default Properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -37,6 +37,7 @@ import re
_marker = object()
@zope.interface.implementer(ICoordinate,)
class Coordinate(Base):
"""
Coordinates is a mix-in class which is used to store elementary
......@@ -81,9 +82,6 @@ class Coordinate(Base):
portal_type = 'Coordinate'
add_permission = Permissions.AddPortalContent
# Declarative interface
zope.interface.implements(ICoordinate, )
# Declarative security (replaces __ac_permissions__)
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
......
......@@ -33,6 +33,7 @@ from Products.ERP5Type import Permissions, PropertySheet, interfaces
from Products.ERP5Type.XMLObject import XMLObject
@zope.interface.implementer(interfaces.INode)
class Login(EncryptedPasswordMixin, XMLObject, LoginAccountProviderMixin):
"""Login
"""
......@@ -40,8 +41,6 @@ class Login(EncryptedPasswordMixin, XMLObject, LoginAccountProviderMixin):
portal_type = 'Login'
add_permission = Permissions.AddPortalContent
zope.interface.implements(interfaces.INode)
# Declarative security
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
......
......@@ -32,6 +32,7 @@ from Products.ERP5Type import Permissions, PropertySheet
from erp5.component.interface.IMovementGroup import IMovementGroup
import zope.interface
@zope.interface.implementer( IMovementGroup,)
class MovementGroup(XMLObject):
"""
The purpose of MovementGroup is to define how movements
......@@ -59,8 +60,6 @@ class MovementGroup(XMLObject):
meta_type = 'ERP5 Movement Group'
portal_type = 'Movement Group'
zope.interface.implements( IMovementGroup, )
# Declarative security
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
......
......@@ -32,6 +32,7 @@ from AccessControl import ClassSecurityInfo
from Products.ERP5Type import Permissions, PropertySheet, interfaces
from Products.ERP5.Document.Node import Node
@zope.interface.implementer(interfaces.INode)
class Organisation(Node):
"""
An Organisation object holds the information about
......@@ -52,8 +53,6 @@ class Organisation(Node):
portal_type = 'Organisation'
add_permission = Permissions.AddPortalContent
zope.interface.implements(interfaces.INode)
# Declarative security
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
......
......@@ -60,6 +60,7 @@ class UserExistsError(
super(UserExistsError, self).__init__('user id %s already exists' % (user_id, ))
@zope.interface.implementer(interfaces.INode)
class Person(EncryptedPasswordMixin, Node, LoginAccountProviderMixin, ERP5UserMixin):
"""
An Person object holds the information about
......@@ -81,8 +82,6 @@ class Person(EncryptedPasswordMixin, Node, LoginAccountProviderMixin, ERP5UserMi
portal_type = 'Person'
add_permission = Permissions.AddPortalContent
zope.interface.implements(interfaces.INode)
# Declarative security
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
......
......@@ -32,6 +32,7 @@ from Products.ERP5Type.XMLObject import XMLObject
from Products.ERP5Type.ERP5Type \
import ERP5TYPE_SECURITY_GROUP_ID_GENERATION_SCRIPT
@zope.interface.implementer(interfaces.ILocalRoleGenerator)
class RoleDefinition(XMLObject):
# CMF Type Definition
meta_type = 'ERP5 Role Definition'
......@@ -42,8 +43,6 @@ class RoleDefinition(XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
zope.interface.implements(interfaces.ILocalRoleGenerator)
# Default Properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -39,6 +39,7 @@ from Products.ERP5Type.Globals import PersistentMapping
from Products.CMFCore.utils import _checkPermission
from Products.CMFCore.exceptions import AccessControl_Unauthorized
@zope.interface.implementer(IEncryptedPassword,)
class EncryptedPasswordMixin(object):
"""Encrypted Password Mixin
"""
......@@ -46,9 +47,6 @@ class EncryptedPasswordMixin(object):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IEncryptedPassword,)
security.declareProtected(Permissions.SetOwnPassword, 'checkPassword')
def checkPassword(self, value) :
"""
......
......@@ -35,6 +35,7 @@ from AccessControl.AuthEncoding import pw_validate
from AccessControl import ClassSecurityInfo
from Products.ERP5Type.Globals import InitializeClass
@zope.interface.implementer(ILoginAccountProvider)
class LoginAccountProviderMixin:
"""
This class provides a generic implementation of ILoginAccountProvider.
......@@ -43,9 +44,6 @@ class LoginAccountProviderMixin:
# Declarative security
security = ClassSecurityInfo()
# Declarative interfaces
zope.interface.implements(ILoginAccountProvider)
security.declareProtected(Permissions.SetOwnPassword, 'notifyLoginFailure')
def notifyLoginFailure(self, **kw):
"""
......
# -*- coding: utf-8 -*-
from Products.PortalTransforms.interfaces import ITransform
from zope.interface import implements
from zope.interface import implementer
from erp5.component.document.Document import DocumentConversionServerProxy, ConversionError, enc, dec
@implementer(ITransform)
class DocumentConversionServerTransform:
"""
Transformer using Conversion Server
"""
implements(ITransform)
# Name of the Transform as registered in portal_transforms
__name__ = None
......
......@@ -39,6 +39,9 @@ from erp5.component.interface.IRule import IRule
from erp5.component.interface.IDivergenceController import IDivergenceController
from erp5.component.interface.IMovementCollectionUpdater import IMovementCollectionUpdater
@zope.interface.implementer(IRule,
IDivergenceController,
IMovementCollectionUpdater,)
class LoyaltyTransactionSimulationRule(RuleMixin,MovementCollectionUpdaterMixin):
""" """
# CMF Type Definition
......@@ -49,11 +52,6 @@ class LoyaltyTransactionSimulationRule(RuleMixin,MovementCollectionUpdaterMixin)
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IRule,
IDivergenceController,
IMovementCollectionUpdater,)
# Default Properties
property_sheets = (
PropertySheet.Base,
......
......@@ -35,6 +35,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class AccountConfiguratorItem(ConfiguratorItemMixin, XMLObject):
""" Setup an Accounting Account. """
......@@ -48,9 +49,6 @@ class AccountConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -34,6 +34,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class AccountingPeriodConfiguratorItem(ConfiguratorItemMixin, XMLObject):
""" Setup an Accounting Period. """
......@@ -47,9 +48,6 @@ class AccountingPeriodConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -35,6 +35,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class AdvancedPurchaseTradeConditionConfiguratorItem(ConfiguratorItemMixin, XMLObject):
""" Setup Purchase Trade Conditions. """
......@@ -48,9 +49,6 @@ class AdvancedPurchaseTradeConditionConfiguratorItem(ConfiguratorItemMixin, XMLO
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -35,6 +35,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class AdvancedSaleTradeConditionConfiguratorItem(ConfiguratorItemMixin, XMLObject):
""" Setup Sale Trade Conditions. """
......@@ -48,9 +49,6 @@ class AdvancedSaleTradeConditionConfiguratorItem(ConfiguratorItemMixin, XMLObjec
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -35,6 +35,7 @@ from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
from DateTime import DateTime
@zope.interface.implementer(IConfiguratorItem)
class AlarmConfiguratorItem(ConfiguratorItemMixin, XMLObject):
""" Setup an Alarm """
......@@ -48,9 +49,6 @@ class AlarmConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -36,6 +36,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class BankAccountConfiguratorItem(ConfiguratorItemMixin, XMLObject):
""" Setup bank account. """
......@@ -49,9 +50,6 @@ class BankAccountConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -35,6 +35,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class BusinessProcessConfiguratorItem(ConfiguratorItemMixin, XMLObject):
""" Setup Rules. """
......@@ -48,9 +49,6 @@ class BusinessProcessConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -35,6 +35,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class CatalogKeywordKeyConfiguratorItem(ConfiguratorItemMixin, XMLObject):
"""Set up catalog keyword keys."""
......@@ -48,9 +49,6 @@ class CatalogKeywordKeyConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -40,6 +40,7 @@ class UnrestrictedStringIO(StringIO):
__allow_access_to_unprotected_subobjects__ = 1
@zope.interface.implementer(IConfiguratorItem)
class CategoriesSpreadsheetConfiguratorItem(ConfiguratorItemMixin, XMLObject):
"""Import a categories spreadsheet.
"""
......@@ -54,9 +55,6 @@ class CategoriesSpreadsheetConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -34,6 +34,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class CategoryConfiguratorItem(ConfiguratorItemMixin, XMLObject):
"""This class is meta build step for customization of ERP5 site."""
......@@ -47,9 +48,6 @@ class CategoryConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -35,6 +35,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class CurrencyConfiguratorItem(ConfiguratorItemMixin, XMLObject):
""" Setup currency. """
......@@ -48,9 +49,6 @@ class CurrencyConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -33,6 +33,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class CustomerBT5ConfiguratorItem(ConfiguratorItemMixin, XMLObject):
""" Create a new bt5 for customer configuration.
......@@ -49,9 +50,6 @@ class CustomerBT5ConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()
security.declareObjectProtected(Permissions.AccessContentsInformation)
# Declarative interfaces
zope.interface.implements(IConfiguratorItem)
# Declarative properties
property_sheets = ( PropertySheet.Base
, PropertySheet.XMLObject
......
......@@ -36,6 +36,7 @@ from erp5.component.mixin.ConfiguratorItemMixin import ConfiguratorItemMixin
from erp5.component.interface.IConfiguratorItem import IConfiguratorItem
@zope.interface.implementer(IConfiguratorItem)
class OrganisationConfiguratorItem(ConfiguratorItemMixin, XMLObject):
""" This class install a Organisation."""
......@@ -49,9 +50,6 @@ class OrganisationConfiguratorItem(ConfiguratorItemMixin, XMLObject):
security = ClassSecurityInfo()