This commit adds user feedback in the form of a message logged on the related document (mailing.mailing) when testing a mailing/sms. Before this change, when sending an email to your own mailbox for testing purpose, or when sending an SMS to your phone, you did not get any interface feedback on whether it worked or not. Now, a logged message will show if it's successful and if not, explain why it failed with a short error message (no IAP credits / misconfigured outgoing mail server / ...). In addition, email and phone inputs are now split on the '\n' character instead of a coma, which allows easier validation of the email addresses. Task-2375526 closes odoo/odoo#63421 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
77 lines
2.8 KiB
Python
77 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _, api, 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):
|
|
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."),
|
|
}
|