workflows: let backoffice item field be assigned from data label (#32134)

This commit is contained in:
Frédéric Péters 2019-04-10 09:30:27 +02:00
parent 3bf1110393
commit 189ede3c58
3 changed files with 43 additions and 1 deletions

View File

@ -3479,6 +3479,38 @@ def test_set_backoffice_field_item(two_pubs):
assert formdata.data['bo1_display'] == 'aa'
assert formdata.data['bo1_structured'] == {'id': 'a', 'more': 'aaa', 'text': 'aa'}
# check when assigning using the display value
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': 'aa'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'a'
assert formdata.data['bo1_display'] == 'aa'
assert formdata.data['bo1_structured'] == {'id': 'a', 'more': 'aaa', 'text': 'aa'}
# check with unknown value
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': 'foobar'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'foobar'
assert formdata.data.get('bo1_display') is None
assert formdata.data.get('bo1_structured') is None
def test_set_backoffice_field_items(two_pubs):
Workflow.wipe()
FormDef.wipe()

View File

@ -366,10 +366,17 @@ class NamedDataSource(XmlStorableObject):
if response['data']:
value = response['data'][0]
else:
for item in get_structured_items(self.data_source, mode='lazy'):
structured_items = get_structured_items(self.data_source, mode='lazy')
for item in structured_items:
if str(item['id']) == str(option_id):
value = item
break
else:
# recheck in case option label was given instead of option id.
for item in structured_items:
if str(item['text']) == str(option_id):
value = item
break
if value is None:
return None
return value

View File

@ -128,6 +128,9 @@ class SetBackofficeFieldsWorkflowStatusItem(WorkflowStatusItem):
structured_value = formdef_field.store_structured_value(
formdata.data, formdef_field.id)
if structured_value:
if isinstance(structured_value, dict) and structured_value.get('id'):
# in case of list field, override id
formdata.data['%s' % formdef_field.id] = str(structured_value.get('id'))
formdata.data['%s_structured' % formdef_field.id] = structured_value
elif '%s_structured' % formdef_field.id in formdata.data:
del formdata.data['%s_structured' % formdef_field.id]