Projet

Général

Profil

0001-manager-add-test-sms-send-20174.patch

Serghei Mihai, 06 décembre 2017 16:55

Télécharger (11,7 ko)

Voir les différences:

Subject: [PATCH] manager: add test sms send (#20174)

 corbo/forms.py                                     |  4 +
 corbo/manage_urls.py                               |  5 +-
 corbo/templates/corbo/announce_view.html           |  3 +
 ...end_form.html => email_test_announce_form.html} |  1 -
 corbo/templates/corbo/sms_test_announce_form.html  | 22 ++++++
 corbo/views.py                                     | 43 ++++++++---
 tests/test_manager.py                              | 89 +++++++++++++++++++++-
 7 files changed, 153 insertions(+), 14 deletions(-)
 rename corbo/templates/corbo/{test_email_send_form.html => email_test_announce_form.html} (99%)
 create mode 100644 corbo/templates/corbo/sms_test_announce_form.html
corbo/forms.py
81 81

  
82 82
class SendTestEmailForm(forms.Form):
83 83
    email = forms.EmailField()
84

  
85

  
86
class SendTestSMSForm(forms.Form):
87
    mobile = forms.CharField(label=_('Mobile number'))
corbo/manage_urls.py
2 2

  
3 3
from .views import add_announce, edit_announce, delete_announce, \
4 4
    add_category, edit_category, view_category, delete_category, manage, \
5
    subscriptions_import, view_announce, email_announce, menu_json
5
    subscriptions_import, view_announce, email_announce, sms_announce, \
6
    menu_json
6 7

  
7 8
urlpatterns = patterns('',
8 9
            url(r'^$', manage, name='manage'),
......
14 15
                name='delete_announce'),
15 16
            url(r'^announce/email/(?P<pk>\d+)/$', email_announce,
16 17
                name='email_announce'),
18
            url(r'^announce/sms/(?P<pk>\d+)/$', sms_announce,
19
                name='sms_announce'),
17 20
            url(r'^category/(?P<slug>[\w-]+)/$', view_category,
18 21
                name='view_category'),
