diff --git a/tests/test_templates.py b/tests/test_templates.py index 82ae10823..c07911733 100644 --- a/tests/test_templates.py +++ b/tests/test_templates.py @@ -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): diff --git a/wcs/qommon/templatetags/qommon.py b/wcs/qommon/templatetags/qommon.py index fcc7ff149..d80161c6b 100644 --- a/wcs/qommon/templatetags/qommon.py +++ b/wcs/qommon/templatetags/qommon.py @@ -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]