misc: do not save prefilling data on initial visit (#75848) #1407

Merged
fpeters merged 1 commits from wip/75848-do-not-save-prefill-first-visit into main 2024-04-15 16:52:08 +02:00
3 changed files with 10 additions and 23 deletions

View File

@ -173,19 +173,10 @@ def test_form_draft_from_prefill(pub, field_type, logged_in):
assert formdef.data_class().count() == 0
formdef.data_class().wipe()
# draft created if there's been some prefilled fields
# make sure no draft is created on prefilled fields
formdef.fields[0].prefill = {'type': 'string', 'value': '{{request.GET.test|default:""}}'}
formdef.store()
app.get('/test/?test=hello')
assert formdef.data_class().count() == 1
formdef.data_class().wipe()
# unless the call was made from an application
app.get('/test/?test=hello', headers={'User-agent': 'python-requests/0'})
assert formdef.data_class().count() == 0
# or a bot
app.get('/test/?test=hello', headers={'User-agent': 'Googlebot'})
assert formdef.data_class().count() == 0
# check there's no leftover draft after submission

View File

@ -599,7 +599,13 @@ class FormPage(Directory, TempfileDirectoryMixin, FormTemplateMixin):
return hashlib.sha1(self.formdef.slug.encode()).hexdigest()
def page(
self, page, page_change=True, page_error_messages=None, submit_button=None, transient_formdata=None
self,
page,
arrival=False,
Review

Ce nouveau paramètre, pour dire qu'on arrive sur la démarche.

Ce nouveau paramètre, pour dire qu'on arrive sur la démarche.
page_change=True,
page_error_messages=None,
submit_button=None,
transient_formdata=None,
):
displayed_fields = []
self.current_page = page
@ -704,7 +710,7 @@ class FormPage(Directory, TempfileDirectoryMixin, FormTemplateMixin):
# include prefilled data
transient_formdata = self.get_transient_formdata(magictoken)
transient_formdata.data.update(self.formdef.get_data(form))
if self.has_draft_support() and not (req.is_from_application() or req.is_from_bot()):
if self.has_draft_support() and (not arrival or computed_fields_on_page):
# save to get prefilling data in database
self.save_draft(form_data)
# and make sure draft formdata id is tracked in session
@ -1295,7 +1301,7 @@ class FormPage(Directory, TempfileDirectoryMixin, FormTemplateMixin):
self.feed_current_data(None)
if not self.pages:
return template.error_page(_('This form has no visible page.'))
return self.page(self.pages[0])
return self.page(self.pages[0], arrival=True)
if form.get_submit() == 'cancel':
if self.edit_mode:

View File

@ -214,16 +214,6 @@ class HTTPRequest(quixote.http_request.HTTPRequest):
user_agent = self.get_environ('HTTP_USER_AGENT', '').lower()
return bool('bot' in user_agent or 'crawl' in user_agent)
def is_from_application(self):
Review

On n'a plus besoin de ça.

On n'a plus besoin de ça.
# detect calls made from other applications or debug tools
# this is not to detect bots (is_from_bot above)
user_agent = self.get_environ('HTTP_USER_AGENT', '')
return (
user_agent.startswith('python-requests')
or user_agent.startswith('curl')
or user_agent.startswith('Wget')
)
def is_from_mobile(self):
user_agent = self.get_environ('HTTP_USER_AGENT', '')
try: