From bd5f307c669652bbbcfd1540e09f333874833a32 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 9 May 2022 09:59:28 +0000 Subject: [PATCH] [FIX] phone_validation: fallback if no region provided Before this commit if you would call phone_parse() but not pass along a country code it would crash. This is reproducable by calling the phone_parse function and not setting a country on the contact. In this case you would get the following traceback: AttributeError: 'bool' object has no attribute 'upper'. This happens because the phonenumbers library tries to upper() the region but if Odoo doesn't have a country set it passes along False. By doing a fallback to 'None' the phonenumbers library will natively handle this and the user in the UI does not get a traceback. Task-2852953 closes odoo/odoo#112699 X-original-commit: 9b75d7ac1a912ff3d15c393a6a23018a18b3b9bb Signed-off-by: Thibault Delavallee (tde) Co-authored-by: Thibault Delavallee --- addons/phone_validation/tests/__init__.py | 1 + .../tests/test_phonenumbers.py | 23 +++++++++++++++++++ .../tools/phone_validation.py | 2 +- 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 addons/phone_validation/tests/test_phonenumbers.py diff --git a/addons/phone_validation/tests/__init__.py b/addons/phone_validation/tests/__init__.py index ce1b2168e3b..6ca0192f909 100644 --- a/addons/phone_validation/tests/__init__.py +++ b/addons/phone_validation/tests/__init__.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from . import test_phonenumbers from . import test_phonenumbers_patch diff --git a/addons/phone_validation/tests/test_phonenumbers.py b/addons/phone_validation/tests/test_phonenumbers.py new file mode 100644 index 00000000000..720291f099a --- /dev/null +++ b/addons/phone_validation/tests/test_phonenumbers.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo.addons.phone_validation.tools import phone_validation +from odoo.exceptions import UserError +from odoo.tests import tagged +from odoo.tests.common import BaseCase + + +@tagged('phone_validation') +class TestPhonenumbers(BaseCase): + + def test_country_code_falsy(self): + self.assertEqual( + phone_validation.phone_format('0456998877', 'BE', '32', force_format='E164'), + '+32456998877' + ) + # no country code -> UserError, no internal traceback + with self.assertRaises(UserError): + self.assertEqual( + phone_validation.phone_format('0456998877', None, '32', force_format='E164'), + '+32456998877' + ) diff --git a/addons/phone_validation/tools/phone_validation.py b/addons/phone_validation/tools/phone_validation.py index 813f0e4f513..e6744669557 100644 --- a/addons/phone_validation/tools/phone_validation.py +++ b/addons/phone_validation/tools/phone_validation.py @@ -15,7 +15,7 @@ try: def phone_parse(number, country_code): try: - phone_nbr = phonenumbers.parse(number, region=country_code, keep_raw_input=True) + phone_nbr = phonenumbers.parse(number, region=country_code or None, keep_raw_input=True) except phonenumbers.phonenumberutil.NumberParseException as e: raise UserError(_('Unable to parse %(phone)s: %(error)s', phone=number, error=str(e)))