backoffice: add support for a return URL after submission (#25306)

This commit is contained in:
Frédéric Péters 2018-11-18 11:56:14 +01:00
parent b928eb3a89
commit cecaa3c437
3 changed files with 61 additions and 8 deletions

View File

@ -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)

View File

@ -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,11 +223,24 @@ 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):
formdata = super(FormFillPage, self).save_draft(data, page_no)
formdata.backoffice_submission = True

View File

@ -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