[FIX] sms: use correct format for sending sms
To send a sms, the number must be in international format. If phone_validation is installed and phone_international_format is set to no_prefix, the number is not in international format.
This commit is contained in:
committed by
Rémi Rahir
parent
637bfc2862
commit
bd760f0746
@@ -9,6 +9,16 @@ from odoo.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.warning(
|
||||
"The `phonenumbers` Python module is not installed. Try: pip install phonenumbers."
|
||||
)
|
||||
|
||||
|
||||
class SendSMS(models.TransientModel):
|
||||
_name = 'sms.send_sms'
|
||||
@@ -16,6 +26,27 @@ class SendSMS(models.TransientModel):
|
||||
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 _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'))
|
||||
@@ -38,7 +69,8 @@ class SendSMS(models.TransientModel):
|
||||
phone_numbers = []
|
||||
no_phone_partners = []
|
||||
for partner in partners:
|
||||
number = partner.mobile
|
||||
default_field_name = 'mobile' if partner.mobile else 'phone'
|
||||
number = self._sms_sanitization(partner, self.env.context('field_name') or default_field_name)
|
||||
if number:
|
||||
phone_numbers.append(number)
|
||||
else:
|
||||
|
||||
Reference in New Issue
Block a user