misc: fix access to _live_ variables when using complex data (#49800)
This commit is contained in:
parent
39bd8e5a25
commit
a58551e616
|
@ -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)
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue