diff --git a/bin/addons/__init__.py b/bin/addons/__init__.py index 40e6ee8fe23..d4dff56bfae 100644 --- a/bin/addons/__init__.py +++ b/bin/addons/__init__.py @@ -219,7 +219,7 @@ def load_module_graph(cr, graph, status=None, **kwargs): if new_query: cr.execute(new_query) else: - tools.convert_xml_import(cr, m, tools.file_open(opj(m, filename)).read(), idref, mode=mode, **kwargs) + tools.convert_xml_import(cr, m, tools.file_open(opj(m, filename)), idref, mode=mode, **kwargs) if hasattr(package, 'demo') or (package_demo and package_state != 'installed'): status['progress'] = (float(statusi)+0.75)/len(graph) for xml in package.datas.get('demo_xml', []): @@ -228,7 +228,7 @@ def load_module_graph(cr, graph, status=None, **kwargs): if ext == '.csv': tools.convert_csv_import(cr, m, os.path.basename(xml), tools.file_open(opj(m, xml)).read(), idref, noupdate=True) else: - tools.convert_xml_import(cr, m, tools.file_open(opj(m, xml)).read(), idref, noupdate=True, **kwargs) + tools.convert_xml_import(cr, m, tools.file_open(opj(m, xml)), idref, noupdate=True, **kwargs) cr.execute('update ir_module_module set demo=%s where name=%s', (True, package.name)) package_todo.append(package.name) cr.execute("update ir_module_module set state='installed' where state in ('to upgrade', 'to install') and name=%s", (package.name,)) diff --git a/bin/addons/base/base_data.xml b/bin/addons/base/base_data.xml index 1c8dccf0594..88464eb97c4 100644 --- a/bin/addons/base/base_data.xml +++ b/bin/addons/base/base_data.xml @@ -1,7 +1,6 @@ - ir.ui.menu.tree ir.ui.menu @@ -1505,4 +1504,4 @@ - \ No newline at end of file + diff --git a/bin/import_xml.rng b/bin/import_xml.rng new file mode 100644 index 00000000000..1666d368aa5 --- /dev/null +++ b/bin/import_xml.rng @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/bin/tools/convert.py b/bin/tools/convert.py index fe05a865c8f..24e578a82e1 100644 --- a/bin/tools/convert.py +++ b/bin/tools/convert.py @@ -40,6 +40,8 @@ import netsvc from config import config import logging +from lxml import etree + class ConvertError(Exception): def __init__(self, doc, orig_excpt): @@ -739,7 +741,21 @@ def convert_csv_import(cr, module, fname, csvcontent, idref=None, mode='init', # # xml import/export # -def convert_xml_import(cr, module, xmlstr, idref=None, mode='init', noupdate = False, report=None): +def convert_xml_import(cr, module, xmlfile, idref=None, mode='init', noupdate = False, report=None): + xmlstr = xmlfile.read() + xmlfile.seek(0) + relaxng_doc = etree.parse(file('import_xml.rng')) + relaxng = etree.RelaxNG(relaxng_doc) + + doc = etree.parse(xmlfile) + try: + relaxng.assert_(doc) + except Exception, e: + logger = netsvc.Logger() + logger.notifyChannel('init', netsvc.LOG_ERROR, 'The XML file do not fit the required schema !') + logger.notifyChannel('init', netsvc.LOG_ERROR, relaxng.error_log.last_error) + raise + if not idref: idref={} if report is None: