Projet

Général

Profil

0001-backoffice-make-it-possible-to-send-back-tracking-co.patch

Frédéric Péters, 15 novembre 2015 14:48

Télécharger (10 ko)

Voir les différences:

Subject: [PATCH] backoffice: make it possible to send back tracking code from
 360 view (#8697)

 tests/test_backoffice_pages.py |  51 +++++++++++++++++++-
 tests/test_workflows.py        |   1 +
 tests/utilities.py             |   9 +++-
 wcs/backoffice/management.py   | 106 ++++++++++++++++++++++++++++++++++++++++-
 4 files changed, 163 insertions(+), 4 deletions(-)
tests/test_backoffice_pages.py
23 23
from wcs.formdef import FormDef
24 24
from wcs import fields
25 25

  
26
from utilities import get_app, login, create_temporary_pub, clean_temporary_pub
26
from utilities import (get_app, login, create_temporary_pub,
27
        clean_temporary_pub, emails, sms_mocking)
27 28

  
28 29
def pytest_generate_tests(metafunc):
29 30
    if 'pub' in metafunc.fixturenames:
......
1268 1269
    resp = app.get('/backoffice/management/users/%s/' % user.id)
1269 1270
    for item in to_match:
1270 1271
        assert item in resp.body
1272

  
1273
def test_360_user_view_tracking_code(pub):
1274
    if not pub.is_using_postgresql():
1275
        pytest.skip('this requires SQL')
1276
        return
1277

  
1278
    emails.empty()
1279
    sms_mocking.empty()
1280

  
1281
    user = create_user(pub)
1282
    create_environment(pub)
1283
    app = login(get_app(pub))
1284

  
1285
    formdef = FormDef.get_by_urlname('form-title')
1286
    form_class = formdef.data_class()
1287
    number31 = [x for x in form_class.select() if x.data['1'] == 'FOO BAR 30'][0]
1288
    number31.user_id = user.id
1289
    number31.store()
1290

  
1291
    resp = app.get('/backoffice/management/users/%s/' % user.id)
1292
    assert not 'Send tracking code' in resp.body
1293

  
1294
    formdef.enable_tracking_codes = True
1295
    formdef.store()
1296
    user_view_resp = app.get('/backoffice/management/users/%s/' % user.id)
1297
    assert 'Send tracking code' in user_view_resp.body
1298

  
1299
    pub.cfg['sms'] = {'mode': 'none'}
1300
    pub.write_cfg()
1301
    resp = user_view_resp.click('Send tracking code')
1302
    assert not 'sms' in resp.form.fields
1303
    assert resp.form['email'].value == user.email
1304

  
1305
    resp = resp.form.submit()
1306
    resp = resp.follow()
1307
    assert emails.count() == 1
1308
    assert emails.get('Tracking Code reminder')['email_rcpt'] == [user.email]
1309
    assert form_class.get(number31.id).tracking_code in emails.get('Tracking Code reminder')['payload']
1310

  
1311
    pub.cfg['sms'] = {'mode': 'xx'}
1312
    pub.write_cfg()
1313
    resp = user_view_resp.click('Send tracking code', index=0)
1314
    resp.form['method'].value = 'SMS'
1315
    resp.form['sms'].value = '0123456789'
1316
    resp = resp.form.submit()
1317
    resp = resp.follow()
1318
    assert sms_mocking.sms[-1]['destinations'] == ['0123456789']
1319
    assert form_class.get(number31.id).tracking_code in sms_mocking.sms[-1]['text']
tests/test_workflows.py
604 604
    assert not str(formdata_id) in [str(x) for x in formdef.data_class().keys()]
605 605

  
606 606
def test_sms(pub):
607
    pub.cfg['sms'] = {'mode': 'xxx'}
607 608
    formdef = FormDef()
608 609
    formdef.name = 'baz'
609 610
    formdef.fields = []
tests/utilities.py
241 241

  
242 242
class SMSMocking(wcs.qommon.sms.MobytSMS):
243 243
    def __init__(self):
244
        wcs.qommon.sms.SMS.get_sms_class = classmethod(lambda x, y: self)
245
        qommon.sms.SMS.get_sms_class = classmethod(lambda x, y: self)
244
        wcs.qommon.sms.SMS.get_sms_class = self.get_sms_class
245
        qommon.sms.SMS.get_sms_class = self.get_sms_class
246 246
        self.sms = []
247 247

  
248
    def get_sms_class(self, mode):
249
        if mode == 'none':
250
            return None
251
        return self
252

  
248 253
    def send(self, sender, destinations, text, quality=None):
249 254
        self.sms.append({'sender': sender, 'destinations': destinations,
250 255
            'text': text})
wcs/backoffice/management.py
29 29
from quixote.directory import Directory
30 30
from quixote.html import TemplateIO, htmltext
31 31

  
32
from qommon.admin.emails import EmailsDirectory
33
from qommon.admin.menu import command_icon
32 34
from qommon.backoffice.menu import html_top
33 35
from qommon.backoffice.listing import pagination_links
34 36
from qommon import misc, get_logger
35 37
from qommon.afterjobs import AfterJob
38
from qommon import emails
36 39
from qommon import errors
40
from qommon import ezt
37 41
from qommon import ods
38 42
from qommon.form import *
43
from qommon.sms import SMS
39 44
from qommon.storage import (Equal, NotEqual, LessOrEqual, GreaterOrEqual, Or,
40 45
        Intersects, ILike, FtsMatch)
41 46

  
......
48 53
from wcs.roles import logged_users_role
49 54

  
50 55

  
56
class SendCodeFormdefDirectory(Directory):
57
    formdef = None
58

  
59
    def __init__(self, formdef):
60
        self.formdef = formdef
61

  
62
    def _q_lookup(self, formdata_id):
63
        html_top('management', _('Management'))
64
        formdata = self.formdef.data_class().get(formdata_id)
65

  
66
        submitter_email = formdata.formdef.get_submitter_email(formdata)
67
        mail_subject = EmailsDirectory.get_subject('tracking-code-reminder')
68
        mail_body = EmailsDirectory.get_body('tracking-code-reminder')
69

  
70
        form = Form()
71
        form.add(TextWidget, 'text', title=_('Message'), required=True,
72
                cols=60, rows=5, value=mail_body)
73
        form.add(EmailWidget, 'email', title=_('Email'), required=False,
74
                value=submitter_email)
75
        sms_class = None
76
        if get_publisher().use_sms_feature:
77
            sms_cfg = get_cfg('sms', {})
78
            mode = sms_cfg.get('mode', 'none')
79
            sms_class = SMS.get_sms_class(mode)
80
            if sms_class:
81
                form.add(StringWidget, 'sms', title=_('SMS Number'), required=False)
82
                form.add(RadiobuttonsWidget, 'method',
83
                        options=[('email', _('Email')),
84
                                 ('sms', _('SMS'))],
85
                        value='email',
86
                        required=True)
87
        form.add_submit('submit', _('Send'))
88
        form.add_submit('cancel', _('Cancel'))
89

  
90
        if not form.is_submitted() or form.has_errors():
91
            r = TemplateIO(html=True)
92
            r += htmltext('<h2>%s</h2>') % _('Send tracking code')
93
            r += form.render()
94
            return r.getvalue()
95

  
96
        if not formdata.tracking_code:
97
            tracking_code = get_publisher().tracking_code_class()
98
            tracking_code.formdata = formdata # this stores both objects
99

  
100
        msg = form.get_widget('text').parse()
101
        data = {
102
            'form_tracking_code': formdata.tracking_code,
103
            'tracking_code': formdata.tracking_code,
104
            'email': form.get_widget('email').parse(),
105
        }
106
        data.update(self.formdef.get_substitution_variables(minimal=True))
107

  
108
        msg_template = ezt.Template(compress_whitespace=False)
109
        msg_template.parse(msg)
110
        fd = cStringIO.StringIO()
111
        msg_template.generate(fd, data)
112
        msg_body = fd.getvalue()
113

  
114
        if sms_class and form.get_widget('method').parse() == 'sms':
115
            # send sms
116
            sitename = get_cfg('misc', {}).get('sitename') or 'w.c.s.'
117
            sender = sms_cfg.get('sender', sitename)[:11]
118
            message = msg_body
119
            try:
120
                sms_class.send(sender,
121
                        [form.get_widget('sms').parse()],
122
                        message[:160])
123
            except errors.SMSError, e:
124
                get_logger().error(e)
125
            get_session().message = ('info', _('SMS with tracking code sent to the user'))
126
        else:
127
            # send mail
128
            emails.ezt_email(mail_subject, msg_body,
129
                    mail_body_data=data,
130
                    email_rcpt=form.get_widget('email').parse())
131
            get_session().message = ('info', _('Email with tracking code sent to the user'))
132

  
133
        return redirect('../..')
134

  
135

  
136
class SendCodeDirectory(Directory):
137
    def _q_lookup(self, component):
138
        try:
139
            formdef = FormDef.get_by_urlname(component)
140
            return SendCodeFormdefDirectory(formdef)
141
        except KeyError:
142
            raise errors.TraversalError()
143

  
51 144

  
52 145
class UserViewDirectory(Directory):
53
    _q_exports = ['']
146
    _q_exports = ['', 'sendcode']
54 147

  
148
    sendcode = SendCodeDirectory()
55 149
    user = None
56 150

  
57 151
    def __init__(self, user):
......
70 164
        formdatas = sql.AnyFormData.select(criterias, order_by='-receipt_time', limit=50)
71 165

  
72 166
        r = TemplateIO(html=True)
167
        r += get_session().display_message()
168

  
73 169
        r += htmltext('<div class="bo-block">')
74 170
        r += htmltext('<h2>%s</h2>') % self.user.display_name
75 171
        formdef = UserFieldsFormDef()
......
125 221
                            formdata.get_url(backoffice=True),
126 222
                            formdata.formdef.name,
127 223
                            submit_date, status_label))
224
                    if formdata.formdef.enable_tracking_codes:
225
                        r += htmltext('<p class="commands">')
226
                        r += command_icon('sendcode/%s/%s' %
227
                                (formdata.formdef.url_name, formdata.id),
228
                                'export',
229
                                label=_('Send tracking code'),
230
                                popup=True)
231
                        r += htmltext('</p>')
128 232
                r += htmltext('</ul>')
129 233
                r += htmltext('</div>')
130 234
            r += htmltext('</div>')
131
-