diff --git a/doc/03_module_dev_01.rst b/doc/03_module_dev_01.rst index adc32c4a4e9..f35dab539a4 100644 --- a/doc/03_module_dev_01.rst +++ b/doc/03_module_dev_01.rst @@ -206,8 +206,8 @@ Extra attributes can either preprocess the body or replace its use entirely: ``@type`` (optional) One of ``char``, ``int``, ``float``, ``list``, ``tuple``, ``xml`` or - ``html`` or ``file``. Converts the ``field``'s body to the specified type - (or validates the body's content) + ``html``, ``file`` or ``base64``. Converts the ``field``'s body to the + specified type (or validates the body's content) * ``xml`` will join multiple XML nodes under a single ```` root * in ``xml`` and ``html``, external ids can be referenced using @@ -217,6 +217,13 @@ Extra attributes can either preprocess the body or replace its use entirely: * ``file`` expects a module-local path and will save the path prefixed with the current module's name, separated by a ``,`` (comma). For use with :py:func:`~openerp.modules.module.get_module_resource`. + * ``base64`` expects binary data, encodes it to base64 and sets it. Mostly + useful with ``@file`` + +``@file`` + + Can be used with types ``char`` and ``base64``, sources the field's content + from the specified file instead of the field's text body. ``@model`` diff --git a/openerp/import_xml.rng b/openerp/import_xml.rng index e694e6d64b8..8b9b58831b5 100644 --- a/openerp/import_xml.rng +++ b/openerp/import_xml.rng @@ -130,11 +130,18 @@ + base64 char file - + + + + + + + int @@ -167,10 +174,6 @@ - - - - @@ -186,9 +189,7 @@ - - - + diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index 0b65cfc63eb..29c52d4d3cf 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -175,34 +175,38 @@ def _eval_xml(self, node, pool, cr, uid, idref, context=None): if t == 'html': return _process("".join([etree.tostring(n, encoding='utf-8') for n in node]), idref) + + data = node.text if node.get('file'): - import openerp.tools - import base64 - fp = openerp.tools.file_open(node.get('file')) - result = base64.b64encode(fp.read()) - return result + with openerp.tools.file_open(node.get('file'), 'rb') as f: + data = f.read() if t == 'file': from ..modules import module - path = node.text.strip() + path = data.strip() if not module.get_module_resource(self.module, path): raise IOError("No such file or directory: '%s' in %s" % ( path, self.module)) return '%s,%s' % (self.module, path) - if t in ('char', 'int', 'float'): - d = node.text - if t == 'int': - d = d.strip() - if d == 'None': - return None - else: - return int(d.strip()) - elif t == 'float': - return float(d.strip()) - return d - elif t in ('list','tuple'): + + if t == 'char': + return data + + if t == 'base64': + return data.encode('base64') + + if t == 'int': + d = data.strip() + if d == 'None': + return None + return int(d) + + if t == 'float': + return float(data.strip()) + + if t in ('list','tuple'): res=[] - for n in node.findall('./value'): + for n in node.iterchildren(tag='value'): res.append(_eval_xml(self,n,pool,cr,uid,idref)) if t=='tuple': return tuple(res)