Projet

Général

Profil

0001-forms-fix-removal-of-empty-drafts-12756.patch

Frédéric Péters, 27 juillet 2016 09:50

Télécharger (6,39 ko)

Voir les différences:

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(-)
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
-