forms: add support for _live subvariables in cascaded computed fields (#59305)

This commit is contained in:
Frédéric Péters 2021-12-03 11:16:39 +01:00
parent cd70082556
commit 6808368cab
2 changed files with 15 additions and 3 deletions

View File

@ -623,13 +623,19 @@ def test_computed_field_with_data_source(pub):
freeze_on_initial_value=True,
data_source=ds,
),
fields.CommentField(id='2', label='X{{ form_var_computed_live_var_name }}Y', type='comment'),
fields.ComputedField(
id='2', label='computed2', varname='b', value_template='B{{form_var_computed_live_var_name}}B'
),
fields.CommentField(id='3', label='X{{ form_var_computed_live_var_name }}Y', type='comment'),
fields.CommentField(id='4', label='X{{ form_var_b }}Y', type='comment'),
]
formdef.store()
formdef.data_class().wipe()
resp = get_app(pub).get('/test/?param=%s' % carddata.id)
assert 'XbazY' in resp.text
assert 'XBbazBY' in resp.text
resp = get_app(pub).get('/test/?param=%s' % 'invalid')
assert 'XY' in resp.text
assert 'XBBY' in resp.text

View File

@ -646,10 +646,14 @@ class FormPage(Directory, FormTemplateMixin):
# create a temporary map using form variable names, to be used as context
# variables during evaluation (via temporary_feed below), so we can have
# computed fields depending on previously computed fields from the same page.
from wcs.variables import LazyFieldVarComputed
mapped_computed_values = {}
for field in fields:
if field.id in computed_values:
mapped_computed_values['form_var_%s' % field.varname] = computed_values[field.id]
mapped_computed_values['form_var_%s' % field.varname] = LazyFieldVarComputed(
{str(field.id): computed_values[field.id]}, field=field
)
with get_publisher().substitutions.temporary_feed(mapped_computed_values, force_mode='lazy'):
for field in fields:
@ -666,7 +670,9 @@ class FormPage(Directory, FormTemplateMixin):
else:
value = get_publisher().get_cached_complex_data(value)
computed_values[field.id] = value
mapped_computed_values['form_var_%s' % field.varname] = value
mapped_computed_values['form_var_%s' % field.varname] = LazyFieldVarComputed(
{str(field.id): computed_values[field.id]}, field=field
)
get_publisher().substitutions.invalidate_cache()
return computed_values