misc: handle submission of form that is unexpectedly no longer valid (#67561) #566
|
@ -2559,6 +2559,33 @@ def test_form_tracking_code_as_variable(pub, nocache):
|
|||
assert '!%s!' % tracking_code in resp.text
|
||||
|
||||
|
||||
def test_form_invalid_previous_data(pub):
|
||||
create_user(pub)
|
||||
formdef = create_formdef()
|
||||
formdef.fields = [fields.DateField(id='0', label='date')]
|
||||
formdef.enable_tracking_codes = True
|
||||
formdef.store()
|
||||
|
||||
resp = login(get_app(pub), username='foo', password='foo').get('/test/')
|
||||
formdef.data_class().wipe()
|
||||
tracking_code = get_displayed_tracking_code(resp)
|
||||
assert tracking_code is not None
|
||||
resp.forms[0]['f0'] = time.strftime('%Y-%m-%d', time.localtime())
|
||||
resp = resp.forms[0].submit('submit') # -> validation page
|
||||
|
||||
formdef.fields[0].minimum_is_future = True
|
||||
formdef.store()
|
||||
|
||||
# load the formdata as a draft
|
||||
resp = login(get_app(pub), username='foo', password='foo').get('/')
|
||||
resp.forms[0]['code'] = tracking_code
|
||||
resp = resp.forms[0].submit().follow().follow().follow()
|
||||
assert resp.forms[1]['f0'].value == time.strftime('%Y-%m-%d', time.localtime())
|
||||
resp = resp.forms[1].submit('submit') # -> submit
|
||||
assert 'This form has already been submitted.' not in resp.text
|
||||
assert 'Unexpected field error' in resp.text
|
||||
|
||||
|
||||
def test_form_draft_with_file(pub):
|
||||
create_user(pub)
|
||||
formdef = create_formdef()
|
||||
|
|
|
@ -1433,9 +1433,14 @@ class FormPage(FormdefDirectoryBase, FormTemplateMixin):
|
|||
return self.validating(form_data)
|
||||
|
||||
if form.has_errors():
|
||||
# the only possible error here is a token error if the form is
|
||||
# submitted a second time
|
||||
return template.error_page(_('This form has already been submitted.'))
|
||||
if form.get_widget(form.TOKEN_NAME).has_error():
|
||||
# Token error if the form is submitted a second time
|
||||
return template.error_page(_('This form has already been submitted.'))
|
||||
# Something else, typically this means a draft has been loaded and
|
||||
# the field checks are no longer ok (for example a check on "date must be
|
||||
# after today"). Push back user to the first page to correct the errors
|
||||
get_session().message = ('error', _('Unexpected field error, please check.'))
|
||||
return self.page(self.pages[0])
|
||||
|
||||
try:
|
||||
return self.submitted(form, existing_formdata)
|
||||
|
|
Loading…
Reference in New Issue