Coverage for adhoc-cicd-odoo-odoo / odoo / tools / rendering_tools.py: 78%
40 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 18:15 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-03-09 18:15 +0000
1# -*- coding: utf-8 -*-
2# Part of Odoo. See LICENSE file for full copyright and licensing details.
4import dateutil.relativedelta as relativedelta
5import functools
6import re
8from markupsafe import Markup
9from werkzeug import urls
11from odoo.tools import safe_eval
13INLINE_TEMPLATE_REGEX = re.compile(r"\{\{(.+?)(\|\|\|\s*(.*?))?\}\}")
15def relativedelta_proxy(*args, **kwargs):
16 # dateutil.relativedelta is an old-style class and cannot be directly
17 # instanciated wihtin a jinja2 expression, so a lambda "proxy" is
18 # is needed, apparently
19 return relativedelta.relativedelta(*args, **kwargs)
21template_env_globals = {
22 'str': str,
23 'quote': urls.url_quote,
24 'urlencode': urls.url_encode,
25 'datetime': safe_eval.datetime,
26 'len': len,
27 'abs': abs,
28 'min': min,
29 'max': max,
30 'sum': sum,
31 'filter': filter,
32 'reduce': functools.reduce,
33 'map': map,
34 'relativedelta': relativedelta.relativedelta,
35 'round': round,
36 'hasattr': hasattr,
37}
39def parse_inline_template(text):
40 groups = []
41 current_literal_index = 0
42 for match in INLINE_TEMPLATE_REGEX.finditer(text):
43 literal = text[current_literal_index:match.start()]
44 expression = match.group(1)
45 default = match.group(3)
46 groups.append((literal, expression.strip(), default or ''))
47 current_literal_index = match.end()
49 # string past last regex match
50 literal = text[current_literal_index:]
51 if literal:
52 groups.append((literal, '', ''))
54 return groups
56def convert_inline_template_to_qweb(template):
57 template_instructions = parse_inline_template(template or '')
58 preview_markup = []
59 for string, expression, default in template_instructions:
60 if expression:
61 preview_markup.append(Markup('{}<t t-out="{}">{}</t>').format(string, expression, default))
62 else:
63 preview_markup.append(string)
64 return Markup('').join(preview_markup)
66def render_inline_template(template_instructions, variables):
67 results = []
68 for string, expression, default in template_instructions:
69 results.append(string)
71 if expression:
72 result = safe_eval.safe_eval(expression, variables) or default
73 if result:
74 results.append(str(result))
76 return ''.join(results)