From b22b6eb35e351a5606b0545a1021689c497a3881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sun, 20 May 2018 19:20:31 +0200 Subject: [PATCH] misc: restore backoffice drafts to the correct page (#23942) --- tests/test_backoffice_pages.py | 63 ++++++++++++++++++++++++++++++++++ wcs/forms/root.py | 4 +-- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index 7143903f..4f5a074e 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -8,6 +8,7 @@ import StringIO import time import hashlib import random +import urllib import urlparse import xml.etree.ElementTree as ET import zipfile @@ -21,6 +22,7 @@ except ImportError: from quixote import cleanup, get_publisher from qommon import ods +from wcs.api_utils import sign_url from wcs.qommon import errors, sessions from wcs.qommon.form import PicklableUpload from qommon.ident.password_accounts import PasswordAccount @@ -61,6 +63,10 @@ def pub(request): pub.cfg['language'] = {'language': 'en'} pub.write_cfg() fd = open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') + fd.write(''' +[api-secrets] +coucou = 1234 +''') fd.close() return pub @@ -1541,6 +1547,63 @@ def test_backoffice_submission_welco(pub, welco_url): # check agent name is displayed next to pending submission assert '(%s)' % user.display_name in resp.body +def test_backoffice_submission_initiated_from_welco(pub, welco_url): + user = create_user(pub) + create_environment(pub) + + app = login(get_app(pub)) + resp = app.get('/backoffice/') + assert not 'Submission' in resp.body + app.get('/backoffice/submission/', status=403) + + formdef = FormDef.get_by_urlname('form-title') + formdef.fields = [ + fields.PageField(id='0', label='1st PAGE', type='page', + condition={'type': 'python', 'value': 'form_submission_channel != "counter" and is_in_backoffice'}), + fields.StringField(id='1', label='Field on 1st page', type='string'), + fields.PageField(id='2', label='2nd PAGE', type='page'), + fields.StringField(id='3', label='Field on 2nd page', type='string'), + ] + formdef.backoffice_submission_roles = user.roles[:] + formdef.store() + + def post_formdata(): + signed_url = sign_url('http://example.net/api/formdefs/form-title/submit' + + '?format=json&orig=coucou&email=%s' % urllib.quote(user.email), '1234') + url = signed_url[len('http://example.net'):] + resp = get_app(pub).post_json(url, { + 'meta': { + 'draft': True, + 'backoffice-submission': True, + }, + 'data': {}, + 'context': { + 'channel': 'counter' + } + }) + return resp.json['data']['id'] + + resp = app.get('/backoffice/management/form-title/%s/' % post_formdata()) + resp = resp.follow() # -> /backoffice/submission/form-title/XXX + resp = resp.follow() # -> /backoffice/submission/form-title/?mt=XYZ + + # second page should be shown + pq = resp.pyquery.remove_namespaces() + assert pq('#steps li.current .label').text() == '2nd PAGE' + assert 'Field on 2nd page' in resp.body # and in fields + + # reverse condition + formdef.fields[0].condition['value'] = 'form_submission_channel == "counter" and is_in_backoffice' + formdef.store() + + resp = app.get('/backoffice/management/form-title/%s/' % post_formdata()) + resp = resp.follow() # -> /backoffice/submission/form-title/XXX + resp = resp.follow() # -> /backoffice/submission/form-title/?mt=XYZ + + pq = resp.pyquery.remove_namespaces() + assert pq('#steps li.current .label').text() == '1st PAGE' + assert 'Field on 1st page' in resp.body # and in fields + def test_backoffice_parallel_submission(pub): user = create_user(pub) create_environment(pub) diff --git a/wcs/forms/root.py b/wcs/forms/root.py index 40d13505..a6ff0a3b 100644 --- a/wcs/forms/root.py +++ b/wcs/forms/root.py @@ -636,7 +636,8 @@ class FormPage(Directory, FormTemplateMixin): magictoken = randbytes(8) session.add_magictoken(magictoken, data) get_request().form['magictoken'] = magictoken - if data.has_key('page_no'): + self.feed_current_data(magictoken) + if int(data.get('page_no', '0') or '0') != 0: page_no = int(data['page_no']) del data['page_no'] if page_no == -1 or page_no >= self.page_number: @@ -651,7 +652,6 @@ class FormPage(Directory, FormTemplateMixin): return self.validating(data) else: page_no = self.formdef.get_start_page() - self.feed_current_data(magictoken) return self.page(page_no, True) self.feed_current_data(None) if self.formdef.get_start_page() is None: -- 2.17.0