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 @@
-
-
\ 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: