workflows: extend marker support to other jump types for real (#17248)

This commit is contained in:
Frédéric Péters 2017-06-29 13:31:19 +02:00
parent 6829877759
commit 3e553b881c
3 changed files with 120 additions and 7 deletions

View File

@ -3384,6 +3384,114 @@ def test_workflow_jump_previous(pub):
formdata.jump_status('_previous') # pop ()
assert formdata.status == 'wf-%s' % st1.id
def test_workflow_jump_previous_on_submit(pub):
user = create_user(pub)
create_environment(pub)
wf = Workflow(name='blah')
st1 = wf.add_status('North')
st1.id = 'north'
st2 = wf.add_status('South')
st2.id = 'south'
commentable = CommentableWorkflowStatusItem()
commentable.id = '_commentable'
commentable.by = ['_submitter', '_receiver']
commentable.button_label = 'CLICK ME!'
st1.items.append(commentable)
commentable.parent = st1
jump = JumpOnSubmitWorkflowStatusItem()
jump.id = '_jump'
jump.status = st2.id
st1.items.append(jump)
jump.parent = st1
jump.set_marker_on_status = True
back = ChoiceWorkflowStatusItem()
back.id = '_back'
back.label = 'Back'
back.by = ['_receiver']
back.status = '_previous'
st2.items.append(back)
back.parent = st2
wf.store()
formdef = FormDef.get_by_urlname('form-title')
formdef.data_class().wipe()
formdef.workflow = wf
formdef.store()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
app = login(get_app(pub))
resp = app.get('/backoffice/management/form-title/%s/' % formdata.id)
resp.form['comment'] = 'HELLO WORLD'
resp = resp.form.submit('button_commentable')
resp = resp.follow()
assert formdef.data_class().get(formdata.id).status == 'wf-south'
assert formdef.data_class().get(formdata.id).workflow_data['_markers_stack']
resp = resp.form.submit('button_back')
resp = resp.follow()
assert formdef.data_class().get(formdata.id).status == 'wf-north'
assert not formdef.data_class().get(formdata.id).workflow_data['_markers_stack']
def test_workflow_jump_previous_auto(pub):
user = create_user(pub)
create_environment(pub)
wf = Workflow(name='blah')
st1 = wf.add_status('North')
st1.id = 'north'
st2 = wf.add_status('South')
st2.id = 'south'
jump = JumpWorkflowStatusItem()
jump.id = '_auto-jump'
jump.set_marker_on_status = True
jump.status = st2.id
st1.items.append(jump)
jump.parent = st1
back = ChoiceWorkflowStatusItem()
back.id = '_back'
back.label = 'Back'
back.by = ['_receiver']
back.status = '_previous'
st2.items.append(back)
back.parent = st2
wf.store()
formdef = FormDef.get_by_urlname('form-title')
formdef.data_class().wipe()
formdef.workflow = wf
formdef.store()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
formdata.perform_workflow()
assert formdata.status == 'wf-south'
assert formdata.workflow_data['_markers_stack']
app = login(get_app(pub))
resp = app.get('/backoffice/management/form-title/%s/' % formdata.id)
resp = resp.form.submit('button_back')
resp = resp.follow()
# jumped and got back
assert formdef.data_class().get(formdata.id).status == 'wf-south'
assert not formdef.data_class().get(formdata.id).workflow_data['_markers_stack']
def test_backoffice_fields(pub):
user = create_user(pub)
create_environment(pub)

View File

@ -193,6 +193,7 @@ class JumpWorkflowStatusItem(WorkflowStatusJumpItem):
wf_status = self.get_target_status(formdata)
if wf_status:
formdata.status = 'wf-%s' % wf_status[0].id
self.handle_markers_stack(formdata)
def must_jump(self, formdata):
must_jump = True

View File

@ -1724,6 +1724,15 @@ class WorkflowStatusJumpItem(WorkflowStatusItem):
value=self.set_marker_on_status,
advanced=not(self.set_marker_on_status))
def handle_markers_stack(self, formdata):
if self.set_marker_on_status:
if formdata.workflow_data and '_markers_stack' in formdata.workflow_data:
markers_stack = formdata.workflow_data.get('_markers_stack')
else:
markers_stack = []
markers_stack.append({'status_id': formdata.status[3:]})
formdata.update_workflow_data({'_markers_stack': markers_stack})
def get_parameters(self):
return ('status', 'set_marker_on_status')
@ -1936,13 +1945,7 @@ class ChoiceWorkflowStatusItem(WorkflowStatusJumpItem):
wf_status = self.get_target_status(formdata)
if wf_status:
evo.status = 'wf-%s' % wf_status[0].id
if self.set_marker_on_status:
if formdata.workflow_data and '_markers_stack' in formdata.workflow_data:
markers_stack = formdata.workflow_data.get('_markers_stack')
else:
markers_stack = []
markers_stack.append({'status_id': formdata.status[3:]})
formdata.update_workflow_data({'_markers_stack': markers_stack})
self.handle_markers_stack(formdata)
form.clear_errors()
return True # get out of processing loop
@ -1992,6 +1995,7 @@ class JumpOnSubmitWorkflowStatusItem(WorkflowStatusJumpItem):
wf_status = self.get_target_status(formdata)
if wf_status:
evo.status = 'wf-%s' % wf_status[0].id
self.handle_markers_stack(formdata)
def get_parameters(self):
return ('status', 'set_marker_on_status')