workflows: refresh object after execution of external workflow (#51942)
This commit is contained in:
parent
903b424a1c
commit
0554111893
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue