# -*- 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 = '%s' % ( 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."), }