diff --git a/gracedb/alerts/fields.py b/gracedb/alerts/fields.py index 4fd85a1175672ac5c6d5e01c19c8a856b67984dd..57cac85ed51bbaad084439fc9802b5dc1e1a8c83 100644 --- a/gracedb/alerts/fields.py +++ b/gracedb/alerts/fields.py @@ -1,7 +1,34 @@ +import phonenumbers + from django.db import models from .validators import validate_phone +PHONE_NUMBER_FORMATS = ['E164', 'NATIONAL', 'INTERNATIONAL', 'RFC3966'] + + class PhoneNumberField(models.CharField): validators = [validate_phone] + + def __init__(self, *args, **kwargs): + # Get format and check values + self.format = kwargs.pop('format', 'E164') + if self.format not in PHONE_NUMBER_FORMATS: + raise ValueError('Phone number format must be one of {fmt}'.format( + fmt=", ".join(PHONE_NUMBER_FORMATS))) + + # super __init__ + super(PhoneNumberField, self).__init__(*args, **kwargs) + + def get_prep_value(self, value): + value = super(PhoneNumberField, self).get_prep_value(value) + + # Handle blank values + if value is None or value == '': + return value + + # Return phone number as a formatted string + phone = phonenumbers.parse(value, 'US') + return phonenumbers.format_number(phone, + getattr(phonenumbers.PhoneNumberFormat, self.format)) diff --git a/gracedb/alerts/validators.py b/gracedb/alerts/validators.py index 267c1ca2dbdaa9b07a22655566614bcb2e89ae08..8c877d0dcf89b37faad592563bccbcb77877c64f 100644 --- a/gracedb/alerts/validators.py +++ b/gracedb/alerts/validators.py @@ -13,7 +13,3 @@ def validate_phone(value): # Validate phone number if not phonenumbers.is_valid_number(phone): raise ValidationError('Not a valid phone number: {0}'.format(value)) - - # Return phone number as a formatted string - return phonenumbers.format_number(phone, - phonenumbers.PhoneNumberFormat.E164)