misc: use lazy variables for form workflow options (#41853)

This commit is contained in:
Frédéric Péters 2020-04-18 18:03:26 +02:00
parent 38ec86215e
commit 59dbf34cf6
2 changed files with 23 additions and 36 deletions

View File

@ -8008,8 +8008,14 @@ def test_structured_workflow_options(pub):
data_source=data_source),
fields.ItemsField(id='3', label='Test Multi', type='items', varname='baz',
data_source=data_source),
fields.DateField(id='4', label='Date', type='date', varname='date'),
]
st1 = workflow.add_status('Status1', 'st1')
comment = RegisterCommenterWorkflowStatusItem()
comment.id = '_comment'
comment.comment = 'Date option: {{ form_option_date }}'
st1.items.append(comment)
comment.parent = st1
workflow.store()
formdef = create_formdef()
@ -8030,6 +8036,7 @@ def test_structured_workflow_options(pub):
resp.form['f1'].value = 'plop'
resp.form['f2'].value = '1'
resp.form['f3$element1'].checked = True
resp.form['f4'].value = '2020-04-18'
resp = resp.form.submit('submit')
formdef = FormDef.get(formdef.id)
@ -8041,6 +8048,7 @@ def test_structured_workflow_options(pub):
'baz': ['1'],
'baz_display': 'un',
'baz_structured': [{'id': '1', 'more': 'foo', 'text': 'un'}],
'date': time.strptime('2020-04-18', '%Y-%m-%d')
}
app = login(get_app(pub), username='foo', password='foo')
@ -8056,3 +8064,4 @@ def test_structured_workflow_options(pub):
'1_display': 'un',
'1_structured': {'id': '1', 'text': 'un', 'more': 'foo'},
}
assert '2020-04-18' in formdata.evolution[0].parts[0].content

View File

@ -163,43 +163,9 @@ class LazyFormDef(object):
@property
def option(self):
return LazyFormDefOption(self._formdef)
class LazyFormDefOption(object):
def __init__(self, formdef):
self._formdef = formdef
def inspect_keys(self):
return self.options.keys()
_options = None
@property
def options(self):
if self._options is not None:
return self._options
self._options = {}
if not self._formdef.workflow.variables_formdef:
return self._options
if not self._formdef.workflow_options:
return self._options
for field in self._formdef.workflow.variables_formdef.fields:
if not field.varname:
continue
self._options[field.varname] = self._formdef.workflow_options.get(field.varname)
if field.store_display_value:
if '%s_display' % field.varname in self._formdef.workflow_options:
self._options[field.varname + '_raw'] = self._options[field.varname]
self._options[field.varname] = self._formdef.workflow_options[
'%s_display' % field.varname]
if field.store_structured_value:
if '%s_structured' % field.varname in self._formdef.workflow_options:
self._options[field.varname + '_structured'] = self._formdef.workflow_options.get(
'%s_structured' % field.varname)
return self._options
def __getitem__(self, key):
return self.options[key]
return {}
return LazyFormDefOptions(self._formdef)
class LazyFormData(LazyFormDef):
@ -889,3 +855,15 @@ class LazyRequest(object):
@property
def view_name(self):
return getattr(self._request, 'view_name', None)
class LazyFormDefOptions(LazyFormDataVar):
def __init__(self, formdef):
self._formdef = formdef
fields = self._formdef.workflow.variables_formdef.fields
for field in fields:
# change field IDs as options are stored in data with their
# varnames, not id.
field.id = field.varname or field.id
data = self._formdef.workflow_options
super(LazyFormDefOptions, self).__init__(fields, data)