forms: keep track of draft id earlier on (#53993)

This commit is contained in:
Frédéric Péters 2021-05-15 10:10:09 +02:00
parent c7773f9186
commit dc98be2106
2 changed files with 29 additions and 8 deletions

View File

@ -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):

View File

@ -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 = {}