From e75997c89c9df967b567eb4d941938a00765991e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 27 Jul 2016 09:49:56 +0200 Subject: [PATCH] forms: fix removal of empty drafts (#12756) --- tests/test_form_pages.py | 49 ++++++++++++++++++++++++++++++++++++++++++++ wcs/backoffice/submission.py | 2 +- wcs/forms/root.py | 14 ++++++------- 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py index 4923afb..a650996 100644 --- a/tests/test_form_pages.py +++ b/tests/test_form_pages.py @@ -1066,6 +1066,7 @@ def test_form_tracking_code_remove_draft(pub): assert formdef.data_class().select()[0].is_draft() assert formdef.data_class().select()[0].tracking_code == tracking_code assert formdef.data_class().select()[0].data['0'] == 'foobar' + assert str(formdef.data_class().select()[0].page_no) == '1' formdata_id = formdef.data_class().select()[0].id app = get_app(pub) @@ -1094,6 +1095,54 @@ def test_form_tracking_code_remove_draft(pub): assert resp.location == 'http://example.net/' assert formdef.data_class().count() == 0 +def test_form_tracking_code_remove_empty_draft(pub): + formdef = create_formdef() + formdef.fields = [fields.StringField(id='0', label='string')] + formdef.enable_tracking_codes = True + formdef.store() + app = get_app(pub) + resp = app.get('/test/') + formdef.data_class().wipe() + assert '

Tracking code

' in resp.body + resp.forms[0]['f0'] = 'foobar' + resp = resp.forms[0].submit('submit') + resp = resp.forms[0].submit('previous') + app.post('/test/autosave', params=resp.form.submit_fields()) + tracking_code = get_displayed_tracking_code(resp) + assert tracking_code is not None + + assert formdef.data_class().count() == 1 + assert formdef.data_class().select()[0].is_draft() + assert formdef.data_class().select()[0].tracking_code == tracking_code + assert formdef.data_class().select()[0].data['0'] == 'foobar' + assert str(formdef.data_class().select()[0].page_no) == '0' + + # make draft empty + formdata = formdef.data_class().select()[0] + formdata.data = {} + formdata.store() + formdata_id = formdef.data_class().select()[0].id + + app = get_app(pub) + + # check we can load the formdata as a draft + resp = app.get('/') + resp.forms[0]['code'] = tracking_code + resp = resp.forms[0].submit() + assert resp.location == 'http://example.net/code/%s/load' % tracking_code + resp = resp.follow() + assert resp.location == 'http://example.net/test/%s' % formdata_id + resp = resp.follow() + assert resp.location.startswith('http://example.net/test/?mt=') + resp = resp.follow() + assert '

Tracking code

' in resp.body + assert 'removedraft' in resp.body + assert resp.forms[1]['f0'].value == '' + + resp = resp.forms[0].submit() # remove draft + assert resp.location == 'http://example.net/' + assert formdef.data_class().count() == 0 + def test_form_invalid_tracking_code(pub): formdef = create_formdef() formdef.fields = [fields.StringField(id='0', label='string')] diff --git a/wcs/backoffice/submission.py b/wcs/backoffice/submission.py index 6b55876..adbef33 100644 --- a/wcs/backoffice/submission.py +++ b/wcs/backoffice/submission.py @@ -119,7 +119,7 @@ class FormFillPage(PublicFormFillPage): return r.getvalue() - def form_side(self, step_no, page_no=0, log_detail=None, data=None): + def form_side(self, step_no, page_no=0, log_detail=None, data=None, magictoken=None): r = TemplateIO(html=True) get_response().filter['sidebar'] = self.get_sidebar(data) r += htmltext('
') diff --git a/wcs/forms/root.py b/wcs/forms/root.py index f5f24cb..615b5b2 100644 --- a/wcs/forms/root.py +++ b/wcs/forms/root.py @@ -433,7 +433,7 @@ class FormPage(Directory): form.get_widget('f%s' % field.id).prefill_attributes = field.get_prefill_attributes() self.html_top(self.formdef.name) - r += self.form_side(0, page_no, log_detail=log_detail, data=data) + r += self.form_side(0, page_no, log_detail=log_detail, data=data, magictoken=magictoken) r += get_session().display_message() form.add_hidden('step', '0') @@ -447,18 +447,18 @@ class FormPage(Directory): r += form.render() return r.getvalue() - def form_side(self, step_no, page_no=0, log_detail=None, data=None): + def form_side(self, step_no, page_no=0, log_detail=None, data=None, magictoken=None): '''Create the elements that typically appear aside the main form (tracking code and steps).''' r = TemplateIO(html=True) r += htmltext('
') if self.formdef.enable_tracking_codes: - r += self.tracking_code_box(data) + r += self.tracking_code_box(data, magictoken) r += self.step(step_no, page_no, log_detail, data=data) r += htmltext('
') return r.getvalue() - def tracking_code_box(self, data): + def tracking_code_box(self, data, magictoken): '''Create the tracking code box, it displays the current tracking code and a 'remove draft' button if the current form is a draft that has been recalled.''' @@ -482,8 +482,7 @@ class FormPage(Directory): if data.get('is_recalled_draft'): r += htmltext('
') - r += htmltext('') % ( - get_request().form.get('magictoken')) + r += htmltext('') % magictoken r += htmltext('') % _('Remove Draft') r += htmltext('
') r += htmltext('
') # @@ -1053,7 +1052,8 @@ class FormPage(Directory): self.html_top(self.formdef.name) r = TemplateIO(html=True) r += htmltext('
') - r += self.form_side(step_no=1, data=data) + r += self.form_side(step_no=1, data=data, + magictoken=get_request().form['magictoken']) r += TextsDirectory.get_html_text('check-before-submit') form = self.formdef.create_view_form(data) token_widget = form.get_widget(form.TOKEN_NAME) -- 2.8.1