From 0cfe642db70970450eaaf11cd1a0d26ccae776b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sun, 18 Nov 2018 11:56:14 +0100 Subject: [PATCH] backoffice: add support for a return URL after submission (#25306) --- tests/test_backoffice_pages.py | 36 ++++++++++++++++++++++++++++++++++ wcs/backoffice/submission.py | 26 +++++++++++++++++++----- wcs/forms/root.py | 7 ++++--- 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index e67a29848..43ee5c0c0 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -1633,6 +1633,42 @@ def test_backoffice_submission_initiated_from_welco(pub, welco_url): assert pq('#steps li.current .label').text() == '1st PAGE' assert 'Field on 1st page' in resp.body # and in fields +def test_backoffice_submission_with_return_url(pub): + user = create_user(pub) + create_environment(pub) + + formdef = FormDef.get_by_urlname('form-title') + formdef.backoffice_submission_roles = user.roles[:] + formdef.enable_tracking_codes = True + formdef.store() + + app = login(get_app(pub)) + resp = app.get('/backoffice/submission/form-title/?ReturnURL=https://example.org') + resp = resp.follow().follow() + resp = resp.form.submit('cancel') + assert resp.location == 'https://example.org' + + resp = app.get('/backoffice/submission/form-title/?ReturnURL=https://example.org') + resp = resp.follow().follow() + resp.form['f1'] = 'test submission' + resp.form['f2'] = 'baz' + resp.form['f3'] = 'C' + resp = resp.form.submit('submit') # -> to validation + resp = resp.form.submit('submit') # -> to submit + assert resp.location.startswith('http://example.net/backoffice/management/form-title/') + + # test submission when agent is not receiver + formdef.workflow_roles = {} + formdef.store() + resp = app.get('/backoffice/submission/form-title/?ReturnURL=https://example.org') + resp = resp.follow().follow() + resp.form['f1'] = 'test submission' + resp.form['f2'] = 'baz' + resp.form['f3'] = 'C' + resp = resp.form.submit('submit') # -> to validation + resp = resp.form.submit('submit') # -> to submit + assert resp.location == 'https://example.org' + def test_backoffice_parallel_submission(pub): user = create_user(pub) create_environment(pub) diff --git a/wcs/backoffice/submission.py b/wcs/backoffice/submission.py index 6ee7affec..283882625 100644 --- a/wcs/backoffice/submission.py +++ b/wcs/backoffice/submission.py @@ -87,11 +87,12 @@ class FormFillPage(PublicFormFillPage): self.remove_draft = RemoveDraftDirectory(self) def _q_index(self, *args, **kwargs): - # if NameID or channel are in query string, create a new draft with - # these parameters, and redirect to it + # if NameID, return URL or submission channel are in query string, + # create a new draft with these parameters, and redirect to it submission_channel = get_request().form.get('channel') name_id = get_request().form.get('NameID') - if name_id or submission_channel: + return_url = get_request().form.get('ReturnURL') + if name_id or submission_channel or return_url: formdata = self.formdef.data_class()() formdata.data = {} formdata.backoffice_submission = True @@ -103,6 +104,8 @@ class FormFillPage(PublicFormFillPage): users = list(get_publisher().user_class.get_users_with_name_identifier(name_id)) if users: formdata.user_id = users[0].id + if return_url: + formdata.submission_context['return_url'] = return_url formdata.store() self.set_tracking_code(formdata) return redirect('%s' % formdata.id) @@ -220,9 +223,22 @@ class FormFillPage(PublicFormFillPage): if not self.formdef.is_of_concern_for_user(self.user, filled): # if the agent is not allowed to see the submitted formdef, - # redirect to the submission homepage - return redirect(get_publisher().get_backoffice_url() + '/submission/') + # redirect to the defined return URL or to the submission + # homepage + if filled.submission_context.get('return_url'): + url = filled.submission_context['return_url'] + else: + url = get_publisher().get_backoffice_url() + '/submission/' + + return redirect(url) + def cancelled(self): + url = get_publisher().get_backoffice_url() + '/submission/' + formdata = self.get_current_draft() or self.formdef.data_class()() + if formdata.submission_context and formdata.submission_context.get('return_url'): + url = formdata.submission_context.get('return_url') + if formdata.id: + formdata.remove_self() return redirect(url) def save_draft(self, data, page_no): diff --git a/wcs/forms/root.py b/wcs/forms/root.py index 2e4030d4a..d94b9ca20 100644 --- a/wcs/forms/root.py +++ b/wcs/forms/root.py @@ -686,9 +686,7 @@ class FormPage(Directory, FormTemplateMixin): return redirect(cancelurl) except KeyError: pass - if get_request().is_in_backoffice(): - return redirect(get_publisher().get_backoffice_url() + '/submission/') - return redirect(get_publisher().get_root_url()) + return self.cancelled() try: step = int(form.get_widget('step').parse()) @@ -1127,6 +1125,9 @@ class FormPage(Directory, FormTemplateMixin): url = filled.get_url() return redirect(url) + def cancelled(self): + return redirect(get_publisher().get_root_url()) + def set_tracking_code(self, formdata, magictoken_data=None): if not self.has_draft_support(): return -- 2.19.1