From 6da6c4dcdc2ee6c9bcf999dc86dbd55fff8c9295 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 20 Oct 2016 17:13:00 +0200 Subject: [PATCH] backoffice: allow manual submission channel selection (#13626) --- tests/test_backoffice_pages.py | 50 ++++++++++++++++++++++++++++++++++++ wcs/backoffice/submission.py | 40 +++++++++++++++++++++++++++++ wcs/forms/root.py | 18 ++++++++----- wcs/qommon/static/js/qommon.admin.js | 5 ++++ 4 files changed, 107 insertions(+), 6 deletions(-) diff --git a/tests/test_backoffice_pages.py b/tests/test_backoffice_pages.py index 551093d..b7078fe 100644 --- a/tests/test_backoffice_pages.py +++ b/tests/test_backoffice_pages.py @@ -1688,6 +1688,56 @@ def test_backoffice_submission_substitution_vars(pub): resp = resp.form.submit('submit') assert 'XPLOPYbarZ' in resp.body +def test_backoffice_submission_manual_channel(pub): + user = create_user(pub) + create_environment(pub) + + app = login(get_app(pub)) + resp = app.get('/backoffice/') + assert not 'Submission' in resp.body + app.get('/backoffice/submission/', status=403) + + formdef = FormDef.get_by_urlname('form-title') + formdef.backoffice_submission_roles = user.roles[:] + formdef.store() + resp = app.get('/backoffice/') + assert 'Submission' in resp.body + resp = app.get('/backoffice/submission/') + assert formdef.url_name in resp.body + + resp = resp.click(formdef.name) + assert resp.form['submission_channel'].attrs['type'] == 'hidden' + resp.form['submission_channel'] = 'mail' + resp.form['f1'] = 'test submission' + resp.form['f2'] = 'baz' + resp.form['f3'] = 'C' + resp = resp.form.submit('submit') + assert 'Check values then click submit.' in resp.body + + # final submit + resp = resp.form.submit('submit') + + formdata_no = resp.location.split('/')[-2] + data_class = formdef.data_class() + assert data_class.get(formdata_no).data['1'] == 'test submission' + assert data_class.get(formdata_no).data['2'] == 'baz' + assert data_class.get(formdata_no).status == 'wf-new' + assert data_class.get(formdata_no).user is None + assert data_class.get(formdata_no).backoffice_submission is True + assert data_class.get(formdata_no).submission_channel == 'mail' + +def test_backoffice_submission_no_manual_channel_with_welco(pub, welco_url): + user = create_user(pub) + create_environment(pub) + + formdef = FormDef.get_by_urlname('form-title') + formdef.backoffice_submission_roles = user.roles[:] + formdef.store() + + app = login(get_app(pub)) + resp = app.get('/backoffice/submission/%s/' % formdef.url_name) + assert 'submission_channel' not in resp.form.fields + def test_backoffice_wscall_failure_display(pub): create_user(pub) create_environment(pub) diff --git a/wcs/backoffice/submission.py b/wcs/backoffice/submission.py index 05ed286..0c5d9a6 100644 --- a/wcs/backoffice/submission.py +++ b/wcs/backoffice/submission.py @@ -74,8 +74,13 @@ class FormFillPage(PublicFormFillPage): def __init__(self, *args, **kwargs): super(FormFillPage, self).__init__(*args, **kwargs) + self.selected_submission_channel = None self.remove_draft = RemoveDraftDirectory(self) + def _q_index(self, *args, **kwargs): + self.selected_submission_channel = get_request().form.get('submission_channel') or '' + return super(FormFillPage, self)._q_index(*args, **kwargs) + def html_top(self, *args, **kwargs): return html_top('submission', *args, **kwargs) @@ -108,6 +113,25 @@ class FormFillPage(PublicFormFillPage): else: r += htmltext('

-

') + welco_url = get_publisher().get_site_option('welco_url', 'options') + if not welco_url and not self.edit_mode: + r += htmltext('') + if formdata and formdata.submission_context: from .management import FormBackOfficeStatusPage r += FormBackOfficeStatusPage(self.formdef, formdata).get_extra_context_bar() @@ -119,6 +143,20 @@ class FormFillPage(PublicFormFillPage): return r.getvalue() + def create_view_form(self, *args, **kwargs): + form = super(FormFillPage, self).create_view_form(*args, **kwargs) + welco_url = get_publisher().get_site_option('welco_url', 'options') + if not welco_url: + form.add_hidden('submission_channel', self.selected_submission_channel) + return form + + def create_form(self, *args, **kwargs): + form = super(FormFillPage, self).create_form(*args, **kwargs) + welco_url = get_publisher().get_site_option('welco_url', 'options') + if not welco_url: + form.add_hidden('submission_channel', self.selected_submission_channel) + return form + def form_side(self, step_no, page_no=0, log_detail=None, data=None, magictoken=None): r = TemplateIO(html=True) get_response().filter['sidebar'] = self.get_sidebar(data) @@ -138,6 +176,8 @@ class FormFillPage(PublicFormFillPage): filled.backoffice_submission = True if not filled.submission_context: filled.submission_context = {} + if self.selected_submission_channel: + filled.submission_channel = self.selected_submission_channel filled.submission_context['agent_id'] = get_request().user.id filled.store() diff --git a/wcs/forms/root.py b/wcs/forms/root.py index f952818..4d16737 100644 --- a/wcs/forms/root.py +++ b/wcs/forms/root.py @@ -336,7 +336,7 @@ class FormPage(Directory): magictoken = get_request().form['magictoken'] self.feed_current_data(magictoken) - form = self.formdef.create_form(page_no, displayed_fields) + form = self.create_form(page_no, displayed_fields) if page_error_messages: form.add_global_errors(page_error_messages) if getattr(session, 'ajax_form_token', None): @@ -518,6 +518,12 @@ class FormPage(Directory): raise errors.AccessForbiddenError() return False + def create_form(self, *args, **kwargs): + return self.formdef.create_form(*args, **kwargs) + + def create_view_form(self, *args, **kwargs): + return self.formdef.create_view_form(*args, **kwargs) + def _q_index(self, log_detail=None): self.check_role() if self.check_disabled(): @@ -664,7 +670,7 @@ class FormPage(Directory): self.feed_current_data(magictoken) - form = self.formdef.create_form(page_no) + form = self.create_form(page_no) form.add_submit('previous') if self.formdef.enable_tracking_codes: form.add_submit('removedraft') @@ -763,7 +769,7 @@ class FormPage(Directory): v = field.convert_value_to_str(v) req.form['f%s' % k] = v if self.edit_mode: - form = self.formdef.create_view_form(form_data, use_tokens=False) + form = self.create_view_form(form_data, use_tokens=False) return self.submitted_existing(form) if self.has_confirmation_page(): return self.validating(form_data) @@ -818,7 +824,7 @@ class FormPage(Directory): return redirect(filled.get_url().rstrip('/')) # so it gets FakeFileWidget in preview mode - form = self.formdef.create_view_form(form_data, + form = self.create_view_form(form_data, use_tokens=self.has_confirmation_page()) if self.formdef.has_captcha and not (get_session().get_user() or get_session().won_captcha): form.add_captcha(hint='') @@ -905,7 +911,7 @@ class FormPage(Directory): if not form_data: return result_error('missing data') - form = self.formdef.create_form(page_no) + form = self.create_form(page_no) data = self.formdef.get_data(form) if not data: return result_error('nothing to save') @@ -1073,7 +1079,7 @@ class FormPage(Directory): r += self.form_side(step_no=1, data=data, magictoken=get_request().form['magictoken']) r += TextsDirectory.get_html_text('check-before-submit') - form = self.formdef.create_view_form(data) + form = self.create_view_form(data) token_widget = form.get_widget(form.TOKEN_NAME) token_widget._parsed = True if self.formdef.has_captcha and not (get_session().get_user() or get_session().won_captcha): diff --git a/wcs/qommon/static/js/qommon.admin.js b/wcs/qommon/static/js/qommon.admin.js index 4f0cc7e..1d74bde 100644 --- a/wcs/qommon/static/js/qommon.admin.js +++ b/wcs/qommon/static/js/qommon.admin.js @@ -61,6 +61,11 @@ $(function() { return false; }); + /* submission channel */ + $('div.submit-channel-selection').show().find('select').on('change', function() { + $('input[type=hidden][name=submission_channel]').val($(this).val()); + }); + /* keep sidebar sticky */ if ($('#sidebar').length) { var $window = $(window); -- 2.9.3