0001-forms-fix-removal-of-empty-drafts-12756.patch
tests/test_form_pages.py | ||
---|---|---|
1066 | 1066 |
assert formdef.data_class().select()[0].is_draft() |
1067 | 1067 |
assert formdef.data_class().select()[0].tracking_code == tracking_code |
1068 | 1068 |
assert formdef.data_class().select()[0].data['0'] == 'foobar' |
1069 |
assert str(formdef.data_class().select()[0].page_no) == '1' |
|
1069 | 1070 |
formdata_id = formdef.data_class().select()[0].id |
1070 | 1071 | |
1071 | 1072 |
app = get_app(pub) |
... | ... | |
1094 | 1095 |
assert resp.location == 'http://example.net/' |
1095 | 1096 |
assert formdef.data_class().count() == 0 |
1096 | 1097 | |
1098 |
def test_form_tracking_code_remove_empty_draft(pub): |
|
1099 |
formdef = create_formdef() |
|
1100 |
formdef.fields = [fields.StringField(id='0', label='string')] |
|
1101 |
formdef.enable_tracking_codes = True |
|
1102 |
formdef.store() |
|
1103 |
app = get_app(pub) |
|
1104 |
resp = app.get('/test/') |
|
1105 |
formdef.data_class().wipe() |
|
1106 |
assert '<h3>Tracking code</h3>' in resp.body |
|
1107 |
resp.forms[0]['f0'] = 'foobar' |
|
1108 |
resp = resp.forms[0].submit('submit') |
|
1109 |
resp = resp.forms[0].submit('previous') |
|
1110 |
app.post('/test/autosave', params=resp.form.submit_fields()) |
|
1111 |
tracking_code = get_displayed_tracking_code(resp) |
|
1112 |
assert tracking_code is not None |
|
1113 | ||
1114 |
assert formdef.data_class().count() == 1 |
|
1115 |
assert formdef.data_class().select()[0].is_draft() |
|
1116 |
assert formdef.data_class().select()[0].tracking_code == tracking_code |
|
1117 |
assert formdef.data_class().select()[0].data['0'] == 'foobar' |
|
1118 |
assert str(formdef.data_class().select()[0].page_no) == '0' |
|
1119 | ||
1120 |
# make draft empty |
|
1121 |
formdata = formdef.data_class().select()[0] |
|
1122 |
formdata.data = {} |
|
1123 |
formdata.store() |
|
1124 |
formdata_id = formdef.data_class().select()[0].id |
|
1125 | ||
1126 |
app = get_app(pub) |
|
1127 | ||
1128 |
# check we can load the formdata as a draft |
|
1129 |
resp = app.get('/') |
|
1130 |
resp.forms[0]['code'] = tracking_code |
|
1131 |
resp = resp.forms[0].submit() |
|
1132 |
assert resp.location == 'http://example.net/code/%s/load' % tracking_code |
|
1133 |
resp = resp.follow() |
|
1134 |
assert resp.location == 'http://example.net/test/%s' % formdata_id |
|
1135 |
resp = resp.follow() |
|
1136 |
assert resp.location.startswith('http://example.net/test/?mt=') |
|
1137 |
resp = resp.follow() |
|
1138 |
assert '<h3>Tracking code</h3>' in resp.body |
|
1139 |
assert 'removedraft' in resp.body |
|
1140 |
assert resp.forms[1]['f0'].value == '' |
|
1141 | ||
1142 |
resp = resp.forms[0].submit() # remove draft |
|
1143 |
assert resp.location == 'http://example.net/' |
|
1144 |
assert formdef.data_class().count() == 0 |
|
1145 | ||
1097 | 1146 |
def test_form_invalid_tracking_code(pub): |
1098 | 1147 |
formdef = create_formdef() |
1099 | 1148 |
formdef.fields = [fields.StringField(id='0', label='string')] |
wcs/backoffice/submission.py | ||
---|---|---|
119 | 119 | |
120 | 120 |
return r.getvalue() |
121 | 121 | |
122 |
def form_side(self, step_no, page_no=0, log_detail=None, data=None): |
|
122 |
def form_side(self, step_no, page_no=0, log_detail=None, data=None, magictoken=None):
|
|
123 | 123 |
r = TemplateIO(html=True) |
124 | 124 |
get_response().filter['sidebar'] = self.get_sidebar(data) |
125 | 125 |
r += htmltext('<div id="side">') |
wcs/forms/root.py | ||
---|---|---|
433 | 433 |
form.get_widget('f%s' % field.id).prefill_attributes = field.get_prefill_attributes() |
434 | 434 | |
435 | 435 |
self.html_top(self.formdef.name) |
436 |
r += self.form_side(0, page_no, log_detail=log_detail, data=data) |
|
436 |
r += self.form_side(0, page_no, log_detail=log_detail, data=data, magictoken=magictoken)
|
|
437 | 437 |
r += get_session().display_message() |
438 | 438 | |
439 | 439 |
form.add_hidden('step', '0') |
... | ... | |
447 | 447 |
r += form.render() |
448 | 448 |
return r.getvalue() |
449 | 449 | |
450 |
def form_side(self, step_no, page_no=0, log_detail=None, data=None): |
|
450 |
def form_side(self, step_no, page_no=0, log_detail=None, data=None, magictoken=None):
|
|
451 | 451 |
'''Create the elements that typically appear aside the main form |
452 | 452 |
(tracking code and steps).''' |
453 | 453 |
r = TemplateIO(html=True) |
454 | 454 |
r += htmltext('<div id="side">') |
455 | 455 |
if self.formdef.enable_tracking_codes: |
456 |
r += self.tracking_code_box(data) |
|
456 |
r += self.tracking_code_box(data, magictoken)
|
|
457 | 457 |
r += self.step(step_no, page_no, log_detail, data=data) |
458 | 458 |
r += htmltext('</div> <!-- #side -->') |
459 | 459 |
return r.getvalue() |
460 | 460 | |
461 |
def tracking_code_box(self, data): |
|
461 |
def tracking_code_box(self, data, magictoken):
|
|
462 | 462 |
'''Create the tracking code box, it displays the current tracking code |
463 | 463 |
and a 'remove draft' button if the current form is a draft that has |
464 | 464 |
been recalled.''' |
... | ... | |
482 | 482 | |
483 | 483 |
if data.get('is_recalled_draft'): |
484 | 484 |
r += htmltext('<form action="removedraft" method="POST">') |
485 |
r += htmltext('<input type="hidden" name="magictoken" value="%s">') % ( |
|
486 |
get_request().form.get('magictoken')) |
|
485 |
r += htmltext('<input type="hidden" name="magictoken" value="%s">') % magictoken |
|
487 | 486 |
r += htmltext('<button>%s</button>') % _('Remove Draft') |
488 | 487 |
r += htmltext('</form>') |
489 | 488 |
r += htmltext('</div>') # <!-- #tracking-code --> |
... | ... | |
1053 | 1052 |
self.html_top(self.formdef.name) |
1054 | 1053 |
r = TemplateIO(html=True) |
1055 | 1054 |
r += htmltext('<div class="form-validation">') |
1056 |
r += self.form_side(step_no=1, data=data) |
|
1055 |
r += self.form_side(step_no=1, data=data, |
|
1056 |
magictoken=get_request().form['magictoken']) |
|
1057 | 1057 |
r += TextsDirectory.get_html_text('check-before-submit') |
1058 | 1058 |
form = self.formdef.create_view_form(data) |
1059 | 1059 |
token_widget = form.get_widget(form.TOKEN_NAME) |
1060 |
- |