forms: fix removal of empty drafts (#12756)

This commit is contained in:
Frédéric Péters 2016-07-27 09:49:56 +02:00
parent 7971b30ad4
commit f1ce589650
3 changed files with 57 additions and 8 deletions

View File

@ -1030,6 +1030,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)
@ -1058,6 +1059,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 '<h3>Tracking code</h3>' 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 '<h3>Tracking code</h3>' 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')]

View File

@ -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('<div id="side">')

View File

@ -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('<div id="side">')
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('</div> <!-- #side -->')
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('<form action="removedraft" method="POST">')
r += htmltext('<input type="hidden" name="magictoken" value="%s">') % (
get_request().form.get('magictoken'))
r += htmltext('<input type="hidden" name="magictoken" value="%s">') % magictoken
r += htmltext('<button>%s</button>') % _('Remove Draft')
r += htmltext('</form>')
r += htmltext('</div>') # <!-- #tracking-code -->
@ -1053,7 +1052,8 @@ class FormPage(Directory):
self.html_top(self.formdef.name)
r = TemplateIO(html=True)
r += htmltext('<div class="form-validation">')
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)