forms: keep track of draft id earlier on (#53993)
This commit is contained in:
parent
c7773f9186
commit
dc98be2106
|
@ -2332,35 +2332,54 @@ def test_form_draft_with_date(pub):
|
|||
assert '2012-02-12' in resp.text
|
||||
|
||||
|
||||
def test_form_draft_from_prefill(pub):
|
||||
@pytest.mark.parametrize('field_type', ['string', 'item'])
|
||||
@pytest.mark.parametrize('logged_in', ['anonymous', 'logged-in'])
|
||||
def test_form_draft_from_prefill(pub, field_type, logged_in):
|
||||
create_user(pub)
|
||||
|
||||
formdef = create_formdef()
|
||||
formdef.fields = [
|
||||
fields.StringField(id='0', label='string'),
|
||||
]
|
||||
if field_type == 'string':
|
||||
formdef.fields = [fields.StringField(id='0', label='string')]
|
||||
else:
|
||||
formdef.fields = [fields.ItemField(id='0', label='item', type='item', items=['foo', 'bar', 'hello'])]
|
||||
formdef.enable_tracking_codes = True
|
||||
formdef.store()
|
||||
formdef.data_class().wipe()
|
||||
|
||||
app = get_app(pub)
|
||||
if logged_in == 'logged-in':
|
||||
login(app, username='foo', password='foo')
|
||||
|
||||
# no draft
|
||||
get_app(pub).get('/test/')
|
||||
app.get('/test/')
|
||||
assert formdef.data_class().count() == 0
|
||||
formdef.data_class().wipe()
|
||||
|
||||
# draft created if there's been some prefilled fields
|
||||
formdef.fields[0].prefill = {'type': 'string', 'value': '{{request.GET.test|default:""}}'}
|
||||
formdef.store()
|
||||
get_app(pub).get('/test/?test=hello')
|
||||
app.get('/test/?test=hello')
|
||||
assert formdef.data_class().count() == 1
|
||||
formdef.data_class().wipe()
|
||||
|
||||
# unless the call was made from an application
|
||||
get_app(pub).get('/test/?test=hello', headers={'User-agent': 'python-requests/0'})
|
||||
app.get('/test/?test=hello', headers={'User-agent': 'python-requests/0'})
|
||||
assert formdef.data_class().count() == 0
|
||||
|
||||
# or a bot
|
||||
get_app(pub).get('/test/?test=hello', headers={'User-agent': 'Googlebot'})
|
||||
app.get('/test/?test=hello', headers={'User-agent': 'Googlebot'})
|
||||
assert formdef.data_class().count() == 0
|
||||
|
||||
# check there's no leftover draft after submission
|
||||
for with_tracking_code in (False, True):
|
||||
formdef.enable_tracking_codes = with_tracking_code
|
||||
formdef.store()
|
||||
formdef.data_class().wipe()
|
||||
resp = app.get('/test/?test=hello')
|
||||
resp = resp.form.submit('submit') # -> validation
|
||||
resp = resp.form.submit('submit') # -> submit
|
||||
assert formdef.data_class().count() == 1
|
||||
|
||||
|
||||
@pytest.mark.parametrize('tracking_code', [True, False])
|
||||
def test_form_direct_draft_access(pub, tracking_code):
|
||||
|
|
|
@ -547,6 +547,8 @@ class FormPage(Directory, FormTemplateMixin):
|
|||
if self.has_draft_support() and not (req.is_from_application() or req.is_from_bot()):
|
||||
# save to get prefilling data in database
|
||||
self.save_draft(form_data)
|
||||
# and make sure draft formdata id is tracked in session
|
||||
session.add_magictoken(magictoken, form_data)
|
||||
else:
|
||||
req.form = {}
|
||||
|
||||
|
|
Loading…
Reference in New Issue