• Arnaud Fontaine's avatar
    py2/py3: Make Products code compatible with both python2 and python3. · a17bb910
    Arnaud Fontaine authored
    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).
    a17bb910
module.erp5.TransformOdtToHtml.py 1.08 KB
from Products.PortalTransforms.interfaces import itransform
from zope.interface import implementer
from Products.ERP5OOo.transforms.oood_commandtransform import OOOdCommandTransform, OOoDocumentDataStream


@implementer(itransform)
class OdtToHtml:
  """Transforms odt to html by using Cloudooo"""

  __name__ = 'odt_to_html'
  inputs   = ('application/vnd.oasis.opendocument.text',)
  output = 'text/html'

  tranform_engine = OOOdCommandTransform.__module__

  def name(self):
    return self.__name__

  def __getattr__(self, attr):
    if attr == 'inputs':
      return self.config['inputs']
    if attr == 'output':
      return self.config['output']
    raise AttributeError(attr)

  def convert(self, orig, data, cache=None, filename=None, context=None, **kwargs):
    data = str(orig)
    odt = OOOdCommandTransform(context, filename, data, self.inputs[0])
    html = odt.convertTo('html')
    if cache is not None:
      cache.setData(html)
      return cache
    else:
      stream = OOoDocumentDataStream()
      stream.setData(html)
      return stream

def register():
  return OdtToHtml()