import openerp
import openerp.release
import openerp.workflow
+from yaml_import import convert_yaml_import
import assertion_report
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
-from lxml import etree
+from lxml import etree, builder
import misc
from config import config
from translate import _
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)
return val.lower() not in ('0', 'false', 'off')
def isnoupdate(self, data_node=None):
- if data_node and data_node.get('noupdate'):
- return len(data_node) and self.nodeattr2bool(data_node, 'noupdate', False)
- return self.noupdate
+ return self.noupdate or (len(data_node) and self.nodeattr2bool(data_node, 'noupdate', False))
def get_context(self, data_node, node, eval_dict):
data_node_context = (len(data_node) and data_node.get('context','').encode('utf8'))
module, tpl_id = tpl_id.split('.', 1)
# set the full template name for qweb <module>.<id>
if not (el.get('inherit_id') or el.get('inherit_option_id')):
- el.attrib['t-name'] = '%s.%s' % (module, tpl_id)
+ el.set('t-name', '%s.%s' % (module, tpl_id))
el.tag = 't'
else:
el.tag = 'data'
el.attrib.pop('id', None)
- record = etree.Element('record')
record_attrs = {
'id': tpl_id,
'model': 'ir.ui.view',
}
- for att in ['forcecreate', 'context']:
- if att in el.attrib:
+ for att in ['forcecreate', 'context', 'priority']:
+ if att in el.keys():
record_attrs[att] = el.attrib.pop(att)
- record.attrib.update(record_attrs)
+ Field = builder.E.field
name = el.get('name', tpl_id)
- record.append(etree.fromstring('<field name="name">%s</field>' % name))
- record.append(etree.fromstring('<field name="type">qweb</field>'))
- record.append(etree.fromstring('<field name="arch" type="xml"/>'))
- record[-1].append(el)
- for key in ('inherit_id','inherit_option_id'):
- if el.get(key):
- record.append(etree.fromstring('<field name="%s" ref="%s"/>' % (key, el.get(key))))
- el.attrib.pop(key, None)
- if el.get('page'):
- record.append(etree.Element('field', name="page", eval="True"))
+
+ record = etree.Element('record', attrib=record_attrs)
+ record.append(Field(name, name='name'))
+ record.append(Field("qweb", name='type'))
+ record.append(Field(el, name="arch", type="xml"))
+ for field_name in ('inherit_id','inherit_option_id'):
+ value = el.attrib.pop(field_name, None)
+ if value: record.append(Field(name=field_name, ref=value))
+ if el.attrib.pop('page', None) == 'True':
+ record.append(Field(name="page", eval="True"))
+
return self._tag_record(cr, record, data_node)
def id_get(self, cr, id_str):
'url': self._tag_url
}
+def convert_file(cr, module, filename, idref, mode='update', noupdate=False, kind=None, report=None):
+ pathname = os.path.join(module, filename)
+ fp = misc.file_open(pathname)
+ ext = os.path.splitext(filename)[1].lower()
+ try:
+ if ext == '.csv':
+ convert_csv_import(cr, module, pathname, fp.read(), idref, mode, noupdate)
+ elif ext == '.sql':
+ convert_sql_import(cr, fp)
+ elif ext == '.yml':
+ convert_yaml_import(cr, module, fp, kind, idref, mode, noupdate, report)
+ elif ext == '.xml':
+ convert_xml_import(cr, module, fp, idref, mode, noupdate, report)
+ elif ext == '.js':
+ pass # .js files are valid but ignored here.
+ else:
+ _logger.warning("Can't load unknown file type %s.", filename)
+ finally:
+ fp.close()
+
+def convert_sql_import(cr, fp):
+ queries = fp.read().split(';')
+ for query in queries:
+ new_query = ' '.join(query.split())
+ if new_query:
+ cr.execute(new_query)
+
def convert_csv_import(cr, module, fname, csvcontent, idref=None, mode='init',
noupdate=False):
'''Import csv file :