misc: add proper draft handling when adding a block row on first page (#89664)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2024-04-16 21:04:59 +02:00
parent d43865b2a5
commit 992bc9720a
2 changed files with 55 additions and 1 deletions

View File

@ -2829,3 +2829,55 @@ def test_block_titles_and_empty_block_on_summary_page(pub, emails):
assert 'Form Title' not in resp.text
assert 'Form Page' not in emails.get('New form (form title)')['msg'].get_payload()[0].get_payload()
assert 'Form Title' not in emails.get('New form (form title)')['msg'].get_payload()[0].get_payload()
@pytest.mark.parametrize('logged_user', ['logged', 'anonymous'])
@pytest.mark.parametrize('tracking_code', ['with-tracking-code', 'without-tracking-code'])
def test_block_multiple_rows_single_draft(pub, logged_user, tracking_code):
create_user(pub)
FormDef.wipe()
BlockDef.wipe()
block = BlockDef()
block.name = 'foobar'
block.fields = [fields.StringField(id='123', required=True, label='Test')]
block.store()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [
fields.BlockField(id='1', label='test', block_slug='foobar', max_items=5),
]
formdef.enable_tracking_codes = bool(tracking_code == 'with-tracking-code')
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
if logged_user == 'logged':
login(app, username='foo', password='foo')
resp = app.get(formdef.get_url())
resp.form['f1$element0$f123'].value = 'Hello World'
resp = resp.form.submit('f1$add_element') # add second row
if logged_user == 'logged' or formdef.enable_tracking_codes:
assert formdef.data_class().count() == 1
assert formdef.data_class().select()[0].status == 'draft'
else:
assert formdef.data_class().count() == 0
resp.form['f1$element1$f123'].value = 'Something else'
resp = resp.form.submit('f1$add_element') # add third row
if logged_user == 'logged' or formdef.enable_tracking_codes:
assert formdef.data_class().count() == 1
assert formdef.data_class().select()[0].status == 'draft'
else:
assert formdef.data_class().count() == 0
resp.form['f1$element2$f123'].value = 'Something else'
resp = resp.form.submit('submit') # -> validation page
resp = resp.form.submit('submit') # -> end page
resp = resp.follow()
assert formdef.data_class().count() == 1
assert formdef.data_class().select()[0].status == 'wf-new'

View File

@ -1444,10 +1444,12 @@ class FormPage(Directory, TempfileDirectoryMixin, FormTemplateMixin):
# by clicking on a submit widget; for example if an "add row"
# button is clicked. [ADD_ROW_BUTTON]
if form.has_errors() or form.get_submit() is True:
if self.has_draft_support() and not honeypot_error:
token_error = form.get_widget('_form_id') and form.get_widget('_form_id').has_error()
if self.has_draft_support() and not (honeypot_error or token_error):
# save draft during server roundtrip
try:
self.save_draft(form_data)
session.add_magictoken(magictoken, form_data) # make sure draft id is saved
except SubmittedDraftException:
get_session().message = ('error', self.already_submitted_message)
return redirect(