misc: add custom lazy field for map variables, for string compat (#28193)

This commit is contained in:
Frédéric Péters 2018-12-06 12:34:57 +01:00
parent b70d6d1507
commit 1e38c3e8c0
2 changed files with 24 additions and 6 deletions

View File

@ -671,12 +671,18 @@ def test_lazy_variables_missing(pub, variable_test_data):
def test_lazy_map_variable(pub, variable_test_data):
formdef = FormDef.select()[0]
formdata = formdef.data_class().select()[0]
pub.substitutions.reset()
pub.substitutions.feed(formdef)
pub.substitutions.feed(formdata)
for mode in (None, 'lazy'):
assert WorkflowStatusItem.compute('=form_var_map') == '2;4'
assert WorkflowStatusItem.compute('=form_var_map.split(";")[0]') == '2'
pub.substitutions.reset()
pub.substitutions.feed(formdef)
with pub.substitutions.temporary_feed(formdata, force_mode=mode):
assert WorkflowStatusItem.compute('=form_var_map', raises=True) == '2;4'
assert WorkflowStatusItem.compute('{{ form_var_map }}', raises=True) == '2;4'
assert WorkflowStatusItem.compute('=form_var_map.split(";")[0]', raises=True) == '2'
assert WorkflowStatusItem.compute('{{ form_var_map|split:";"|first }}', raises=True) == '2'
assert WorkflowStatusItem.compute('=form_var_map_lat', raises=True) == 2
assert WorkflowStatusItem.compute('{{ form_var_map_lat }}', raises=True) == '2.0'
assert WorkflowStatusItem.compute('=form_var_map_lon', raises=True) == 4
assert WorkflowStatusItem.compute('{{ form_var_map_lon }}', raises=True) == '4.0'
formdata.data['7'] = None
formdata.store()
@ -684,7 +690,10 @@ def test_lazy_map_variable(pub, variable_test_data):
pub.substitutions.feed(formdef)
pub.substitutions.feed(formdata)
for mode in (None, 'lazy'):
assert WorkflowStatusItem.compute('=form_var_map') is None
pub.substitutions.reset()
pub.substitutions.feed(formdef)
with pub.substitutions.temporary_feed(formdata, force_mode=mode):
assert WorkflowStatusItem.compute('=form_var_map', raises=True) is None
def test_lazy_conditions(pub, variable_test_data):
condition = Condition({'type': 'django', 'value': 'form_var_foo_foo == "bar"'})

View File

@ -307,6 +307,8 @@ class LazyFormDataVar(object):
if field.key == 'date':
return LazyFieldVarDate(self.data, field, self.formdata)
if field.key == 'map':
return LazyFieldVarMap(self.data, field, self.formdata)
return LazyFieldVar(self.data, field, self.formdata)
@ -438,6 +440,13 @@ class LazyFieldVarDate(LazyFieldVar):
return self.get_raw().tm_yday
class LazyFieldVarMap(LazyFieldVar):
def split(self, *args, **kwargs):
# Compatibility with usage of map variable as a string. It is
# recommended to use lat/lon properties instead.
return self.data.get(self.field.id).split(*args, **kwargs)
class LazyUser(object):
def __init__(self, user):
self.user = user