forms: add a "remove draft" button under tracking code (#10102)

This commit is contained in:
Frédéric Péters 2016-07-07 11:13:42 +02:00
parent 53f7bc9d06
commit c3d308c818
2 changed files with 67 additions and 16 deletions

View File

@ -865,13 +865,13 @@ def test_form_tracking_code(pub):
resp = resp.follow()
assert resp.location.startswith('http://example.net/test/?mt=')
resp = resp.follow()
resp = resp.forms[0].submit('previous')
assert resp.forms[0]['f0'].value == 'foobar'
resp = resp.forms[1].submit('previous')
assert resp.forms[1]['f0'].value == 'foobar'
# check submitted form keeps the tracking code
resp.forms[0]['f0'] = 'barfoo'
resp = resp.forms[0].submit('submit') # -> confirmation page
resp = resp.forms[0].submit('submit') # -> done
resp.forms[1]['f0'] = 'barfoo'
resp = resp.forms[1].submit('submit') # -> confirmation page
resp = resp.forms[1].submit('submit') # -> done
resp = resp.follow()
assert 'barfoo' in resp.body
assert formdef.data_class().count() == 1 # check the draft one has been removed
@ -931,13 +931,13 @@ def test_form_tracking_code_as_user(pub):
resp = resp.follow()
assert resp.location.startswith('http://example.net/test/?mt=')
resp = resp.follow()
resp = resp.forms[0].submit('previous')
assert resp.forms[0]['f0'].value == 'foobar'
resp = resp.forms[1].submit('previous')
assert resp.forms[1]['f0'].value == 'foobar'
# check submitted form keeps the tracking code
resp.forms[0]['f0'] = 'barfoo'
resp = resp.forms[0].submit('submit') # -> confirmation page
resp = resp.forms[0].submit('submit') # -> done
resp.forms[1]['f0'] = 'barfoo'
resp = resp.forms[1].submit('submit') # -> confirmation page
resp = resp.forms[1].submit('submit') # -> done
resp = resp.follow()
assert 'barfoo' in resp.body
assert formdef.data_class().count() == 1 # check the draft one has been removed
@ -1013,6 +1013,51 @@ def test_form_tracking_code_email(pub):
assert 'ABCDEF' in emails.emails.values()[0]['payload']
assert resp.location == 'http://example.net/test/code/ABCDEF/load'
def test_form_tracking_code_remove_draft(pub):
formdef = create_formdef()
formdef.fields = [fields.StringField(id='0', label='string')]
formdef.enable_tracking_codes = True
formdef.store()
resp = get_app(pub).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')
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'
formdata_id = formdef.data_class().select()[0].id
app = get_app(pub)
# visit page, check there's no remove draft button
resp = app.get('/test/')
assert '<h3>Tracking code</h3>' in resp.body
assert not 'removedraft' in resp.body
# 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
resp = resp.forms[1].submit('previous')
assert resp.forms[1]['f0'].value == 'foobar'
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

@ -206,7 +206,7 @@ class TrackingCodesDirectory(Directory):
class FormPage(Directory):
_q_exports = ['', 'listing', 'tempfile', 'tokens', 'schema', 'tryauth',
'auth', 'qrcode', 'autosave', 'code']
'auth', 'qrcode', 'autosave', 'code', 'removedraft']
def __init__(self, component):
try:
@ -482,6 +482,12 @@ class FormPage(Directory):
return ''
r += htmltext('<button>%s</button>') % _('Save')
r += TextsDirectory.get_html_text('tracking-code-short-text')
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('<button>%s</button>') % _('Remove Draft')
r += htmltext('</form>')
r += htmltext('</div>') # <!-- #tracking-code -->
return r.getvalue()
@ -664,8 +670,7 @@ class FormPage(Directory):
return self.previous_page(page_no, magictoken)
if self.formdef.enable_tracking_codes and form.get_submit() == 'removedraft':
self.remove_draft()
return redirect(get_publisher().get_root_url())
return self.removedraft()
if self.formdef.enable_tracking_codes and form.get_submit() == 'savedraft':
form_data = session.get_by_magictoken(magictoken, {})
@ -796,8 +801,7 @@ class FormPage(Directory):
return self.previous_page(self.page_number, magictoken)
if self.formdef.enable_tracking_codes and form.get_submit() == 'removedraft':
self.remove_draft()
return redirect(get_publisher().get_root_url())
return self.removedraft()
if self.formdef.enable_tracking_codes and form.get_submit() == 'savedraft':
filled = self.save_draft(form_data, page_no = -1)
@ -837,12 +841,13 @@ class FormPage(Directory):
return self.page(page_no, page_change=True)
def remove_draft(self):
def removedraft(self):
magictoken = get_request().form.get('magictoken')
if magictoken:
form_data = get_session().get_by_magictoken(magictoken, {})
if form_data.get('draft_formdata_id'):
self.formdef.data_class().remove_object(form_data.get('draft_formdata_id'))
return redirect(get_publisher().get_root_url())
def autosave_draft(self, draft_id, page_no, form_data):
try:
@ -1147,6 +1152,7 @@ class FormPage(Directory):
for field, value in form_data.items():
if value is None:
del form_data[field]
form_data['is_recalled_draft'] = True
form_data['draft_formdata_id'] = filled.id
form_data['page_no'] = filled.page_no
session.add_magictoken(magictoken, form_data)