diff --git a/addons/sms/wizard/send_sms.py b/addons/sms/wizard/send_sms.py index 1856b2f17dd..a637b43133b 100644 --- a/addons/sms/wizard/send_sms.py +++ b/addons/sms/wizard/send_sms.py @@ -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: