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.qommon.template import Template, TemplateError
from wcs.conditions import Condition from wcs.conditions import Condition
from wcs.variables import LazyFormData from wcs.variables import LazyFormData
from wcs.formdef import FormDef
from wcs import fields
from utilities import create_temporary_pub, clean_temporary_pub from utilities import create_temporary_pub, clean_temporary_pub
@ -578,6 +580,36 @@ def test_get_filter():
assert tmpl.render({'foo': ['bar', 'baz']}) == 'bar' 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(): def test_reproj():
class MockFormData(object): class MockFormData(object):

View File

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