forms: don't display errors after "add row" is clicked (#43551)

This commit is contained in:
Frédéric Péters 2020-06-02 10:17:44 +02:00
parent 520dee9e8a
commit 6381b9f5f5
2 changed files with 27 additions and 4 deletions

View File

@ -3294,6 +3294,24 @@ def test_form_table_rows_field_and_prefill(pub, emails):
resp = get_app(pub).get('/test/')
def test_form_table_rows_add_row(pub):
formdef = create_formdef()
formdef.fields = [
fields.StringField(id='1', label='string', require=True),
fields.TableRowsField(id='0', label='table', type='tablerows', columns=['a', 'b'], required=True),
]
formdef.store()
formdef.data_class().wipe()
resp = get_app(pub).get('/test/')
assert resp.form['f0$added_elements'].value == '5'
resp = resp.form.submit('f0$add_element')
assert resp.form['f0$added_elements'].value == '6'
assert 'There were errors processing the form' not in resp
resp = resp.form.submit('submit')
assert 'There were errors processing the form' in resp
def test_formdata_attachment_download(pub):
create_user(pub)
wf = Workflow(name='status')

View File

@ -292,7 +292,7 @@ class FormPage(Directory, FormTemplateMixin):
'current_page_no': current_position,
})
def page(self, page, page_change=True, page_error_messages=None):
def page(self, page, page_change=True, page_error_messages=None, submit_button=None):
displayed_fields = []
session = get_session()
@ -302,6 +302,10 @@ class FormPage(Directory, FormTemplateMixin):
self.feed_current_data(magictoken)
form = self.create_form(page, displayed_fields)
if submit_button is True:
# submit_button at True means a non-submitting button has been
# clicked; details in [ADD_ROW_BUTTON].
form.clear_errors()
if page_error_messages:
form.add_global_errors(page_error_messages)
if getattr(session, 'ajax_form_token', None):
@ -735,7 +739,7 @@ class FormPage(Directory, FormTemplateMixin):
return self.validating(data)
else:
page_no = 0
return self.page(self.pages[page_no], True)
return self.page(self.pages[page_no], page_change=True)
self.feed_current_data(None)
if not self.pages:
raise errors.TraversalError()
@ -854,10 +858,11 @@ class FormPage(Directory, FormTemplateMixin):
# form.get_submit() returns the name of the clicked button, and
# it will return True if the form has been submitted, but not
# by clicking on a submit widget; for example if an "add row"
# button is clicked.
# button is clicked. [ADD_ROW_BUTTON]
if form.has_errors() or form.get_submit() is True:
return self.page(page, page_change=False,
page_error_messages=page_error_messages)
page_error_messages=page_error_messages,
submit_button=form.get_submit())
form_data = session.get_by_magictoken(magictoken, {})
with get_publisher().substitutions.temporary_feed(