diff options
| author | Mitali Patel <mpa@odoo.com> | 2017-09-14 13:46:00 +0530 |
|---|---|---|
| committer | Raphael Collet <rco@odoo.com> | 2017-09-14 10:16:00 +0200 |
| commit | 70942e4cfb7a8993904b4d142e3b1749a40db806 (patch) | |
| tree | 58a3d7dabba6eeb9150985aa5aa5d4201d3dd69f /odoo/tools/view_validation.py | |
| parent | 93d4da977a2ad41dd0547977f3faace55df2cc76 (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.py | 31 |
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.""" |