19 22
            url(r'^announce/(?P<pk>\d+)/$', view_announce,
corbo/templates/corbo/announce_view.html
12 12
<a href="{% url 'delete_announce' pk=object.pk %}" rel="popup">{% trans 'Delete' %}</a>
13 13
<a href="{% url 'edit_announce' pk=object.pk %}">{% trans 'Edit' %}</a>
14 14
<a href="{% url 'email_announce' pk=object.pk %}" rel="popup">{% trans 'Send test email' %}</a>
15
{% if sms_enabled %}
16
<a href="{% url 'sms_announce' pk=object.pk %}" rel="popup">{% trans 'Send test SMS' %}</a>
17
{% endif %}
15 18
{% endblock %}
16 19
{% block content %}
17 20
<div class="announce_block">
corbo/templates/corbo/test_email_send_form.html → corbo/templates/corbo/email_test_announce_form.html
10 10
<h2>{% trans "Send test email" %}</h2>
11 11
{% endblock %}
12 12

  
13

  
14 13
{% block content %}
15 14
<form method="post">
16 15
  {% csrf_token %}
corbo/templates/corbo/sms_test_announce_form.html
1
{% extends "corbo/manage.html" %}
2
{% load i18n static %}
3

  
4
{% block breadcrumb %}
5
{{ block.super }}
6
<a href="{% url "view_announce" pk=object.pk %}">{{ object.title }}</a>
7
{% endblock %}
8

  
9
{% block appbar %}
10
<h2>{% trans "Send test SMS" %}</h2>
11
{% endblock %}
12

  
13
{% block content %}
14
<form method="post">
15
  {% csrf_token %}
16
  {{ form.as_p }}
17
  <div class="buttons">
18
    <button class="submit-button">{% trans "Send" %}</button>
19
    <a href="{% url "view_announce" pk=object.pk %}" class="cancel">{% trans "Cancel" %}</a>
20
  </div>
21
</form>
22
{% endblock %}
corbo/views.py
20 20

  
21 21
import models
22 22
from .forms import AnnounceForm, CategoryForm, SubscriptionsImportForm, \
23
    SendTestEmailForm
23
    SendTestEmailForm, SendTestSMSForm
24 24
from . import utils
25 25

  
26 26
try:
......
264 264
        context = super(AnnounceView, self).get_context_data(**kwargs)
265 265
        context['category'] = self.object.category
266 266
        context['broadcasts'] = self.object.broadcast_set.filter(deliver_time__isnull=False)
267
        context['sms_enabled'] = settings.SMS_GATEWAY_URL
267 268
        return context
268 269

  
269 270
view_announce = AnnounceView.as_view()
270 271

  
271 272

  
272
class EmailAnnounceView(FormView):
273
    form_class = SendTestEmailForm
274
    template_name = 'corbo/test_email_send_form.html'
275

  
273
class SendAnnounceView(FormView):
276 274
    def get_initial(self):
277
        return {'email': self.request.user.email}
275
        return {'email': self.request.user.email,
276
                'mobile': self.request.session.get('mellon_session', {}).get('mobile', '')}
278 277

  
279 278
    def get_success_url(self, *args, **kwargs):
280 279
        return reverse('view_announce', kwargs={'pk': self.kwargs['pk']})
281 280

  
281
    def get_context_data(self, **kwargs):
282
        context = super(SendAnnounceView, self).get_context_data(**kwargs)
283
        context['object'] = models.Announce.objects.get(pk=self.kwargs['pk'])
284
        return context
285

  
286

  
287
class EmailAnnounceView(SendAnnounceView):
288
    form_class = SendTestEmailForm
289
    template_name = 'corbo/email_test_announce_form.html'
290

  
282 291
    def form_valid(self, form):
283 292
        email = form.cleaned_data['email']
284 293
        announce = models.Announce.objects.get(pk=self.kwargs['pk'])
......
286 295
        messages.info(self.request, _('Email successfully sent'))
287 296
        return super(EmailAnnounceView, self).form_valid(form)
288 297

  
289
    def get_context_data(self, **kwargs):
290
        context = super(EmailAnnounceView, self).get_context_data(**kwargs)
291
        context['object'] = models.Announce.objects.get(pk=self.kwargs['pk'])
292
        return context
293

  
294 298
email_announce = EmailAnnounceView.as_view()
295 299

  
300

  
301
class SMSAnnounceView(SendAnnounceView):
302
    form_class = SendTestSMSForm
303
    template_name = 'corbo/sms_test_announce_form.html'
304

  
305
    def form_valid(self, form):
306
        mobile = form.cleaned_data['mobile']
307
        announce = models.Announce.objects.get(pk=self.kwargs['pk'])
308
        if (utils.send_sms(announce.text, [mobile])):
309
            messages.info(self.request, _('SMS successfully sent'))
310
        else:
311
            messages.error(self.request, _('Error occured while sending SMS'))
312
        return super(SMSAnnounceView, self).form_valid(form)
313

  
314
sms_announce = SMSAnnounceView.as_view()
315

  
316

  
296 317
def menu_json(request):
297 318
    label = _('Announces')
298 319
    json_str = json.dumps([{'label': force_text(label),
tests/test_manager.py
1
import logging
2
import mock
1 3
import os
2 4
import pytest
3 5

  
4 6
from django.core.urlresolvers import reverse
5 7
from django.contrib.auth.models import User
8
from django.test import override_settings
6 9

  
7 10
from corbo.models import Broadcast
8 11

  
......
209 212
    assert resp.status_int == 302
210 213
    assert resp.location == 'http://testserver/manage/category/alerts/'
211 214

  
212
def test_send_announce(app, admin_user):
215
def test_email_announce(app, admin_user):
213 216
    app = login(app)
214 217
    resp = app.get('/manage/')
215 218
    assert 'New category' in resp.content
......
233 236
    assert 'First announce' in resp.content
234 237
    resp = resp.click('First announce')
235 238
    assert 'Send test email' in resp.content
239
    assert 'Send test SMS' not in resp.content
236 240
    resp = resp.click('Send test email')
237 241
    send_form = resp.forms[0]
238 242
    assert send_form.method == 'post'
......
243 247
    resp = send_form.submit()
244 248
    assert resp.status_int == 302
245 249
    assert resp.location == 'http://testserver/manage/announce/1/'
250

  
251
@mock.patch('corbo.utils.requests.post')
252
def test_sms_announce(mocked_post, app, admin_user, settings):
253
    app = login(app)
254
    resp = app.get('/manage/')
255
    assert 'New category' in resp.content
256
    category_page = resp.click('New category')
257
    category_form = category_page.forms[0]
258
    category_form['name'] = 'Alerts'
259
    resp = category_form.submit()
260
    assert resp.status_int == 302
261
    assert resp.location == 'http://testserver/manage/'
262
    resp = resp.follow()
263
    resp = resp.click('Alerts')
264
    assert 'New announce' in resp.content
265
    announce_page = resp.click('New announce')
266
    announce_form = announce_page.forms[0]
267
    announce_form['title'] = 'First announce'
268
    announce_form['text'] = 'announce content'
269
    resp = announce_form.submit()
270
    assert resp.status_int == 302
271
    assert resp.location == 'http://testserver/manage/category/alerts/'
272
    resp = resp.follow()
273
    assert 'First announce' in resp.content
274
    settings.SMS_GATEWAY_URL='http:/passerelle.com'
275
    resp = resp.click('First announce')
276
    assert 'Send test SMS' in resp.content
277
    resp = resp.click('Send test SMS')
278
    send_form = resp.forms[0]
279
    assert 'mobile' in send_form.fields
280
    assert send_form.fields['mobile'][0].value == ''
281
    resp = send_form.submit()
282
    assert resp.status_int == 200
283
    form = resp.forms[0]
284
    form['mobile'] = '0607080900'
285
    mocked_response = mock.Mock()
286
    mocked_response.json.return_value = {'err': 0, 'data': True}
287
    mocked_post.return_value = mocked_response
288
    resp = form.submit()
289
    assert resp.location == 'http://testserver/manage/announce/1/'
290
    resp = resp.follow()
291
    assert 'SMS successfully sent' in resp.content
292
    resp = resp.click('Send test SMS')
293
    form = resp.forms[0]
294
    form['mobile'] = '0607080900'
295
    mocked_response.json.return_value = {'err': 1, 'data': None, 'err_desc': 'Destination error'}
296
    resp = form.submit()
297
    resp = resp.follow()
298
    assert 'Error occured while sending SMS' in resp.content
299

  
300
def test_sms_announce_with_invalid_gateway_url(app, admin_user, settings, caplog):
301
    app = login(app)
302
    resp = app.get('/manage/')
303
    assert 'New category' in resp.content
304
    category_page = resp.click('New category')
305
    category_form = category_page.forms[0]
306
    category_form['name'] = 'Alerts'
307
    resp = category_form.submit()
308
    resp = resp.follow()
309
    resp = resp.click('Alerts')
310
    assert 'New announce' in resp.content
311
    announce_page = resp.click('New announce')
312
    announce_form = announce_page.forms[0]
313
    announce_form['title'] = 'First announce'
314
    announce_form['text'] = 'announce content'
315
    resp = announce_form.submit()
316
    assert resp.status_int == 302
317
    assert resp.location == 'http://testserver/manage/category/alerts/'
318
    resp = resp.follow()
319
    assert 'First announce' in resp.content
320
    settings.SMS_GATEWAY_URL='invalid_url'
321
    resp = resp.click('First announce')
322
    assert 'Send test SMS' in resp.content
323
    resp = resp.click('Send test SMS')
324
    form = resp.forms[0]
325
    form['mobile'] = '0607080900'
326
    resp = form.submit()
327
    records = caplog.records
328
    assert len(records) == 1
329
    for record in records:
330
        assert record.name == 'corbo.utils'
331
        assert record.levelno == logging.WARNING
332
        assert 'Invalid URL' in record.getMessage()
246
-