workflows: allow a card to modify itself (#53789)

This commit is contained in:
Thomas NOËL 2021-05-05 23:20:33 +02:00
parent 51d935656a
commit 6a37360efb
2 changed files with 56 additions and 0 deletions

View File

@ -6915,6 +6915,57 @@ def test_edit_carddata_manual_targeting(two_pubs):
assert carddef.data_class().get(7).data['2'] == '3'
def test_edit_carddata_targeting_itself(pub):
CardDef.wipe()
carddef = CardDef()
carddef.name = 'Foo Card'
carddef.fields = [
StringField(id='0', label='foo', varname='foo'),
]
carddef.store()
carddef.data_class().wipe()
# card workflow: update itself then jump to second status
card_wf = Workflow(name='Card workflow')
st1 = card_wf.add_status('Status1')
st2 = card_wf.add_status('Status2')
edit = EditCarddataWorkflowStatusItem()
edit.id = '_edit'
edit.formdef_slug = carddef.url_name
edit.target_mode = 'manual'
edit.target_id = '{{ form_internal_id }}' # itself
edit.mappings = [
Mapping(field_id='0', expression='bar {{ form_internal_id }}'),
]
edit.parent = st1
st1.items.append(edit)
jump = JumpWorkflowStatusItem()
jump.id = '_jump'
jump.status = st2.id
st1.items.append(jump)
jump.parent = st1
card_wf.store()
carddef.workflow = card_wf
carddef.store()
# create some cardata
for i in range(1, 4):
carddata = carddef.data_class()()
carddata.data = {
'0': 'foo %s' % i,
}
carddata.store()
# run workflow, verify that carddata is modified
carddata.just_created()
carddata.perform_workflow()
assert carddata.data['0'] == 'bar %s' % carddata.id
assert carddata.status == 'wf-%s' % st2.id
def test_edit_carddata_from_created_object(pub):
FormDef.wipe()
CardDef.wipe()

View File

@ -47,10 +47,15 @@ class EditCarddataWorkflowStatusItem(CreateCarddataWorkflowStatusItem, ExternalW
if not carddef:
return
formdata.store()
for target_data in self.iter_target_datas(formdata, carddef):
self.apply_mappings(dest=target_data, src=formdata)
with get_publisher().substitutions.freeze():
target_data.store()
# update local object as it may have modified itself
formdata.refresh_from_storage()
register_item_class(EditCarddataWorkflowStatusItem)