From d0342e36ab800d8fc8754a5c6d1f39e329db3e06 Mon Sep 17 00:00:00 2001 From: Tanner Prestegard <tanner.prestegard@ligo.org> Date: Wed, 6 Mar 2019 09:28:50 -0600 Subject: [PATCH] Enhancements and bugfix for PhoneNumberField --- gracedb/alerts/fields.py | 27 +++++++++++++++++++++++++++ gracedb/alerts/validators.py | 4 ---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/gracedb/alerts/fields.py b/gracedb/alerts/fields.py index 4fd85a117..57cac85ed 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 267c1ca2d..8c877d0dc 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) -- GitLab