manager: add test sms send (#20174)

This commit is contained in:
Serghei Mihai 2017-12-04 17:30:06 +01:00
parent d0bd7a5a38
commit 8e8b10aeb5
7 changed files with 166 additions and 13 deletions

View File

@ -81,3 +81,7 @@ class SubscriptionsImportForm(forms.Form):
class SendTestEmailForm(forms.Form): class SendTestEmailForm(forms.Form):
email = forms.EmailField() email = forms.EmailField()
class SendTestSMSForm(forms.Form):
mobile = forms.CharField(label=_('Mobile number'))

View File

@ -2,7 +2,8 @@ from django.conf.urls import patterns, include, url
from .views import add_announce, edit_announce, delete_announce, \ from .views import add_announce, edit_announce, delete_announce, \
add_category, edit_category, view_category, delete_category, manage, \ 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('', urlpatterns = patterns('',
url(r'^$', manage, name='manage'), url(r'^$', manage, name='manage'),
@ -14,6 +15,8 @@ urlpatterns = patterns('',
name='delete_announce'), name='delete_announce'),
url(r'^announce/email/(?P<pk>\d+)/$', email_announce, url(r'^announce/email/(?P<pk>\d+)/$', email_announce,
name='email_announce'), name='email_announce'),
url(r'^announce/sms/(?P<pk>\d+)/$', sms_announce,
name='sms_announce'),
url(r'^category/(?P<slug>[\w-]+)/$', view_category, url(r'^category/(?P<slug>[\w-]+)/$', view_category,
name='view_category'), name='view_category'),
url(r'^announce/(?P<pk>\d+)/$', view_announce, url(r'^announce/(?P<pk>\d+)/$', view_announce,

View File

@ -12,6 +12,9 @@
<a href="{% url 'delete_announce' pk=object.pk %}" rel="popup">{% trans 'Delete' %}</a> <a href="{% url 'delete_announce' pk=object.pk %}" rel="popup">{% trans 'Delete' %}</a>
<a href="{% url 'edit_announce' pk=object.pk %}">{% trans 'Edit' %}</a> <a href="{% url 'edit_announce' pk=object.pk %}">{% trans 'Edit' %}</a>
<a href="{% url 'email_announce' pk=object.pk %}" rel="popup">{% trans 'Send test email' %}</a> <a href="{% url 'email_announce' pk=object.pk %}" rel="popup">{% trans 'Send test email' %}</a>
{% if sms_enabled %}
<a href="{% url 'sms_announce' pk=object.pk %}" rel="popup">{% trans 'Send test SMS' %}</a>
{% endif %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="announce_block"> <div class="announce_block">

View File

@ -0,0 +1,22 @@
{% extends "corbo/manage.html" %}
{% load i18n static %}
{% block breadcrumb %}
{{ block.super }}
<a href="{% url "view_announce" pk=object.pk %}">{{ object.title }}</a>
{% endblock %}
{% block appbar %}
<h2>{% trans "Send test SMS" %}</h2>
{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<div class="buttons">
<button class="submit-button">{% trans "Send" %}</button>
<a href="{% url "view_announce" pk=object.pk %}" class="cancel">{% trans "Cancel" %}</a>
</div>
</form>
{% endblock %}

View File

@ -20,7 +20,7 @@ from django.utils.translation import ngettext
import models import models
from .forms import AnnounceForm, CategoryForm, SubscriptionsImportForm, \ from .forms import AnnounceForm, CategoryForm, SubscriptionsImportForm, \
SendTestEmailForm SendTestEmailForm, SendTestSMSForm
from . import utils from . import utils
try: try:
@ -264,21 +264,30 @@ class AnnounceView(DetailView):
context = super(AnnounceView, self).get_context_data(**kwargs) context = super(AnnounceView, self).get_context_data(**kwargs)
context['category'] = self.object.category context['category'] = self.object.category
context['broadcasts'] = self.object.broadcast_set.filter(deliver_time__isnull=False) context['broadcasts'] = self.object.broadcast_set.filter(deliver_time__isnull=False)
context['sms_enabled'] = settings.SMS_GATEWAY_URL
return context return context
view_announce = AnnounceView.as_view() view_announce = AnnounceView.as_view()
class EmailAnnounceView(FormView): class SendAnnounceView(FormView):
form_class = SendTestEmailForm
template_name = 'corbo/test_email_send_form.html'
def get_initial(self): 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): def get_success_url(self, *args, **kwargs):
return reverse('view_announce', kwargs={'pk': self.kwargs['pk']}) 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): def form_valid(self, form):
email = form.cleaned_data['email'] email = form.cleaned_data['email']
announce = models.Announce.objects.get(pk=self.kwargs['pk']) announce = models.Announce.objects.get(pk=self.kwargs['pk'])
@ -286,13 +295,26 @@ class EmailAnnounceView(FormView):
messages.info(self.request, _('Email successfully sent')) messages.info(self.request, _('Email successfully sent'))
return super(EmailAnnounceView, self).form_valid(form) 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() 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): def menu_json(request):
label = _('Announces') label = _('Announces')
json_str = json.dumps([{'label': force_text(label), json_str = json.dumps([{'label': force_text(label),

View File

@ -1,8 +1,11 @@
import logging
import mock
import os import os
import pytest import pytest
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.test import override_settings
from corbo.models import Broadcast from corbo.models import Broadcast
@ -209,7 +212,7 @@ def test_delete_announce(app, admin_user):
assert resp.status_int == 302 assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/category/alerts/' 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) app = login(app)
resp = app.get('/manage/') resp = app.get('/manage/')
assert 'New category' in resp.content assert 'New category' in resp.content
@ -233,6 +236,7 @@ def test_send_announce(app, admin_user):
assert 'First announce' in resp.content assert 'First announce' in resp.content
resp = resp.click('First announce') resp = resp.click('First announce')
assert 'Send test email' in resp.content assert 'Send test email' in resp.content
assert 'Send test SMS' not in resp.content
resp = resp.click('Send test email') resp = resp.click('Send test email')
send_form = resp.forms[0] send_form = resp.forms[0]
assert send_form.method == 'post' assert send_form.method == 'post'
@ -243,3 +247,98 @@ def test_send_announce(app, admin_user):
resp = send_form.submit() resp = send_form.submit()
assert resp.status_int == 302 assert resp.status_int == 302
assert resp.location == 'http://testserver/manage/announce/1/' 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()