backoffice: add support for cancelurl to backoffice submission (#46441) #711

Merged
fpeters merged 1 commits from wip/46441-backoffice-submission-cancelurl into main 2023-09-29 07:32:51 +02:00
2 changed files with 51 additions and 5 deletions

View File

@ -362,6 +362,46 @@ def test_backoffice_submission_with_return_url(pub):
assert resp.location == 'https://example.org'
def test_backoffice_submission_with_cancel_url(pub):
user = create_user(pub)
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [
fields.StringField(
id='1', label='1st field', display_locations=['validation', 'summary', 'listings']
),
]
formdef.backoffice_submission_roles = user.roles[:]
formdef.workflow_roles = {'_receiver': 1}
formdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/submission/form-title/?cancelurl=https://example.org')
resp = resp.follow().follow()
resp = resp.form.submit('cancel')
assert resp.location == 'https://example.org'
# check cancelurl is used, not return url
resp = app.get(
'/backoffice/submission/form-title/?cancelurl=https://example.org&ReturnURL=https://example.com'
)
resp = resp.follow().follow()
resp = resp.form.submit('cancel')
assert resp.location == 'https://example.org'
# test submission when agent is not receiver (cancelurl should not be used in this case)
formdef.workflow_roles = {}
formdef.store()
resp = app.get('/backoffice/submission/form-title/?cancelurl=https://example.org')
resp = resp.follow().follow()
resp.form['f1'] = 'test submission'
resp = resp.form.submit('submit') # -> to validation
resp = resp.form.submit('submit') # -> to submit
assert resp.location == 'http://example.net/backoffice/submission/'
def test_backoffice_submission_with_caller(pub):
user = create_user(pub)

View File

@ -126,9 +126,10 @@ class FormFillPage(PublicFormFillPage):
# 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')
cancel_url = get_request().form.get('cancelurl')
return_url = get_request().form.get('ReturnURL')
caller = get_request().form.get('caller')
if name_id or submission_channel or return_url or caller:
if name_id or submission_channel or return_url or cancel_url or caller:
formdata = self.formdef.data_class()()
formdata.data = {}
formdata.backoffice_submission = True
@ -148,6 +149,8 @@ class FormFillPage(PublicFormFillPage):
)
if return_url:
formdata.submission_context['return_url'] = return_url
if cancel_url:
formdata.submission_context['cancel_url'] = cancel_url
if submission_channel == 'phone' and caller:
formdata.submission_context['caller'] = caller
formdata.store()
@ -156,7 +159,7 @@ class FormFillPage(PublicFormFillPage):
extra_query_params = {
x: y
for x, y in get_request().form.items()
if x not in ('channel', 'NameID', 'ReturnURL', 'caller')
if x not in ('channel', 'NameID', 'ReturnURL', 'cancelurl', 'caller')
}
if extra_query_params:
redirect_url += '?' + urllib.parse.urlencode(extra_query_params)
@ -265,7 +268,7 @@ class FormFillPage(PublicFormFillPage):
if (
formdata
and formdata.submission_context
and set(formdata.submission_context.keys()) != {'return_url'}
and set(formdata.submission_context.keys()).difference({'return_url', 'cancel_url'})
):
r += FormBackOfficeStatusPage(self.formdef, formdata).get_extra_submission_context_bar()
@ -388,8 +391,11 @@ class FormFillPage(PublicFormFillPage):
def cancelled(self):
url = self.get_default_return_url()
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.submission_context:
if formdata.submission_context.get('return_url'):
url = formdata.submission_context.get('return_url')
if formdata.submission_context.get('cancel_url'):
url = formdata.submission_context.get('cancel_url')
if formdata.id:
formdata.remove_self()
return redirect(url)