misc: make sure draft formdata id is saved in session (#86277) #1348

Merged
fpeters merged 1 commits from wip/86277-autosave-multiple-drafts into main 2024-04-03 10:56:56 +02:00
2 changed files with 25 additions and 0 deletions

View File

@ -857,3 +857,25 @@ def test_draft_store_page_id_when_no_page_and_no_confirmation(pub):
assert formdef.data_class().count() == 1
formdata = formdef.data_class().select()[0]
assert formdata.status == 'wf-new'
def test_draft_error_then_autosave(pub):
formdef = create_formdef()
formdef.enable_tracking_codes = True
formdef.fields = [
fields.PageField(id='0', label='1st page'),
fields.StringField(id='1', label='string 1'),
fields.PageField(id='2', label='2nd page'),
]
formdef.store()
formdef.data_class().wipe()
app = get_app(pub)
resp = app.get('/test/')
resp = resp.form.submit('submit') # error
assert formdef.data_class().count() == 1 # server roundtrip -> draft
resp.form['f1'] = 'test'
app.post('/test/autosave', params=resp.form.submit_fields())
assert formdef.data_class().count() == 1 # make sure same draft got reused
assert formdef.data_class().select()[0].data['1'] == 'test'

View File

@ -1372,6 +1372,9 @@ class FormPage(Directory, TempfileDirectoryMixin, FormTemplateMixin):
# a new ConditionsVars will get added to the substitution
# variables.
form_data = copy.copy(session.get_by_magictoken(magictoken, {}))
if form_data:
# keep new copy in session
session.add_magictoken(magictoken, form_data)
Review

Comme on faisait une copie, au moment du save_draft(),

        if new_draft:
            data['draft_formdata_id'] = filled.id
            get_session().store()

le dictionnaire enregistré n'était pas celui avec l'info draft_formdata_id :/

Comme on faisait une copie, au moment du save_draft(), ``` if new_draft: data['draft_formdata_id'] = filled.id get_session().store() ``` le dictionnaire enregistré n'était pas celui avec l'info draft_formdata_id :/
try:
with get_publisher().substitutions.temporary_feed(transient_formdata, force_mode='lazy'):
data = self.formdef.get_data(form, raise_on_error=True)