forms: fix removal of empty drafts (#12756)
This commit is contained in:
parent
7971b30ad4
commit
f1ce589650
|
@ -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')]
|
||||
|
|
|
@ -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">')
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue