general: re-use draft formdata object if it exists (#8668)
This commit is contained in:
parent
f3cfe17d58
commit
a46d91e7d2
|
@ -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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue