templatetags: make |get work with lazy vars (#43577)

This commit is contained in:
Frédéric Péters 2020-06-03 15:12:26 +02:00
parent ee2adbbf49
commit c503f7336c
2 changed files with 39 additions and 0 deletions

View File

@ -15,6 +15,8 @@ from wcs.qommon.substitution import CompatibilityNamesDict
from wcs.qommon.template import Template, TemplateError
from wcs.conditions import Condition
from wcs.variables import LazyFormData
from wcs.formdef import FormDef
from wcs import fields
from utilities import create_temporary_pub, clean_temporary_pub
@ -578,6 +580,36 @@ def test_get_filter():
assert tmpl.render({'foo': ['bar', 'baz']}) == 'bar'
def test_get_on_lazy_var():
FormDef.wipe()
formdef = FormDef()
formdef.name = 'lazy'
formdef.fields = [
fields.StringField(id='0', label='string', varname='foo'),
fields.StringField(id='1', label='string', varname='bar'),
]
formdef.store()
formdef.data_class().wipe()
formdata = formdef.data_class()()
formdata.just_created()
formdata.data = {
'0': 'bar',
'1': '1',
}
formdata.store()
context = CompatibilityNamesDict({
'form': LazyFormData(formdata),
'foo_dict': {'bar': 'baz'},
'foo_array': ['bar', 'baz'],
})
tmpl = Template('{{ foo_dict|get:form_var_foo }}')
assert tmpl.render(context) == 'baz'
tmpl = Template('{{ foo_array|get:form_var_bar }}')
assert tmpl.render(context) == 'baz'
def test_reproj():
class MockFormData(object):

View File

@ -48,8 +48,15 @@ register = template.Library()
@register.filter
def get(mapping, key):
if hasattr(key, 'get_value'):
key = key.get_value() # unlazy
if hasattr(mapping, 'get'):
return mapping.get(key)
if isinstance(mapping, (tuple, list)):
try:
key = int(key)
except (TypeError, ValueError):
pass
return mapping[key]