misc: add proper draft handling when adding a block row on first page (#89664)
gitea/wcs/pipeline/head This commit looks good
Details
gitea/wcs/pipeline/head This commit looks good
Details
This commit is contained in:
parent
d43865b2a5
commit
992bc9720a
|
@ -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'
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue