diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index 72d0b0fde..83f4f6d6a 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -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) diff --git a/wcs/wf/jump.py b/wcs/wf/jump.py index c2c92b502..7311960ea 100644 --- a/wcs/wf/jump.py +++ b/wcs/wf/jump.py @@ -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 diff --git a/wcs/workflows.py b/wcs/workflows.py index ca85fac5d..b0610a58f 100644 --- a/wcs/workflows.py +++ b/wcs/workflows.py @@ -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')