workflow: only check expiration jumps on formdata with relevant status (#23174)

This commit is contained in:
Frédéric Péters 2018-04-13 13:36:11 +02:00
parent 34d77aa973
commit a5fb918f85
2 changed files with 22 additions and 19 deletions

View File

@ -1752,7 +1752,7 @@ def test_webservice_target_status(pub):
assert targets.count(status1) == 1
assert targets.count(status2) == 2
def test_timeout(pub):
def test_timeout(two_pubs):
workflow = Workflow(name='timeout')
st1 = workflow.add_status('Status1', 'st1')
st2 = workflow.add_status('Status2', 'st2')
@ -1780,10 +1780,16 @@ def test_timeout(pub):
formdata_id = formdata.id
time.sleep(0.3)
_apply_timeouts(pub)
_apply_timeouts(two_pubs)
assert formdef.data_class().get(formdata_id).status == 'wf-st2'
# check there's no crash on workflow without jumps
formdef = FormDef()
formdef.name = 'xxx'
formdef.store()
_apply_timeouts(two_pubs)
def test_legacy_timeout(pub):
workflow = Workflow(name='timeout')
st1 = workflow.add_status('Status1', 'st1')

View File

@ -278,24 +278,21 @@ def _apply_timeouts(publisher):
from formdef import FormDef
wfs_status = workflows_with_timeout()
for formdef_id in FormDef.keys():
formdef = FormDef.get(formdef_id, ignore_errors = True)
if not formdef:
for formdef in FormDef.select(ignore_errors=True):
status_ids = wfs_status.get(str(formdef.workflow_id))
if not status_ids:
continue
if str(formdef.workflow_id) in wfs_status.keys():
for formdata_id in formdef.data_class().keys():
formdata = formdef.data_class().get(formdata_id, ignore_errors = True)
if not formdata:
continue
if formdata.status in wfs_status[str(formdef.workflow_id)]:
for x in wfs_status[str(formdef.workflow_id)][formdata.status]:
get_publisher().substitutions.reset()
get_publisher().substitutions.feed(get_publisher())
get_publisher().substitutions.feed(formdef)
get_publisher().substitutions.feed(formdata)
if x.must_jump(formdata):
jump_and_perform(formdata, x.status)
break
formdata_class = formdef.data_class()
for status_id in status_ids:
for formdata in formdata_class.get_with_indexed_value('status', status_id, ignore_errors=True):
for x in wfs_status[str(formdef.workflow_id)][formdata.status]:
get_publisher().substitutions.reset()
get_publisher().substitutions.feed(get_publisher())
get_publisher().substitutions.feed(formdef)
get_publisher().substitutions.feed(formdata)
if x.must_jump(formdata):
jump_and_perform(formdata, x.status)
break
if get_publisher_class():
# every JUMP_TIMEOUT_INTERVAL minutes check for expired status jump