Projet

Général

Profil

0001-backoffice-allow-manual-submission-channel-selection.patch

Frédéric Péters, 20 octobre 2016 17:17

Télécharger (9,87 ko)

Voir les différences:

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(-)
tests/test_backoffice_pages.py
1688 1688
    resp = resp.form.submit('submit')
1689 1689
    assert 'XPLOPYbarZ' in resp.body
1690 1690

  
1691
def test_backoffice_submission_manual_channel(pub):
1692
    user = create_user(pub)
1693
    create_environment(pub)
1694

  
1695
    app = login(get_app(pub))
1696
    resp = app.get('/backoffice/')
1697
    assert not 'Submission' in resp.body
1698
    app.get('/backoffice/submission/', status=403)
1699

  
1700
    formdef = FormDef.get_by_urlname('form-title')
1701
    formdef.backoffice_submission_roles = user.roles[:]
1702
    formdef.store()
1703
    resp = app.get('/backoffice/')
1704
    assert 'Submission' in resp.body
1705
    resp = app.get('/backoffice/submission/')
1706
    assert formdef.url_name in resp.body
1707

  
1708
    resp = resp.click(formdef.name)
1709
    assert resp.form['submission_channel'].attrs['type'] == 'hidden'
1710
    resp.form['submission_channel'] = 'mail'
1711
    resp.form['f1'] = 'test submission'
1712
    resp.form['f2'] = 'baz'
1713
    resp.form['f3'] = 'C'
1714
    resp = resp.form.submit('submit')
1715
    assert 'Check values then click submit.' in resp.body
1716

  
1717
    # final submit
1718
    resp = resp.form.submit('submit')
1719

  
1720
    formdata_no = resp.location.split('/')[-2]
1721
    data_class = formdef.data_class()
1722
    assert data_class.get(formdata_no).data['1'] == 'test submission'
1723
    assert data_class.get(formdata_no).data['2'] == 'baz'
1724
    assert data_class.get(formdata_no).status == 'wf-new'
1725
    assert data_class.get(formdata_no).user is None
1726
    assert data_class.get(formdata_no).backoffice_submission is True
1727
    assert data_class.get(formdata_no).submission_channel == 'mail'
1728

  
1729
def test_backoffice_submission_no_manual_channel_with_welco(pub, welco_url):
1730
    user = create_user(pub)
1731
    create_environment(pub)
1732

  
1733
    formdef = FormDef.get_by_urlname('form-title')
1734
    formdef.backoffice_submission_roles = user.roles[:]
1735
    formdef.store()
1736

  
1737
    app = login(get_app(pub))
1738
    resp = app.get('/backoffice/submission/%s/' % formdef.url_name)
1739
    assert 'submission_channel' not in resp.form.fields
1740

  
1691 1741
def test_backoffice_wscall_failure_display(pub):
1692 1742
    create_user(pub)
1693 1743
    create_environment(pub)
wcs/backoffice/submission.py
74 74

  
75 75
    def __init__(self, *args, **kwargs):
76 76
        super(FormFillPage, self).__init__(*args, **kwargs)
77
        self.selected_submission_channel = None
77 78
        self.remove_draft = RemoveDraftDirectory(self)
78 79

  
80
    def _q_index(self, *args, **kwargs):
81
        self.selected_submission_channel = get_request().form.get('submission_channel') or ''
82
        return super(FormFillPage, self)._q_index(*args, **kwargs)
83

  
79 84
    def html_top(self, *args, **kwargs):
80 85
        return html_top('submission', *args, **kwargs)
81 86

  
......
108 113
            else:
109 114
                r += htmltext('<p>-</p>')
110 115

  
116
        welco_url = get_publisher().get_site_option('welco_url', 'options')
117
        if not welco_url and not self.edit_mode:
118
            r += htmltext('<div class="submit-channel-selection" style="display: none;">')
119
            r += htmltext('<h3>%s</h3>') % _('Channel')
120
            r += htmltext('<select>')
121
            for channel_key, channel_label in [
122
                     ('', '-'),
123
                     ('web', _('Web')),
124
                     ('mail', _('Mail')),
125
                     ('phone', _('Phone')),
126
                     ('counter', _('Counter'))]:
127
                selected = ''
128
                if self.selected_submission_channel == channel_key:
129
                    selected = 'selected="selected"'
130
                r += htmltext('<option value="%s" %s>' % (channel_key, selected))
131
                r += htmltext('%s</option>') % channel_label
132
            r += htmltext('</select>')
133
            r += htmltext('</div>')
134

  
111 135
        if formdata and formdata.submission_context:
112 136
            from .management import FormBackOfficeStatusPage
113 137
            r += FormBackOfficeStatusPage(self.formdef, formdata).get_extra_context_bar()
