96 lines
3.5 KiB
Python
96 lines
3.5 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo, Flectra. See LICENSE file for full copyright and licensing details.
|
|
import logging
|
|
|
|
|
|
from flectra import api, fields, models, _
|
|
from flectra.exceptions import UserError
|
|
from flectra.addons.iap.models import iap
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
try:
|
|
import phonenumbers
|
|
_sms_phonenumbers_lib_imported = True
|
|
|
|
except ImportError:
|
|
_sms_phonenumbers_lib_imported = False
|
|
_logger.info(
|
|
"The `phonenumbers` Python module is not available. "
|
|
"Phone number validation will be skipped. "
|
|
"Try `pip3 install phonenumbers` to install it."
|
|
)
|
|
|
|
|
|
class SendSMS(models.TransientModel):
|
|
_name = 'sms.send_sms'
|
|
|
|
recipients = fields.Char('Recipients', required=True)
|
|
message = fields.Text('Message', required=True)
|
|
|
|
def _phone_get_country(self, partner):
|
|
if 'country_id' in partner:
|
|
return partner.country_id
|
|
return self.env.user.company_id.country_id
|
|
|
|
def _sms_sanitization(self, partner, field_name):
|
|
number = partner[field_name]
|
|
if number and _sms_phonenumbers_lib_imported:
|
|
country = self._phone_get_country(partner)
|
|
country_code = country.code if country else None
|
|
try:
|
|
phone_nbr = phonenumbers.parse(number, region=country_code, keep_raw_input=True)
|
|
except phonenumbers.phonenumberutil.NumberParseException:
|
|
return number
|
|
if not phonenumbers.is_possible_number(phone_nbr) or not phonenumbers.is_valid_number(phone_nbr):
|
|
return number
|
|
phone_fmt = phonenumbers.PhoneNumberFormat.INTERNATIONAL
|
|
return phonenumbers.format_number(phone_nbr, phone_fmt).replace(' ', '')
|
|
else:
|
|
return number
|
|
|
|
def _get_records(self, model):
|
|
if self.env.context.get('active_domain'):
|
|
records = model.search(self.env.context.get('active_domain'))
|
|
elif self.env.context.get('active_ids'):
|
|
records = model.browse(self.env.context.get('active_ids', []))
|
|
else:
|
|
records = model.browse(self.env.context.get('active_id', []))
|
|
return records
|
|
|
|
@api.model
|
|
def default_get(self, fields):
|
|
result = super(SendSMS, self).default_get(fields)
|
|
|
|
active_model = self.env.context.get('active_model')
|
|
model = self.env[active_model]
|
|
|
|
records = self._get_records(model)
|
|
if getattr(records, '_get_default_sms_recipients'):
|
|
partners = records._get_default_sms_recipients()
|
|
phone_numbers = []
|
|
no_phone_partners = []
|
|
for partner in partners:
|
|
number = self._sms_sanitization(partner, self.env.context.get('field_name') or 'mobile')
|
|
if number:
|
|
phone_numbers.append(number)
|
|
else:
|
|
no_phone_partners.append(partner.name)
|
|
if len(partners) > 1:
|
|
if no_phone_partners:
|
|
raise UserError(_('Missing mobile number for %s.') % ', '.join(no_phone_partners))
|
|
result['recipients'] = ', '.join(phone_numbers)
|
|
return result
|
|
|
|
def action_send_sms(self):
|
|
numbers = self.recipients.split(',')
|
|
|
|
active_model = self.env.context.get('active_model')
|
|
model = self.env[active_model]
|
|
records = self._get_records(model)
|
|
if getattr(records, 'message_post_send_sms'):
|
|
records.message_post_send_sms(self.message, numbers=numbers)
|
|
else:
|
|
self.env['sms.api']._send_sms(numbers, self.message)
|
|
return True
|