misc: fix access to _live_ variables when using complex data (#49800)

This commit is contained in:
Frédéric Péters 2021-01-02 10:17:38 +01:00
parent 39bd8e5a25
commit a58551e616
2 changed files with 69 additions and 2 deletions

View File

@ -8448,6 +8448,72 @@ def test_backoffice_fields_just_after_conditional_form_edit_action(pub):
assert formdata.data['bo2'] == 'moreA1 vs '
def test_backoffice_fields_set_from_live(pub):
carddef = CardDef()
carddef.name = 'items'
carddef.digest_template = '{{form_var_name}}'
carddef.fields = [
fields.StringField(id='0', label='string', varname='name'),
fields.StringField(id='1', label='string', varname='attr'),
]
carddef.store()
for i, value in enumerate(['foo', 'bar', 'baz']):
carddata = carddef.data_class()()
carddata.data = {
'0': value,
'1': 'attr%s' % i,
}
carddata.just_created()
carddata.store()
Workflow.wipe()
workflow = Workflow(name='test')
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields = [
fields.StringField(
id='bo1', label='first text', type='string', varname='both_text'),
fields.StringField(
id='bo2', label='first more', type='string', varname='both_more')
]
st1 = workflow.add_status('Status1', 'st1')
setbo = SetBackofficeFieldsWorkflowStatusItem()
setbo.parent = st1
setbo.fields = [
{'field_id': 'bo1',
'value': '{{ form_var.foo.attr }}'},
{'field_id': 'bo2',
'value': '{{ form_var.foo.live.var.attr }}'},
]
st1.items.append(setbo)
workflow.store()
ds = {'type': 'carddef:%s' % carddef.url_name}
formdef = create_formdef()
formdef.fields = [
fields.ItemField(id='1', label='string', type='item', varname='foo',
data_source=ds, display_disabled_items=True)
]
formdef.workflow_id = workflow.id
formdef.store()
formdef.data_class().wipe()
create_user_and_admin(pub)
resp = get_app(pub).get('/test/')
resp.form['f1'].value = '2'
resp = resp.form.submit('submit') # -> validation page
resp = resp.form.submit('submit') # -> submit
resp = resp.follow()
assert 'The form has been recorded' in resp.text
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.data['1'] == '2'
assert formdata.data['bo1'] == 'attr1'
assert formdata.data['bo2'] == 'attr1'
def test_form_recall_draft(pub):
user = create_user(pub)

View File

@ -751,9 +751,10 @@ class LazyFieldVarStructured(LazyFieldVar):
if not (self._field.data_source and self._field.data_source.get('type', '').startswith('carddef:')):
raise AttributeError('live')
request = get_request()
card_id = self._data.get(self._field.id)
if request:
# cache during request
cache_key = '%s-%s' % (self._field.data_source['type'], self.raw)
cache_key = '%s-%s' % (self._field.data_source['type'], card_id)
if not hasattr(request, 'live_card_cache'):
request.live_card_cache = {}
else:
@ -766,7 +767,7 @@ class LazyFieldVarStructured(LazyFieldVar):
from wcs.carddef import CardDef
try:
carddef = CardDef.get_by_urlname(self._field.data_source['type'].split(':')[1])
carddata = carddef.data_class().get(self.raw)
carddata = carddef.data_class().get(card_id)
if request:
request.live_card_cache[cache_key] = carddata
except KeyError: