misc: add disable-ezt-support feature flag (#85112)

This commit is contained in:
Frédéric Péters 2023-12-24 11:55:24 +01:00
parent 83b0032a88
commit 614c148dd3
3 changed files with 56 additions and 37 deletions

View File

@ -13,6 +13,7 @@ from wcs.qommon.ezt import (
UnmatchedEndError,
_re_parse,
)
from wcs.qommon.template import Template as QommonTemplate
from wcs.scripts import ScriptsSubstitutionProxy
from .utilities import clean_temporary_pub, create_temporary_pub
@ -271,3 +272,19 @@ def test_re_parse():
assert _re_parse.split('x [a] y [b] z') == ['x ', 'a', None, ' y ', 'b', None, ' z']
assert _re_parse.split('[a "b" c "d"]') == ['', 'a "b" c "d"', None, '']
assert _re_parse.split(r'["a \"b[foo]" c.d f]') == ['', '"a \\"b[foo]" c.d f', None, '']
def test_disable(pub):
template = QommonTemplate('<p>[foo]</p>')
assert template.render(context={'foo': 'bar'}) == '<p>bar</p>'
pub.load_site_options()
if not pub.site_options.has_section('options'):
pub.site_options.add_section('options')
pub.site_options.set('options', 'disable-ezt-support', 'true')
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
pub.site_options.write(fd)
pub.load_site_options()
template = QommonTemplate('<p>[foo]</p>')
assert template.render(context={'foo': 'bar'}) == '<p>[foo]</p>'

View File

@ -44,7 +44,7 @@ def teardown_module(module):
clean_temporary_pub()
def test_template():
def test_template(pub):
tmpl = Template('')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'bar'}) == ''
@ -116,7 +116,7 @@ def test_now_and_today_variables(pub):
assert tmpl.render(context) == now
def test_template_templatetag():
def test_template_templatetag(pub):
# check qommon templatetags are always loaded
tmpl = Template('{{ date|parse_datetime|date:"Y" }}')
assert tmpl.render({'date': '2018-06-06'}) == '2018'
@ -126,21 +126,21 @@ def test_template_templatetag():
assert tmpl.render() == 'hello'
def test_startswith_templatetag():
def test_startswith_templatetag(pub):
tmpl = Template('{% if foo|startswith:"bar" %}hello{% endif %}')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'bar-baz'}) == 'hello'
assert tmpl.render({'foo': 'baz-bar'}) == ''
def test_endswith_templatetag():
def test_endswith_templatetag(pub):
tmpl = Template('{% if foo|endswith:"bar" %}hello{% endif %}')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'baz-bar'}) == 'hello'
assert tmpl.render({'foo': 'bar-baz'}) == ''
def test_split_templatetag():
def test_split_templatetag(pub):
tmpl = Template('{{ foo|split|last }}')
assert tmpl.render() == ''
assert tmpl.render({'foo': 'bar baz'}) == 'baz'
@ -152,7 +152,7 @@ def test_split_templatetag():
assert tmpl.render({'foo': 'baz-bar'}) == 'bar'
def test_strip_templatetag():
def test_strip_templatetag(pub):
tmpl = Template('{{ foo|strip:"_" }}')
assert tmpl.render() == ''
assert tmpl.render({'foo': None}) == ''
@ -164,7 +164,7 @@ def test_strip_templatetag():
assert tmpl.render({'foo': ' foo barXX'}) == 'foo bar'
def test_removeprefix_templatetag():
def test_removeprefix_templatetag(pub):
tmpl = Template('{{ foo|removeprefix }}')
assert tmpl.render() == ''
assert tmpl.render({'foo': None}) == ''
@ -179,7 +179,7 @@ def test_removeprefix_templatetag():
assert tmpl.render({'foo': 'XYXYfoo barXY'}) == 'XYfoo barXY'
def test_removesuffix_templatetag():
def test_removesuffix_templatetag(pub):
tmpl = Template('{{ foo|removesuffix }}')
assert tmpl.render() == ''
assert tmpl.render({'foo': None}) == ''
@ -194,7 +194,7 @@ def test_removesuffix_templatetag():
assert tmpl.render({'foo': 'XYfoo barXYXY'}) == 'XYfoo barXY'
def test_urljoin_templatefilter():
def test_urljoin_templatefilter(pub):
tmpl = Template('{{ foo|urljoin }}')
assert tmpl.render() == ''
assert tmpl.render({'foo': None}) == ''
@ -245,7 +245,7 @@ def test_unaccent_templatetag(pub):
assert tmpl.render(context) == ''
def test_template_encoding():
def test_template_encoding(pub):
# django
tmpl = Template('{{ foo }} à vélo')
assert tmpl.render() == 'à vélo'
@ -435,12 +435,12 @@ def test_date_maths(pub):
assert tmpl.render({'plop': '2017-12-21 18:00'}) == '2017-12-21 18:12:30'
def test_variable_unicode_error_handling():
def test_variable_unicode_error_handling(pub):
tmpl = Template('{{ form_var_éléphant }}')
assert tmpl.render() == ''
def test_decimal_templatetag():
def test_decimal_templatetag(pub):
tmpl = Template('{{ plop|decimal }}')
assert tmpl.render({'plop': 'toto'}) == '0'
assert tmpl.render({'plop': '3.14'}) == '3.14'
@ -481,7 +481,7 @@ def test_decimal_templatetag():
assert tmpl.render() == 'hello'
def test_mathematics_templatetag():
def test_mathematics_templatetag(pub):
tmpl = Template('{{ term1|add:term2 }}')
# using strings
@ -594,7 +594,7 @@ def test_mathematics_templatetag():
assert tmpl.render({'term1': 2, 'term2': 3}) == '2.00'
def test_rounding_templatetag():
def test_rounding_templatetag(pub):
# ceil
tmpl = Template('{{ value|ceil }}')
assert tmpl.render({'value': 3.14}) == '4'
@ -628,7 +628,7 @@ def test_rounding_templatetag():
assert tmpl.render({'value': None}) == '0'
def test_abs_templatetag():
def test_abs_templatetag(pub):
tmpl = Template('{{ value|abs }}')
assert tmpl.render({'value': 3.14}) == '3.14'
assert tmpl.render({'value': -3.14}) == '3.14'
@ -641,7 +641,7 @@ def test_abs_templatetag():
assert tmpl.render({'value': None}) == '0'
def test_clamp_templatetag():
def test_clamp_templatetag(pub):
tmpl = Template('{{ value|clamp:"3.5 5.5" }}')
assert tmpl.render({'value': 4}) == '4'
assert tmpl.render({'value': 6}) == '5.5'
@ -656,7 +656,7 @@ def test_clamp_templatetag():
assert tmpl.render({'value': 4}) == ''
def test_limit_templatetags():
def test_limit_templatetags(pub):
for v in (3.5, '"3.5"', 'xxx'):
tmpl = Template('{{ value|limit_low:%s }}' % v)
assert tmpl.render({'value': 4, 'xxx': 3.5}) == '4'
@ -675,7 +675,7 @@ def test_limit_templatetags():
assert tmpl.render({'value': 3, 'xxx': 'plop'}) == ''
def test_token_decimal():
def test_token_decimal(pub):
tokens = [Template('{% token_decimal 4 %}').render() for i in range(100)]
assert all(len(token) == 4 for token in tokens)
assert all(token.isdigit() for token in tokens)
@ -687,7 +687,7 @@ def test_token_decimal():
assert t.render({'token1': tokens[0] + ' ', 'token2': tokens[0].lower()}) == ''
def test_token_alphanum():
def test_token_alphanum(pub):
tokens = [Template('{% token_alphanum 4 %}').render() for i in range(100)]
assert all(len(token) == 4 for token in tokens)
assert all(token.upper() == token for token in tokens)
@ -703,7 +703,7 @@ def test_token_alphanum():
assert t.render({'token1': tokens[0] + ' ', 'token2': tokens[0].lower()}) == 'ok'
def test_distance():
def test_distance(pub):
t = Template(
'{{ "48;2"|distance:"48.1;2.1"|floatformat }}',
)
@ -758,7 +758,7 @@ def test_get_filter():
assert tmpl.render({'foo': 23}) == ''
def test_get_on_lazy_var():
def test_get_on_lazy_var(pub):
FormDef.wipe()
formdef = FormDef()
formdef.name = 'lazy'
@ -790,7 +790,7 @@ def test_get_on_lazy_var():
assert tmpl.render(context) == 'baz'
def test_reproj():
def test_reproj(pub):
class MockFormData:
formdef = None
geolocations = {'base': {'lat': 48, 'lon': 2}}
@ -802,7 +802,7 @@ def test_reproj():
assert int(float(coords[1])) == 5422836
def test_phonenumber_fr():
def test_phonenumber_fr(pub):
t = Template('{{ number|phonenumber_fr }}')
assert t.render({'number': '01 23 45 67 89'}) == '01 23 45 67 89'
assert t.render({'number': '0 1 23 45 67 89'}) == '01 23 45 67 89'
@ -879,7 +879,7 @@ def test_is_french_mobile_phone_number(pub):
@pytest.mark.skipif('langdetect is None')
def test_language_detect():
def test_language_detect(pub):
t = Template('{{ plop|language_detect }}')
assert t.render({'plop': 'Good morning world'}) == 'en'
assert t.render({'plop': 'Bonjour tout le monde'}) == 'fr'
@ -915,7 +915,7 @@ def test_language_detect():
(datetime.date.today() + datetime.timedelta(days=1), False),
],
)
def test_datetime_in_past(value, expected):
def test_datetime_in_past(pub, value, expected):
t = Template('{{ value|datetime_in_past }}')
assert t.render({'value': value}) == str(expected)
@ -1265,7 +1265,7 @@ def test_age_in_working_days_weekend(settings, pub):
assert t.render({'value': '2020-06-19'}) == '2'
def test_sum():
def test_sum(pub):
tmpl = Template('{{ "2 29.5 9,5 .5"|split|sum }}')
assert tmpl.render({}) == '41.5'
tmpl = Template('{{ list|sum }}')
@ -1278,7 +1278,7 @@ def test_sum():
assert tmpl.render({}) == ''
def test_getlist():
def test_getlist(pub):
class FakeBlock:
def getlist(self, key):
return {'foo': ['foo1', 'foo2'], 'bar': ['bar1', 'bar2']}[key]
@ -1294,7 +1294,7 @@ def test_getlist():
assert tmpl.render({'egg': 42}) == '0'
def test_getlistdict():
def test_getlistdict(pub):
class FakeBlock:
def getlistdict(self, keys):
data = [
@ -1317,7 +1317,7 @@ def test_getlistdict():
assert tmpl.render({'egg': 42}) == '0'
def test_django_contrib_humanize_filters():
def test_django_contrib_humanize_filters(pub):
tmpl = Template('{{ foo|intcomma }}')
assert tmpl.render({'foo': 10000}) == '10,000'
assert tmpl.render({'foo': '10000'}) == '10,000'
@ -1326,7 +1326,7 @@ def test_django_contrib_humanize_filters():
assert tmpl.render({'foo': '10000'}) == '10 000'
def test_is_empty():
def test_is_empty(pub):
tmpl = Template('{{ foo|is_empty }}')
assert tmpl.render({}) == 'True'
assert tmpl.render({'foo': ''}) == 'True'
@ -1339,7 +1339,7 @@ def test_is_empty():
assert tmpl.render({'foo': {'foo': 42}}) == 'False'
def test_first():
def test_first(pub):
class MockFormData:
formdef = None
@ -1354,7 +1354,7 @@ def test_first():
assert tmpl.render({'foo': {'bar': 'baz'}}) == ''
def test_last():
def test_last(pub):
class MockFormData:
formdef = None
@ -1369,7 +1369,7 @@ def test_last():
assert tmpl.render({'foo': {'bar': 'baz'}}) == ''
def test_random():
def test_random(pub):
class MockFormData:
formdef = None
@ -1384,7 +1384,7 @@ def test_random():
assert tmpl.render({'foo': {'bar': 'baz'}}) == ''
def test_convert_as_list():
def test_convert_as_list(pub):
tmpl = Template('{{ foo|list|first }}')
assert tmpl.render({'foo': ['foo']}) == 'foo'
@ -1399,7 +1399,7 @@ def test_convert_as_list():
assert tmpl.render({'foo': list_range}) == '0'
def test_convert_as_list_with_add():
def test_convert_as_list_with_add(pub):
tmpl = Template('{{ foo|list|add:bar|join:", " }}')
assert tmpl.render({'foo': [1, 2], 'bar': ['a', 'b']}) == '1, 2, a, b'
assert tmpl.render({'foo': [1, 2], 'bar': 'ab'}) == '1, 2, ab'
@ -1418,7 +1418,7 @@ def test_adjust_to_week_monday(pub):
assert t.render({'value': datetime.datetime(2021, 6, 14, 0, 0)}) == '2021-06-14'
def test_convert_as_set():
def test_convert_as_set(pub):
tmpl = Template('{{ foo|set|join:","}}')
def render(value):

View File

@ -255,6 +255,8 @@ class Template:
self.value = value
self.raises = raises
disable_ezt = get_publisher().has_site_option('disable-ezt-support')
if ('{{' in value or '{%' in value) and not ezt_only: # Django template
self.format = 'django'
self.render = self.django_render
@ -269,7 +271,7 @@ class Template:
raise TemplateError(_('syntax error in Django template: %s'), e)
self.render = self.null_render
elif '[' in value and '<!--[if gte' not in value:
elif '[' in value and '<!--[if gte' not in value and (ezt_only or not disable_ezt):
# ezt template with protection against office copy/paste.
self.format = 'ezt'
self.render = self.ezt_render