From 632187627f7f4afd14643a203c02adb2808d1200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 24 Nov 2015 21:48:18 +0100 Subject: [PATCH] backoffice: fix loss of user_id association in backoffice submission (#9089) --- tests/test_backoffice_pages.py | 101 +++++++++++++++++++++++++++-------------- wcs/backoffice/submission.py | 1 - wcs/forms/root.py | 25 ++++++---- 3 files changed, 84 insertions(+), 43 deletions(-) diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index c55963f..0e98f95 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -909,52 +909,87 @@ def test_backoffice_submission_prefill_user_multiple_pages(pub): other_user.email = 'other@example.net' other_user.store() - formdef = FormDef.get_by_urlname('form-title') - formdef.fields = [ - fields.PageField(id='0', label='1st page', type='page'), - fields.PageField(id='4', label='2nd page', type='page'), - fields.StringField(id='5', label='field on 2nd page', - prefill = {'type': 'user', 'value': 'email'}), + for enable_tracking_code in (False, True): + formdef = FormDef.get_by_urlname('form-title') + formdef.fields = [ + fields.PageField(id='0', label='1st page', type='page'), + fields.StringField(id='1', label='1st field', type='string', required=False), + fields.PageField(id='4', label='2nd page', type='page'), + fields.StringField(id='5', label='field on 2nd page', + prefill = {'type': 'user', 'value': 'email'}), ] - formdef.backoffice_submission_roles = user.roles[:] - formdef.store() + formdef.backoffice_submission_roles = user.roles[:] + formdef.enable_tracking_codes = enable_tracking_code + formdef.store() - formdata = formdef.data_class()() - formdata.backoffice_submission = True - formdata.status = 'draft' - formdata.data = {} - formdata.submission_channel = 'mail' - formdata.user_id = other_user.id - formdata.submission_context = {} - formdata.store() + formdef.data_class().wipe() - formdata2 = formdef.data_class()() - formdata2.backoffice_submission = True - formdata2.status = 'draft' - formdata2.data = {} - formdata.submission_channel = 'mail' - formdata.user_id = None - formdata2.submission_context = {} - formdata2.store() + formdata = formdef.data_class()() + formdata.backoffice_submission = True + formdata.status = 'draft' + formdata.data = {} + formdata.submission_channel = 'mail' + formdata.user_id = other_user.id + formdata.submission_context = {} + formdata.store() - app = login(get_app(pub)) - resp = app.get('/backoffice/submission/form-title/') - resp = resp.form.submit('submit') - assert resp.form['f5'].value == '' + formdata2 = formdef.data_class()() + formdata2.backoffice_submission = True + formdata2.status = 'draft' + formdata2.data = {} + formdata.submission_channel = 'mail' + formdata.user_id = None + formdata2.submission_context = {} + formdata2.store() + + app = login(get_app(pub)) + resp = app.get('/backoffice/submission/form-title/') + resp = resp.form.submit('submit') + assert resp.form['f5'].value == '' + + # restore a draft + resp = app.get('/backoffice/submission/form-title/%s' % formdata.id) + resp = resp.follow() + resp = resp.form.submit('submit') + # and check it got prefilled with the user from context + assert resp.form['f5'].value == 'other@example.net' + + # restore another, without user id + resp = app.get('/backoffice/submission/form-title/%s' % formdata2.id) + resp = resp.follow() + resp = resp.form.submit('submit') + # and check it was not prefilled + assert resp.form['f5'].value == '' + + # continue with additional tests when drafts are enabled, using autosave # restore a draft + formdata.page_no = 0 + formdata.user_id = other_user.id + formdata.store() resp = app.get('/backoffice/submission/form-title/%s' % formdata.id) resp = resp.follow() + resp.form['f1'] = 'Hello' + resp_autosave = app.post('/backoffice/submission/form-title/autosave', params=resp.form.submit_fields()) + assert formdef.data_class().get(formdata.id).user_id == str(other_user.id) + assert formdef.data_class().get(formdata.id).data['1'] == 'Hello' + resp = resp.form.submit('submit') # and check it got prefilled with the user from context assert resp.form['f5'].value == 'other@example.net' - # restore another, without user id - resp = app.get('/backoffice/submission/form-title/%s' % formdata2.id) - resp = resp.follow() + assert formdef.data_class().get(formdata.id).user_id == str(other_user.id) + assert formdef.data_class().get(formdata.id).data['1'] == 'Hello' + + formdef.data_class().wipe() + resp = app.get('/backoffice/submission/form-title/') + resp.form['f1'] = 'Hello' + resp_autosave = app.post('/backoffice/submission/form-title/autosave', params=resp.form.submit_fields()) + assert formdef.data_class().count() == 1 + assert formdef.data_class().select()[0].user_id is None resp = resp.form.submit('submit') - # and check it was not prefilled - assert resp.form['f5'].value == '' + assert formdef.data_class().count() == 1 + assert formdef.data_class().select()[0].user_id is None def test_backoffice_wscall_failure_display(pub): create_user(pub) diff --git a/wcs/backoffice/submission.py b/wcs/backoffice/submission.py index 86c1319..3af7e6b 100644 --- a/wcs/backoffice/submission.py +++ b/wcs/backoffice/submission.py @@ -92,7 +92,6 @@ class FormFillPage(PublicFormFillPage): def save_draft(self, data, page_no): formdata = super(FormFillPage, self).save_draft(data, page_no) - formdata.user_id = None formdata.backoffice_submission = True formdata.store() return formdata diff --git a/wcs/forms/root.py b/wcs/forms/root.py index 096e623..456b3d0 100644 --- a/wcs/forms/root.py +++ b/wcs/forms/root.py @@ -792,9 +792,10 @@ class FormPage(Directory): formdata.page_no = page_no formdata.data = form_data formdata.receipt_time = time.localtime() - session = get_session() - if session and session.user and not str(session.user).startswith('anonymous-'): - formdata.user_id = session.user + if not get_request().is_in_backoffice(): + session = get_session() + if session and session.user and not str(session.user).startswith('anonymous-'): + formdata.user_id = session.user formdata.store() def autosave(self): @@ -836,12 +837,18 @@ class FormPage(Directory): filled.page_no = page_no filled.receipt_time = time.localtime() session = get_session() - if session and session.user and not str(session.user).startswith('anonymous-'): - filled.user_id = session.user - filled.store() - - if not filled.user_id: - get_session().mark_anonymous_formdata(filled) + if get_request().is_in_backoffice(): + # if submitting via backoffice store fhe formdata as is. + filled.store() + else: + # if submitting via frontoffice, attach current user, eventually + # anonymous, to the formdata + if session and session.user and not str(session.user).startswith('anonymous-'): + filled.user_id = session.user + filled.store() + + if not filled.user_id: + get_session().mark_anonymous_formdata(filled) data['draft_formdata_id'] = filled.id self.set_tracking_code(filled, data) -- 2.6.2