diff --git a/fusionbox/forms/fields.py b/fusionbox/forms/fields.py index 19b1ee9..f18ef20 100644 --- a/fusionbox/forms/fields.py +++ b/fusionbox/forms/fields.py @@ -9,6 +9,8 @@ import datetime from functools import partial +import phonenumbers + from django import forms from django.contrib.auth.forms import ReadOnlyPasswordHashWidget from django.utils.safestring import mark_safe @@ -143,3 +145,31 @@ def render(self, name, value, attrs): ) return mark_safe(hidden) + + +class PhoneNumberField(forms.CharField): + """ + A USA or international phone number field. Normalizes its value to a common + US format '(303) 555-5555' for US phone numbers, and an international + format for others - '+86 10 6944 5464'. Also supports extensions -- + '3035555555ex12' -> '(303) 555-5555 ext. 12.' + """ + + default_error_messages = { + 'invalid': 'Enter a valid phone number.', + } + + def clean(self, value): + if not value: + return value + try: + number = phonenumbers.parse(value, 'US') + except phonenumbers.NumberParseException: + raise forms.ValidationError(self.error_messages['invalid']) + if not phonenumbers.is_valid_number(number): + raise forms.ValidationError(self.error_messages['invalid']) + + if number.country_code == 1: + return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.NATIONAL) + else: + return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.INTERNATIONAL) diff --git a/setup.py b/setup.py index 8ca59bf..5da888f 100644 --- a/setup.py +++ b/setup.py @@ -1,6 +1,4 @@ #!/usr/bin/env python -import os -import re from setuptools import setup, find_packages __doc__=""" @@ -31,7 +29,7 @@ 'Environment :: Web Environment', 'Framework :: Django', ], - install_requires = ['BeautifulSoup', 'PyYAML', 'markdown'], - requires = ['BeautifulSoup', 'PyYAML', 'markdown'], + install_requires = ['BeautifulSoup', 'PyYAML', 'markdown', 'phonenumbers'], + requires = ['BeautifulSoup', 'PyYAML', 'markdown', 'phonenumbers'], )