80 lines
3.0 KiB
Python
80 lines
3.0 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, api, exceptions, models
|
|
from odoo.addons.iap.tools import iap_tools
|
|
|
|
DEFAULT_ENDPOINT = 'https://iap-sms.odoo.com'
|
|
|
|
|
|
class SmsApi(models.AbstractModel):
|
|
_name = 'sms.api'
|
|
_description = 'SMS API'
|
|
|
|
@api.model
|
|
def _contact_iap(self, local_endpoint, params):
|
|
if not self.env.registry.ready: # Don't reach IAP servers during module installation
|
|
raise exceptions.AccessError("Unavailable during module installation.")
|
|
|
|
account = self.env['iap.account'].get('sms')
|
|
params['account_token'] = account.account_token
|
|
endpoint = self.env['ir.config_parameter'].sudo().get_param('sms.endpoint', DEFAULT_ENDPOINT)
|
|
# TODO PRO, the default timeout is 15, do we have to increase it ?
|
|
return iap_tools.iap_jsonrpc(endpoint + local_endpoint, params=params)
|
|
|
|
@api.model
|
|
def _send_sms(self, numbers, message):
|
|
""" Send a single message to several numbers
|
|
|
|
:param numbers: list of E164 formatted phone numbers
|
|
:param message: content to send
|
|
|
|
:raises ? TDE FIXME
|
|
"""
|
|
params = {
|
|
'numbers': numbers,
|
|
'message': message,
|
|
}
|
|
return self._contact_iap('/iap/message_send', params)
|
|
|
|
@api.model
|
|
def _send_sms_batch(self, messages):
|
|
""" Send SMS using IAP in batch mode
|
|
|
|
:param messages: list of SMS to send, structured as dict [{
|
|
'res_id': integer: ID of sms.sms,
|
|
'number': string: E164 formatted phone number,
|
|
'content': string: content to send
|
|
}]
|
|
|
|
:return: return of /iap/sms/1/send controller which is a list of dict [{
|
|
'res_id': integer: ID of sms.sms,
|
|
'state': string: 'insufficient_credit' or 'wrong_number_format' or 'success',
|
|
'credit': integer: number of credits spent to send this SMS,
|
|
}]
|
|
|
|
:raises: normally none
|
|
"""
|
|
params = {
|
|
'messages': messages
|
|
}
|
|
return self._contact_iap('/iap/sms/2/send', params)
|
|
|
|
@api.model
|
|
def _get_sms_api_error_messages(self):
|
|
""" Returns a dict containing the error message to display for every known error 'state'
|
|
resulting from the '_send_sms_batch' method.
|
|
We prefer a dict instead of a message-per-error-state based method so we only call
|
|
the 'get_credits_url' once, to avoid extra RPC calls. """
|
|
|
|
buy_credits_url = self.sudo().env['iap.account'].get_credits_url(service_name='sms')
|
|
buy_credits = '<a href="%s" target="_blank">%s</a>' % (
|
|
buy_credits_url,
|
|
_('Buy credits.')
|
|
)
|
|
return {
|
|
'unregistered': _("You don't have an eligible IAP account."),
|
|
'insufficient_credit': ' '.join([_('You don\'t have enough credits on your IAP account.'), buy_credits]),
|
|
'wrong_number_format': _("The number you're trying to reach is not correctly formatted."),
|
|
}
|