general: re-use draft formdata object if it exists (#8668)

This commit is contained in:
Frédéric Péters 2015-10-16 13:16:43 +02:00
parent f3cfe17d58
commit a46d91e7d2
3 changed files with 30 additions and 31 deletions

View File

@ -706,6 +706,12 @@ def test_backoffice_submission_drafts(pub):
resp = resp.form.submit('previous')
assert resp.form['f1'].value == 'test submission'
resp = resp.form.submit('submit')
assert "Check values then click submit." in resp.body
resp = resp.form.submit('submit')
# check it kept the same id
assert resp.location == 'http://example.net/backoffice/management/form-title/%s/' % formdata_no
def test_backoffice_wscall_failure_display(pub):
create_user(pub)
create_environment(pub)

View File

@ -70,20 +70,13 @@ class FormFillPage(PublicFormFillPage):
return r.getvalue()
def submitted(self, form, *args):
filled = self.formdef.data_class()()
filled = self.get_current_draft() or self.formdef.data_class()()
filled.just_created()
filled.data = self.formdef.get_data(form)
filled.backoffice_submission = True
filled.store()
magictoken = get_request().form.get('magictoken')
form_data = get_session().get_by_magictoken(magictoken, {})
draft_formdata_id = form_data.get('draft_formdata_id')
if draft_formdata_id:
old_draft_formdata = self.formdef.data_class().get(draft_formdata_id)
filled.submission_context = old_draft_formdata.submission_context
self.keep_tracking_code(filled)
self.set_tracking_code(filled)
get_session().remove_magictoken(get_request().form.get('magictoken'))
url = filled.perform_workflow()

View File

@ -805,7 +805,7 @@ class FormPage(Directory):
return json.dumps({'result': 'success'})
def save_draft(self, data, page_no):
filled = self.formdef.data_class()()
filled = self.get_current_draft() or self.formdef.data_class()()
filled.data = data
filled.status = 'draft'
filled.page_no = page_no
@ -818,19 +818,31 @@ class FormPage(Directory):
if not filled.user_id:
get_session().mark_anonymous_formdata(filled)
self.keep_tracking_code(filled)
data['draft_formdata_id'] = filled.id
self.set_tracking_code(filled)
get_logger().info('form %s - saving draft (id: %s)' % (self.formdef.name, filled.id))
return filled
def get_current_draft(self):
magictoken = get_request().form.get('magictoken')
if magictoken:
session = get_session()
form_data = session.get_by_magictoken(magictoken, {})
draft_formdata_id = form_data.get('draft_formdata_id')
if draft_formdata_id:
# there was a draft, use it.
return self.formdef.data_class().get(draft_formdata_id)
return None
def submitted(self, form, existing_formdata = None):
if existing_formdata: # modifying
filled = existing_formdata
filled.last_modification_time = time.localtime()
# XXX: what about status?
else:
filled = self.formdef.data_class()()
filled = self.get_current_draft() or self.formdef.data_class()()
filled.just_created()
filled.data = self.formdef.get_data(form)
@ -852,7 +864,7 @@ class FormPage(Directory):
return redirect('%s/' % user_forms[0].id)
filled.store()
self.keep_tracking_code(filled)
self.set_tracking_code(filled)
session.remove_magictoken(get_request().form.get('magictoken'))
get_logger().info('form %s - done (id: %s)' % (self.formdef.name, filled.id))
@ -870,24 +882,12 @@ class FormPage(Directory):
url = filled.get_url()
return redirect(url)
def keep_tracking_code(self, formdata):
'''Remove current draft in favour of formdata, conserving the same
tracking code.'''
code = None
magictoken = get_request().form.get('magictoken')
if magictoken:
session = get_session()
form_data = session.get_by_magictoken(magictoken, {})
draft_formdata_id = form_data.get('draft_formdata_id')
if draft_formdata_id:
old_draft_formdata = self.formdef.data_class().get(draft_formdata_id)
old_draft_formdata.remove_self()
if old_draft_formdata.tracking_code:
code = get_publisher().tracking_code_class.get(old_draft_formdata.tracking_code)
form_data['draft_formdata_id'] = formdata.id
if code is None:
code = get_publisher().tracking_code_class()
def set_tracking_code(self, formdata):
if not self.formdef.enable_tracking_codes:
return
if formdata.tracking_code:
return
code = get_publisher().tracking_code_class()
code.formdata = formdata # this will .store() the code
def submitted_existing(self, form, editing):