From 101421af17d2f46925084a56ecf84172bd4957ab Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Mon, 4 Dec 2017 17:30:06 +0100 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 | 44 ++++++--- tests/test_manager.py | 101 ++++++++++++++++++++- 7 files changed, 166 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 diff --git a/corbo/forms.py b/corbo/forms.py index 4df334e..7b1b336 100644 --- a/corbo/forms.py +++ b/corbo/forms.py @@ -81,3 +81,7 @@ class SubscriptionsImportForm(forms.Form): class SendTestEmailForm(forms.Form): email = forms.EmailField() + + +class SendTestSMSForm(forms.Form): + mobile = forms.CharField(label=_('Mobile number')) diff --git a/corbo/manage_urls.py b/corbo/manage_urls.py index 05bb0fb..7b126d0 100644 --- a/corbo/manage_urls.py +++ b/corbo/manage_urls.py @@ -2,7 +2,8 @@ from django.conf.urls import patterns, include, url from .views import add_announce, edit_announce, delete_announce, \ add_category, edit_category, view_category, delete_category, manage, \ - subscriptions_import, view_announce, email_announce, menu_json + subscriptions_import, view_announce, email_announce, sms_announce, \ + menu_json urlpatterns = patterns('', url(r'^$', manage, name='manage'), @@ -14,6 +15,8 @@ urlpatterns = patterns('', name='delete_announce'), url(r'^announce/email/(?P\d+)/$', email_announce, name='email_announce'), + url(r'^announce/sms/(?P\d+)/$', sms_announce, + name='sms_announce'), url(r'^category/(?P[\w-]+)/$', view_category, name='view_category'), url(r'^announce/(?P\d+)/$', view_announce, diff --git a/corbo/templates/corbo/announce_view.html b/corbo/templates/corbo/announce_view.html index ef5c9fc..4874c2f 100644 --- a/corbo/templates/corbo/announce_view.html +++ b/corbo/templates/corbo/announce_view.html @@ -12,6 +12,9 @@ {% trans 'Delete' %} {% trans 'Edit' %} {% trans 'Send test email' %} +{% if sms_enabled %} +{% trans 'Send test SMS' %} +{% endif %} {% endblock %} {% block content %}
diff --git a/corbo/templates/corbo/test_email_send_form.html b/corbo/templates/corbo/email_test_announce_form.html similarity index 99% rename from corbo/templates/corbo/test_email_send_form.html rename to corbo/templates/corbo/email_test_announce_form.html index f3d4e5c..32c8381 100644 --- a/corbo/templates/corbo/test_email_send_form.html +++ b/corbo/templates/corbo/email_test_announce_form.html @@ -10,7 +10,6 @@

{% trans "Send test email" %}

{% endblock %} - {% block content %}
{% csrf_token %} diff --git a/corbo/templates/corbo/sms_test_announce_form.html b/corbo/templates/corbo/sms_test_announce_form.html new file mode 100644 index 0000000..505da30 --- /dev/null +++ b/corbo/templates/corbo/sms_test_announce_form.html @@ -0,0 +1,22 @@ +{% extends "corbo/manage.html" %} +{% load i18n static %} + +{% block breadcrumb %} +{{ block.super }} +{{ object.title }} +{% endblock %} + +{% block appbar %} +

{% trans "Send test SMS" %}

+{% endblock %} + +{% block content %} + + {% csrf_token %} + {{ form.as_p }} +
+ + {% trans "Cancel" %} +
+
+{% endblock %} diff --git a/corbo/views.py b/corbo/views.py index c61e58b..b657fe6 100644 --- a/corbo/views.py +++ b/corbo/views.py @@ -20,7 +20,7 @@ from django.utils.translation import ngettext import models from .forms import AnnounceForm, CategoryForm, SubscriptionsImportForm, \ - SendTestEmailForm + SendTestEmailForm, SendTestSMSForm from . import utils try: @@ -264,21 +264,30 @@ class AnnounceView(DetailView): context = super(AnnounceView, self).get_context_data(**kwargs) context['category'] = self.object.category context['broadcasts'] = self.object.broadcast_set.filter(deliver_time__isnull=False) + context['sms_enabled'] = settings.SMS_GATEWAY_URL return context view_announce = AnnounceView.as_view() -class EmailAnnounceView(FormView): - form_class = SendTestEmailForm - template_name = 'corbo/test_email_send_form.html' - +class SendAnnounceView(FormView): def get_initial(self): - return {'email': self.request.user.email} + return {'email': self.request.user.email, + 'mobile': self.request.session.get('mellon_session', {}).get('mobile', '')} def get_success_url(self, *args, **kwargs): return reverse('view_announce', kwargs={'pk': self.kwargs['pk']}) + def get_context_data(self, **kwargs): + context = super(SendAnnounceView, self).get_context_data(**kwargs) + context['object'] = models.Announce.objects.get(pk=self.kwargs['pk']) + return context + + +class EmailAnnounceView(SendAnnounceView): + form_class = SendTestEmailForm + template_name = 'corbo/email_test_announce_form.html' + def form_valid(self, form): email = form.cleaned_data['email'] announce = models.Announce.objects.get(pk=self.kwargs['pk']) @@ -286,13 +295,26 @@ class EmailAnnounceView(FormView): messages.info(self.request, _('Email successfully sent')) return super(EmailAnnounceView, self).form_valid(form) - def get_context_data(self, **kwargs): - context = super(EmailAnnounceView, self).get_context_data(**kwargs) - context['object'] = models.Announce.objects.get(pk=self.kwargs['pk']) - return context - email_announce = EmailAnnounceView.as_view() + +class SMSAnnounceView(SendAnnounceView): + form_class = SendTestSMSForm + template_name = 'corbo/sms_test_announce_form.html' + + def form_valid(self, form): + mobile = form.cleaned_data['mobile'] + announce = models.Announce.objects.get(pk=self.kwargs['pk']) + sms_sent = utils.send_sms(announce.text, [mobile]) + if sms_sent == 1: + messages.info(self.request, _('SMS successfully sent')) + else: + messages.error(self.request, _('Error occured while sending SMS')) + return super(SMSAnnounceView, self).form_valid(form) + +sms_announce = SMSAnnounceView.as_view() + + def menu_json(request): label = _('Announces') json_str = json.dumps([{'label': force_text(label), diff --git a/tests/test_manager.py b/tests/test_manager.py index bc3cdca..1610bcf 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -1,8 +1,11 @@ +import logging +import mock import os import pytest from django.core.urlresolvers import reverse from django.contrib.auth.models import User +from django.test import override_settings from corbo.models import Broadcast @@ -209,7 +212,7 @@ def test_delete_announce(app, admin_user): assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/category/alerts/' -def test_send_announce(app, admin_user): +def test_email_announce(app, admin_user): app = login(app) resp = app.get('/manage/') assert 'New category' in resp.content @@ -233,6 +236,7 @@ def test_send_announce(app, admin_user): assert 'First announce' in resp.content resp = resp.click('First announce') assert 'Send test email' in resp.content + assert 'Send test SMS' not in resp.content resp = resp.click('Send test email') send_form = resp.forms[0] assert send_form.method == 'post' @@ -243,3 +247,98 @@ def test_send_announce(app, admin_user): resp = send_form.submit() assert resp.status_int == 302 assert resp.location == 'http://testserver/manage/announce/1/' + +@mock.patch('corbo.utils.requests.post') +def test_sms_announce(mocked_post, app, admin_user, settings): + app = login(app) + resp = app.get('/manage/') + assert 'New category' in resp.content + category_page = resp.click('New category') + category_form = category_page.forms[0] + category_form['name'] = 'Alerts' + resp = category_form.submit() + assert resp.status_int == 302 + assert resp.location.endswith(reverse('manage')) + resp = resp.follow() + resp = resp.click('Alerts') + + # create new announce + assert 'New announce' in resp.content + announce_page = resp.click('New announce') + announce_form = announce_page.forms[0] + announce_form['title'] = 'First announce' + announce_form['text'] = 'announce content' + resp = announce_form.submit() + assert resp.status_int == 302 + assert resp.location.endswith(reverse('view_category', kwargs={'slug': 'alerts'})) + resp = resp.follow() + + # view announce + assert 'First announce' in resp.content + settings.SMS_GATEWAY_URL = 'http:/passerelle.com' + resp = resp.click('First announce') + assert 'Send test SMS' in resp.content + + # open send sms form + resp = resp.click('Send test SMS') + send_form = resp.forms[0] + assert 'mobile' in send_form.fields + assert send_form.fields['mobile'][0].value == '' + # submit with no mobile + resp = send_form.submit() + assert resp.status_int == 200 + + form = resp.forms[0] + form['mobile'] = '0607080900' + # simulate response from passerelle + mocked_response = mock.Mock() + mocked_response.json.return_value = {'err': 0, 'data': True} + mocked_post.return_value = mocked_response + resp = form.submit() + assert resp.location.endswith(reverse('view_announce', kwargs={'pk': 1})) + resp = resp.follow() + # make sure the form informs about the success + assert 'SMS successfully sent' in resp.content + + resp = resp.click('Send test SMS') + form = resp.forms[0] + form['mobile'] = '0607080900' + # simulate error from passerelle + mocked_response.json.return_value = {'err': 1, 'data': None, 'err_desc': 'Destination error'} + resp = form.submit() + resp = resp.follow() + assert 'Error occured while sending SMS' in resp.content + +def test_sms_announce_with_invalid_gateway_url(app, admin_user, settings, caplog): + app = login(app) + resp = app.get('/manage/') + assert 'New category' in resp.content + category_page = resp.click('New category') + category_form = category_page.forms[0] + category_form['name'] = 'Alerts' + resp = category_form.submit() + resp = resp.follow() + resp = resp.click('Alerts') + assert 'New announce' in resp.content + announce_page = resp.click('New announce') + announce_form = announce_page.forms[0] + announce_form['title'] = 'First announce' + announce_form['text'] = 'announce content' + resp = announce_form.submit() + assert resp.status_int == 302 + assert resp.location == 'http://testserver/manage/category/alerts/' + resp = resp.follow() + assert 'First announce' in resp.content + settings.SMS_GATEWAY_URL='invalid_url' + resp = resp.click('First announce') + assert 'Send test SMS' in resp.content + resp = resp.click('Send test SMS') + form = resp.forms[0] + form['mobile'] = '0607080900' + resp = form.submit() + records = caplog.records + assert len(records) == 1 + for record in records: + assert record.name == 'corbo.utils' + assert record.levelno == logging.WARNING + assert 'Invalid URL' in record.getMessage() -- 2.15.1