......
119 143

  
120 144
        return r.getvalue()
121 145

  
146
    def create_view_form(self, *args, **kwargs):
147
        form = super(FormFillPage, self).create_view_form(*args, **kwargs)
148
        welco_url = get_publisher().get_site_option('welco_url', 'options')
149
        if not welco_url:
150
            form.add_hidden('submission_channel', self.selected_submission_channel)
151
        return form
152

  
153
    def create_form(self, *args, **kwargs):
154
        form = super(FormFillPage, self).create_form(*args, **kwargs)
155
        welco_url = get_publisher().get_site_option('welco_url', 'options')
156
        if not welco_url:
157
            form.add_hidden('submission_channel', self.selected_submission_channel)
158
        return form
159

  
122 160
    def form_side(self, step_no, page_no=0, log_detail=None, data=None, magictoken=None):
123 161
        r = TemplateIO(html=True)
124 162
        get_response().filter['sidebar'] = self.get_sidebar(data)
......
138 176
        filled.backoffice_submission = True
139 177
        if not filled.submission_context:
140 178
            filled.submission_context = {}
179
        if self.selected_submission_channel:
180
            filled.submission_channel = self.selected_submission_channel
141 181
        filled.submission_context['agent_id'] = get_request().user.id
142 182
        filled.store()
143 183

  
wcs/forms/root.py
336 336
            magictoken = get_request().form['magictoken']
337 337
            self.feed_current_data(magictoken)
338 338

  
339
        form = self.formdef.create_form(page_no, displayed_fields)
339
        form = self.create_form(page_no, displayed_fields)
340 340
        if page_error_messages:
341 341
            form.add_global_errors(page_error_messages)
342 342
        if getattr(session, 'ajax_form_token', None):
......
518 518
                raise errors.AccessForbiddenError()
519 519
        return False
520 520

  
521
    def create_form(self, *args, **kwargs):
522
        return self.formdef.create_form(*args, **kwargs)
523

  
524
    def create_view_form(self, *args, **kwargs):
525
        return self.formdef.create_view_form(*args, **kwargs)
526

  
521 527
    def _q_index(self, log_detail=None):
522 528
        self.check_role()
523 529
        if self.check_disabled():
......
664 670

  
665 671
            self.feed_current_data(magictoken)
666 672

  
667
            form = self.formdef.create_form(page_no)
673
            form = self.create_form(page_no)
668 674
            form.add_submit('previous')
669 675
            if self.formdef.enable_tracking_codes:
670 676
                form.add_submit('removedraft')
......
763 769
                            v = field.convert_value_to_str(v)
764 770
                        req.form['f%s' % k] = v
765 771
                if self.edit_mode:
766
                    form = self.formdef.create_view_form(form_data, use_tokens=False)
772
                    form = self.create_view_form(form_data, use_tokens=False)
767 773
                    return self.submitted_existing(form)
768 774
                if self.has_confirmation_page():
769 775
                    return self.validating(form_data)
......
818 824
                return redirect(filled.get_url().rstrip('/'))
819 825

  
820 826
            # so it gets FakeFileWidget in preview mode
821
            form = self.formdef.create_view_form(form_data,
827
            form = self.create_view_form(form_data,
822 828
                    use_tokens=self.has_confirmation_page())
823 829
            if self.formdef.has_captcha and not (get_session().get_user() or get_session().won_captcha):
824 830
                form.add_captcha(hint='')
......
905 911
        if not form_data:
906 912
            return result_error('missing data')
907 913

  
908
        form = self.formdef.create_form(page_no)
914
        form = self.create_form(page_no)
909 915
        data = self.formdef.get_data(form)
910 916
        if not data:
911 917
            return result_error('nothing to save')
......
1073 1079
        r += self.form_side(step_no=1, data=data,
1074 1080
                magictoken=get_request().form['magictoken'])
1075 1081
        r += TextsDirectory.get_html_text('check-before-submit')
1076
        form = self.formdef.create_view_form(data)
1082
        form = self.create_view_form(data)
1077 1083
        token_widget = form.get_widget(form.TOKEN_NAME)
1078 1084
        token_widget._parsed = True
1079 1085
        if self.formdef.has_captcha and not (get_session().get_user() or get_session().won_captcha):
wcs/qommon/static/js/qommon.admin.js
61 61
      return false;
62 62
    });
63 63

  
64
    /* submission channel */
65
    $('div.submit-channel-selection').show().find('select').on('change', function() {
66
      $('input[type=hidden][name=submission_channel]').val($(this).val());
67
    });
68

  
64 69
    /* keep sidebar sticky */
65 70
    if ($('#sidebar').length) {
66 71
      var $window = $(window);
67
-