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

1# -*- coding: utf-8 -*- 

2# Part of Odoo. See LICENSE file for full copyright and licensing details. 

3 

4import dateutil.relativedelta as relativedelta 

5import functools 

6import re 

7 

8from markupsafe import Markup 

9from werkzeug import urls 

10 

11from odoo.tools import safe_eval 

12 

13INLINE_TEMPLATE_REGEX = re.compile(r"\{\{(.+?)(\|\|\|\s*(.*?))?\}\}") 

14 

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) 

20 

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} 

38 

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() 

48 

49 # string past last regex match 

50 literal = text[current_literal_index:] 

51 if literal: 

52 groups.append((literal, '', '')) 

53 

54 return groups 

55 

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) 

65 

66def render_inline_template(template_instructions, variables): 

67 results = [] 

68 for string, expression, default in template_instructions: 

69 results.append(string) 

70 

71 if expression: 

72 result = safe_eval.safe_eval(expression, variables) or default 

73 if result: 

74 results.append(str(result)) 

75 

76 return ''.join(results)