From 4588eb576d4908124fbdcd2a7cda27a4d034c2df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 26 Nov 2015 22:14:19 +0100 Subject: [PATCH] backoffice: make 'edit' workflow stay in backoffice (#9093) --- tests/test_backoffice_pages.py | 40 +++++++++++++++++++++++++++++++++++++++- wcs/backoffice/management.py | 19 +++++++++++++++++++ wcs/backoffice/submission.py | 7 +++++-- wcs/workflows.py | 2 +- 4 files changed, 64 insertions(+), 4 deletions(-) diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index 3b8d9bf..34611ad 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -17,7 +17,7 @@ from qommon.ident.password_accounts import PasswordAccount from wcs.qommon.http_request import HTTPRequest from wcs.roles import Role from wcs.workflows import (Workflow, CommentableWorkflowStatusItem, - ChoiceWorkflowStatusItem) + ChoiceWorkflowStatusItem, EditableWorkflowStatusItem) from wcs.wf.wscall import WebserviceCallStatusItem from wcs.categories import Category from wcs.formdef import FormDef @@ -1049,6 +1049,44 @@ def test_backoffice_wscall_failure_display(pub): assert (' with the number %s.' % number31) in resp.body assert not 'Error during webservice call' in resp.body +def test_backoffice_wfedit(pub): + user = create_user(pub) + create_environment(pub) + formdef = FormDef.get_by_urlname('form-title') + form_class = formdef.data_class() + + number31 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0] + + # attach a custom workflow + workflow = Workflow(name='wfedit') + st1 = workflow.add_status('Status1', number31.status.split('-')[1]) + + wfedit = EditableWorkflowStatusItem() + wfedit.id = '_wfedit' + wfedit.by = [user.roles[0]] + st1.items.append(wfedit) + wfedit.parent = st1 + workflow.store() + + formdef.workflow_id = workflow.id + formdef.store() + + app = login(get_app(pub)) + + resp = app.get('/backoffice/management/form-title/%s/' % number31.id) + assert (' with the number %s.' % number31.id) in resp.body + resp = resp.form.submit('button_wfedit') + resp = resp.follow() + assert resp.form['f1'].value == number31.data['1'] + assert resp.form['f2'].value == number31.data['2'] + assert resp.form['f3'].value == number31.data['3'] + assert 'value="Save Changes"' in resp.body + resp.form['f2'].value = 'bar' + resp = resp.form.submit('submit') + resp = resp.follow() + assert form_class().get(number31.id).data['2'] == 'bar' + number31.store() + def test_global_listing(pub): if not pub.is_using_postgresql(): pytest.skip('this requires SQL') diff --git a/wcs/backoffice/management.py b/wcs/backoffice/management.py index 4276a88..de07e01 100644 --- a/wcs/backoffice/management.py +++ b/wcs/backoffice/management.py @@ -51,6 +51,9 @@ from wcs.admin.settings import UserFieldsFormDef from wcs.categories import Category from wcs.formdef import FormDef from wcs.roles import logged_users_role +from wcs.workflows import EditableWorkflowStatusItem + +from .submission import FormFillPage class SendCodeFormdefDirectory(Directory): @@ -1547,6 +1550,8 @@ class FormPage(Directory): class FormBackOfficeStatusPage(FormStatusPage): + _q_exports = ['', 'download', 'json', 'wfedit'] + def html_top(self, title = None): return html_top('management', title) @@ -1669,6 +1674,20 @@ class FormBackOfficeStatusPage(FormStatusPage): return r.getvalue() + def wfedit(self): + wf_status = self.filled.get_status() + for item in wf_status.items: + if not isinstance(item, EditableWorkflowStatusItem): + continue + if item.check_auth(self.filled, get_request().user): + f = FormFillPage(self.formdef.url_name) + f.edit_mode = True + get_response().breadcrumb = get_response().breadcrumb[:-1] + get_response().breadcrumb.append( ('wfedit', _('Edit')) ) + return f._q_index(editing=self.filled) + + raise errors.AccessForbiddenError() + class FakeField(object): def __init__(self, id, type_, label): diff --git a/wcs/backoffice/submission.py b/wcs/backoffice/submission.py index 3af7e6b..d2c1418 100644 --- a/wcs/backoffice/submission.py +++ b/wcs/backoffice/submission.py @@ -25,14 +25,16 @@ from wcs.formdef import FormDef from wcs.categories import Category from wcs.forms.root import FormPage as PublicFormFillPage -from .management import FormBackOfficeStatusPage - class FormFillPage(PublicFormFillPage): + edit_mode = False + def html_top(self, *args, **kwargs): return html_top('submission', *args, **kwargs) def check_role(self): + if self.edit_mode: + return True if not self.formdef.backoffice_submission_roles: raise errors.AccessUnauthorizedError() for role in get_request().user.roles or []: @@ -57,6 +59,7 @@ class FormFillPage(PublicFormFillPage): r += htmltext('

-

') if formdata and formdata.submission_context: + from .management import FormBackOfficeStatusPage r += FormBackOfficeStatusPage(self.formdef, formdata).get_extra_context_bar() return r.getvalue() diff --git a/wcs/workflows.py b/wcs/workflows.py index dd9e5fa..e0429c2 100644 --- a/wcs/workflows.py +++ b/wcs/workflows.py @@ -1656,7 +1656,7 @@ class EditableWorkflowStatusItem(WorkflowStatusItem): def submit_form(self, form, formdata, user, evo): if form.get_submit() == 'button%s' % self.id: - return formdata.get_url() + 'wfedit' + return formdata.get_url(backoffice=get_request().is_in_backoffice()) + 'wfedit' def add_parameters_widgets(self, form, parameters, prefix='', formdef=None): if 'by' in parameters: -- 2.6.2