sms: add a button to test sending sms (#45333)

This commit is contained in:
Nicolas Roche 2020-09-16 16:23:49 +02:00
parent 6ff2dc4365
commit 257334fdc5
7 changed files with 113 additions and 0 deletions

7
passerelle/sms/forms.py Normal file
View File

@ -0,0 +1,7 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
class SmsTestSendForm(forms.Form):
number = forms.CharField(label=_('To'), max_length=12)
sender = forms.CharField(label=_('From'), max_length=12)
message = forms.CharField(label=_('Message'), max_length=128)

View File

@ -18,6 +18,7 @@ import re
from django.db import models
from django.utils import six
from django.utils.module_loading import import_string
from django.utils.translation import ugettext_lazy as _
from passerelle.base.models import BaseResource
@ -65,6 +66,10 @@ class SMSResource(BaseResource):
manager_view_template_name = 'passerelle/manage/messages_service_view.html'
@classmethod
def get_management_urls(cls):
return import_string('passerelle.sms.urls.management_urlpatterns')
def clean_numbers(self, destinations):
numbers = []
for dest in destinations:

View File

@ -0,0 +1,18 @@
{% extends "passerelle/base.html" %}
{% load i18n %}
{% block appbar %}
<h2>{% trans "Sending a test SMS" %}</h2>
{% endblock %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<div class="buttons">
<button>{% trans "Send SMS" %}</button>
<a class="cancel" href="{% url 'manage-home' %}">{% trans 'Cancel' %}</a>
</div>
</form>
{% endblock %}

View File

@ -3,4 +3,11 @@
{% block endpoints %}
{{ block.super }}
{% if perms.base.view_accessright %}
<div>
<a rel="popup" href="/manage{{ object.get_absolute_url }}test-send/">
{% trans 'Send a test message' %}
</a>
</div>
{% endif %}
{% endblock %}

8
passerelle/sms/urls.py Normal file
View File

@ -0,0 +1,8 @@
from django.conf.urls import url
from . import views
management_urlpatterns = [
url(r'^(?P<slug>[\w,-]+)/test-send/$',
views.SmsTestSendView.as_view(), name='sms-test-send'),
]

38
passerelle/sms/views.py Normal file
View File

@ -0,0 +1,38 @@
from django.apps import apps
from django.contrib import messages
from django.utils.translation import ugettext_lazy as _
from django.views.generic import FormView
from passerelle.utils.jsonresponse import APIError
from passerelle.views import GenericConnectorMixin
from .forms import SmsTestSendForm
class SmsTestSendView(GenericConnectorMixin, FormView):
template_name = 'passerelle/manage/messages_service_test_send.html'
def get_form_class(self):
return SmsTestSendForm
def get_object(self):
return self.model.objects.get(slug=self.kwargs['slug'])
def get_success_url(self):
connector = self.get_object()
return connector.get_absolute_url()
def form_valid(self, form):
number = form.cleaned_data['number']
sender = form.cleaned_data['sender']
message = form.cleaned_data['message']
connector = self.get_object()
try:
number = connector.clean_numbers([number])[0]
connector.send_msg(
text=message, sender=sender, destinations=[number], stop=False)
except APIError as exc:
messages.error(self.request, _('Sending SMS fails: %s' % exc))
else:
messages.success(self.request, _('An SMS was just sent'))
return super(SmsTestSendView, self).form_valid(form)

View File

@ -4,6 +4,7 @@ import pytest
from requests import RequestException
from django.contrib.contenttypes.models import ContentType
from django.core.urlresolvers import reverse
from passerelle.apps.ovh.models import OVHSMSGateway
from passerelle.base.models import ApiUser, AccessRight, Job
@ -225,3 +226,32 @@ def test_ovh_new_api(app, freezer):
request = mocked.handlers[0].call['requests'][0]
assert 'X-Ovh-Signature' in request.headers
@pytest.mark.parametrize('connector', [OVHSMSGateway], indirect=True)
def test_sms_test_send(admin_user, app, connector):
url = '/%s/%s/' % (connector.get_connector_slug(), connector.slug)
resp = app.get(url)
link = resp.html.find('div', {'id': 'endpoints'}).find_all('a')[-1]
assert 'Send a test message' not in link.text
app = login(app)
resp = app.get(url)
link = resp.html.find('div', {'id': 'endpoints'}).find_all('a')[-1]
assert 'Send a test message' in link.text
assert link['href'] == reverse('sms-test-send', kwargs={
'connector': connector.get_connector_slug(), 'slug': connector.slug})
resp = app.get(link['href'])
resp.form['number'] = '+33688888888'
resp.form['sender'] = '+33699999999'
resp.form['message'] = 'hello'
with mock.patch.object(OVHSMSGateway, 'send_msg') as send_function:
send_function.return_value = {}
resp = resp.form.submit()
assert send_function.call_args[1] == {
'text': 'hello', 'sender': '+33699999999', 'destinations': ['0033688888888'],
'stop': False,
}
assert resp.status_code == 302
assert resp.location == url