111 lines
4.1 KiB
Python
111 lines
4.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
import json
|
|
import requests
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from django.db import models
|
|
|
|
from passerelle.utils.jsonresponse import APIError
|
|
from passerelle.base.models import BaseResource
|
|
from passerelle.sms import SMSGatewayMixin
|
|
|
|
|
|
class ChoositSMSGateway(BaseResource, SMSGatewayMixin):
|
|
key = models.CharField(verbose_name=_('Key'), max_length=64)
|
|
default_country_code = models.CharField(verbose_name=_('Default country code'), max_length=3,
|
|
default=u'33')
|
|
default_trunk_prefix = models.CharField(verbose_name=_('Default trunk prefix'), max_length=2,
|
|
default=u'0')
|
|
# FIXME: add regexp field, to check destination and from format
|
|
|
|
TEST_DEFAULTS = {
|
|
'create_kwargs': {
|
|
'key': '1234',
|
|
},
|
|
'test_vectors': [
|
|
{
|
|
'response': '',
|
|
'result': {
|
|
'err': 1,
|
|
'err_desc': 'Choosit error: some destinations failed',
|
|
'data': [
|
|
[u'0033688888888', u'Choosit error: bad JSON response'],
|
|
[u'0033677777777', u'Choosit error: bad JSON response'],
|
|
]
|
|
}
|
|
},
|
|
{
|
|
'response': {
|
|
'error': 'not ok',
|
|
},
|
|
'result': {
|
|
'err': 1,
|
|
'err_desc': 'Choosit error: some destinations failed',
|
|
'data': [
|
|
[u'0033688888888', u'Choosit error: not ok'],
|
|
[u'0033677777777', u'Choosit error: not ok'],
|
|
],
|
|
}
|
|
},
|
|
{
|
|
'response': {
|
|
'result': u'Envoi terminé',
|
|
'sms_id': 1234,
|
|
},
|
|
'result': {
|
|
'err': 0,
|
|
'data': [
|
|
[u'0033688888888', {'result': u'Envoi terminé', 'sms_id': 1234}],
|
|
[u'0033677777777', {'result': u'Envoi terminé', 'sms_id': 1234}],
|
|
],
|
|
}
|
|
}
|
|
|
|
],
|
|
}
|
|
URL = 'http://sms.choosit.com/webservice'
|
|
|
|
class Meta:
|
|
verbose_name = 'Choosit'
|
|
db_table = 'sms_choosit'
|
|
|
|
@classmethod
|
|
def get_verbose_name(cls):
|
|
return cls._meta.verbose_name
|
|
|
|
def send_msg(self, text, sender, destinations, **kwargs):
|
|
"""Send a SMS using the Choosit provider"""
|
|
# from http://sms.choosit.com/documentation_technique.html
|
|
# unfortunately it lacks a batch API...
|
|
destinations = self.clean_numbers(destinations,
|
|
self.default_country_code,
|
|
self.default_trunk_prefix)
|
|
results = []
|
|
for dest in destinations:
|
|
params = {
|
|
'key': self.key,
|
|
'recipient': dest,
|
|
'content': text[:160],
|
|
}
|
|
data = {'data': json.dumps(params)}
|
|
try:
|
|
r = self.requests.post(self.URL, data=data)
|
|
except requests.RequestException as e:
|
|
results.append('Choosit error: %s' % e)
|
|
else:
|
|
try:
|
|
output = r.json()
|
|
except ValueError as e:
|
|
results.append('Choosit error: bad JSON response')
|
|
else:
|
|
if not isinstance(output, dict):
|
|
results.append('Choosit error: JSON response is not a dict %r' % output)
|
|
elif 'error' in output:
|
|
results.append(u'Choosit error: %s' % output['error'])
|
|
else:
|
|
results.append(output)
|
|
if any(isinstance(result, basestring) for result in results):
|
|
raise APIError('Choosit error: some destinations failed',
|
|
data=list(zip(destinations, results)))
|
|
return list(zip(destinations, results))
|