summaryrefslogtreecommitdiff
path: root/odoo/tools/view_validation.py
diff options
context:
space:
mode:
authorMitali Patel <mpa@odoo.com>2017-09-14 13:46:00 +0530
committerRaphael Collet <rco@odoo.com>2017-09-14 10:16:00 +0200
commit70942e4cfb7a8993904b4d142e3b1749a40db806 (patch)
tree58a3d7dabba6eeb9150985aa5aa5d4201d3dd69f /odoo/tools/view_validation.py
parent93d4da977a2ad41dd0547977f3faace55df2cc76 (diff)
[IMP] base: improve view rng validation (#17902)
Split big universal RNG into view-specific schemas and moved rng based view validation into view_validation.py file. Adapt old views, and remove deprecated tag `version="7.0"` from views.
Diffstat (limited to 'odoo/tools/view_validation.py')
-rw-r--r--odoo/tools/view_validation.py31
1 files changed, 31 insertions, 0 deletions
diff --git a/odoo/tools/view_validation.py b/odoo/tools/view_validation.py
index 40a85f18ccd..1ffdd43e58b 100644
--- a/odoo/tools/view_validation.py
+++ b/odoo/tools/view_validation.py
@@ -2,11 +2,17 @@
import collections
import logging
+import os
+
+from lxml import etree
+from odoo import tools
_logger = logging.getLogger(__name__)
_validators = collections.defaultdict(list)
+_relaxng_cache = {}
+
def valid_view(arch):
for pred in _validators[arch.tag]:
if not pred(arch):
@@ -25,6 +31,31 @@ def validate(*view_types):
return decorator
+def relaxng(view_type):
+ """ Return a validator for the given view type, or None. """
+ if view_type not in _relaxng_cache:
+ with tools.file_open(os.path.join('base', 'rng', '%s_view.rng' % view_type)) as frng:
+ try:
+ relaxng_doc = etree.parse(frng)
+ _relaxng_cache[view_type] = etree.RelaxNG(relaxng_doc)
+ except Exception:
+ _logger.exception('Failed to load RelaxNG XML schema for views validation')
+ _relaxng_cache[view_type] = None
+ return _relaxng_cache[view_type]
+
+
+@validate('calendar', 'diagram', 'gantt', 'graph', 'pivot', 'search', 'tree')
+def schema_valid(arch):
+ """ Get RNG validator and validate RNG file."""
+ validator = relaxng(arch.tag)
+ if validator and not validator.validate(arch):
+ result = True
+ for error in validator.error_log:
+ _logger.error(tools.ustr(error))
+ result = False
+ return result
+ return True
+
@validate('form')
def valid_page_in_book(arch):
"""A `page` node must be below a `notebook` node."""