Using phonenumbers library this module adds tools methods as well as a small mixin for models that want to activate phone number validation and formatting. Formatting can be done always using an international format or having both national and international format. This is configured on the company. Note that phonenumbers library is optional. Installing this module without having the lib installed just skip its use but should not crash.
60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import _
|
|
from odoo.exceptions import UserError
|
|
|
|
import logging
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
_phonenumbers_lib_warning = False
|
|
|
|
|
|
try:
|
|
import phonenumbers
|
|
|
|
def phone_parse(number, country_code):
|
|
try:
|
|
phone_nbr = phonenumbers.parse(number, region=country_code, keep_raw_input=True)
|
|
except phonenumbers.phonenumberutil.NumberParseException as e:
|
|
raise UserError(_('Unable to parse %s:\n%s') % (number, e))
|
|
|
|
if not phonenumbers.is_possible_number(phone_nbr):
|
|
raise UserError(_('Impossible number %s: probably invalid number of digits') % number)
|
|
if not phonenumbers.is_valid_number(phone_nbr):
|
|
raise UserError(_('Invalid number %s: probably incorrect prefix') % number)
|
|
|
|
return phone_nbr
|
|
|
|
def phone_format(number, country_code, always_international=True, raise_exception=True):
|
|
try:
|
|
phone_nbr = phone_parse(number, country_code)
|
|
except (phonenumbers.phonenumberutil.NumberParseException, UserError) as e:
|
|
if raise_exception:
|
|
raise
|
|
else:
|
|
_logger.warning(_('Unable to format %s:\n%s') % number, e)
|
|
return number
|
|
|
|
if always_international and phone_nbr.country_code != country_code:
|
|
phone_fmt = phonenumbers.PhoneNumberFormat.INTERNATIONAL
|
|
else:
|
|
phone_fmt = phonenumbers.PhoneNumberFormat.NATIONAL
|
|
|
|
return phonenumbers.format_number(phone_nbr, phone_fmt)
|
|
|
|
except ImportError:
|
|
|
|
def phone_parse(number, country_code):
|
|
return False
|
|
|
|
def phone_format(number, country_code, always_international=True, raise_exception=True):
|
|
global _phonenumbers_lib_warning
|
|
if not _phonenumbers_lib_warning:
|
|
_logger.warning(
|
|
"The `phonenumbers` Python module is not installed, contact numbers will not be "
|
|
"verified. Try: pip install phonenumbers."
|
|
)
|
|
_phonenumbers_lib_warning = True
|
|
return number
|