workflows: refresh object after execution of external workflow (#51942)

This commit is contained in:
Frédéric Péters 2021-03-12 09:19:55 +01:00
parent 903b424a1c
commit 0554111893
4 changed files with 83 additions and 0 deletions

View File

@ -6656,3 +6656,71 @@ def test_edit_carddata_manual_targeting(two_pubs):
assert carddef.data_class().get(5).data['2'] == '2'
assert carddef.data_class().get(6).data['2'] == '2'
assert carddef.data_class().get(7).data['2'] == '3'
def test_edit_carddata_from_created_object(pub):
FormDef.wipe()
CardDef.wipe()
carddef = CardDef()
carddef.name = 'Card'
carddef.fields = [
StringField(id='0', label='Card Field', varname='card_field'),
]
carddef.store()
formdef = FormDef()
formdef.name = 'Form'
formdef.fields = [
StringField(id='0', label='Form Field', varname='form_field'),
]
formdef.store()
# card workflow: create formdata then jump to second status
card_wf = Workflow(name='Card workflow')
st1 = card_wf.add_status('Status1')
st2 = card_wf.add_status('Status2')
create = CreateFormdataWorkflowStatusItem()
create.id = '_create'
create.formdef_slug = formdef.url_name
create.mappings = [
Mapping(field_id='0', expression='...'),
]
create.parent = st1
st1.items.append(create)
jump = JumpWorkflowStatusItem()
jump.id = '_jump'
jump.status = st2.id
st1.items.append(jump)
jump.parent = st1
# form workflow: edit parent card data
form_wf = Workflow(name='Form workflow')
st1 = form_wf.add_status('Status1')
edit = EditCarddataWorkflowStatusItem()
edit.formdef_slug = carddef.url_name
edit.mappings = [
Mapping(field_id='0', expression='HELLO'),
]
edit.id = 'edit'
st1.items.append(edit)
edit.parent = st1
form_wf.store()
carddef.workflow = card_wf
carddef.store()
formdef.workflow = form_wf
formdef.store()
carddata = carddef.data_class()()
carddata.data = {'0': 'Foo'}
carddata.store()
carddata.just_created()
carddata.perform_workflow()
carddata_reloaded = carddata.get(carddata.id)
assert carddata_reloaded.data['0'] == 'HELLO'
assert carddata_reloaded.status == 'wf-2'

View File

@ -314,6 +314,10 @@ class FormData(StorableObject):
# store changes
super(FormData, self).store(*args, **kwargs)
def refresh_from_storage(self):
obj = self.get(self.id)
self.__dict__ = obj.__dict__
def get_user(self):
if self.user_id and self.user_id != 'ultra-user':
return get_publisher().user_class.get(self.user_id, ignore_errors=True)

View File

@ -427,6 +427,8 @@ class CreateFormdataWorkflowStatusItem(WorkflowStatusItem):
if formdef.enable_tracking_codes:
code.formdata = new_formdata # this will .store() the code
else:
formdata.store()
# freeze substitutions during submission, as it has side effects
with get_publisher().substitutions.freeze():
new_formdata.just_created()
@ -436,6 +438,10 @@ class CreateFormdataWorkflowStatusItem(WorkflowStatusItem):
new_formdata.perform_workflow()
new_formdata.store()
# update local object as it may have been modified by new_formdata
# workflow execution.
formdata.refresh_from_storage()
if new_formdata.user_id is None and not new_formdata.backoffice_submission and get_session():
get_session().mark_anonymous_formdata(new_formdata)

View File

@ -217,6 +217,7 @@ class ExternalWorkflowGlobalAction(WorkflowStatusItem):
caller_source = CallerSource(formdata)
formdata.store()
for target_data in self.iter_target_datas(formdata, objectdef):
with get_publisher().substitutions.temporary_feed(target_data):
get_publisher().substitutions.reset()
@ -226,5 +227,9 @@ class ExternalWorkflowGlobalAction(WorkflowStatusItem):
get_publisher().substitutions.feed(caller_source)
perform_items(trigger.parent.items, target_data)
# update local object as it may have been modified by target_data
# workflow executions.
formdata.refresh_from_storage()
register_item_class(ExternalWorkflowGlobalAction)