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