From 4f954bae20781d6503211e2b42fcab7aef09d09e Mon Sep 17 00:00:00 2001 From: Vladimir Nani Date: Sun, 6 Nov 2016 11:56:50 +0100 Subject: [PATCH] Deprecating Phone Fields --- README.rst | 1 + docs/changelog.rst | 4 ++ docs/index.rst | 17 ++++++ localflavor/au/forms.py | 4 +- localflavor/au/models.py | 3 +- localflavor/be/forms.py | 4 +- localflavor/br/forms.py | 4 +- localflavor/ca/forms.py | 3 +- localflavor/ch/forms.py | 4 +- localflavor/cn/forms.py | 6 +- localflavor/dk/forms.py | 4 +- localflavor/es/forms.py | 4 +- localflavor/fr/forms.py | 3 +- localflavor/generic/deprecation.py | 2 + localflavor/generic/forms.py | 16 ++++++ localflavor/generic/models.py | 8 +++ localflavor/gr/forms.py | 6 +- localflavor/hk/forms.py | 4 +- localflavor/hr/forms.py | 3 +- localflavor/id_/forms.py | 4 +- localflavor/il/forms.py | 3 +- localflavor/in_/forms.py | 4 +- localflavor/is_/forms.py | 4 +- localflavor/it/forms.py | 4 +- localflavor/nl/forms.py | 4 +- localflavor/nl/models.py | 6 +- localflavor/no/forms.py | 4 +- localflavor/nz/forms.py | 4 +- localflavor/pk/forms.py | 4 +- localflavor/pk/models.py | 3 +- localflavor/pt/forms.py | 4 +- localflavor/ro/forms.py | 4 +- localflavor/sg/forms.py | 4 +- localflavor/si/forms.py | 4 +- localflavor/tr/forms.py | 4 +- localflavor/us/forms.py | 4 +- localflavor/us/models.py | 3 +- tests/settings.py | 1 + tests/test_deprecated/__init__.py | 0 tests/test_deprecated/tests.py | 88 ++++++++++++++++++++++++++++++ 40 files changed, 226 insertions(+), 34 deletions(-) create mode 100644 localflavor/generic/deprecation.py create mode 100644 tests/test_deprecated/__init__.py create mode 100644 tests/test_deprecated/tests.py diff --git a/README.rst b/README.rst index a632b6e58..736e42265 100644 --- a/README.rst +++ b/README.rst @@ -40,3 +40,4 @@ support for an unsupported version of Django. **2014-12-10 - 1.1**: Django 1.5 - 1.7 **2013-07-29 - 1.0**: Django 1.5 - 1.6 + diff --git a/docs/changelog.rst b/docs/changelog.rst index d65be8765..aa6bb90c1 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -40,6 +40,10 @@ Other changes: (`gh-257 `_). Users will need to generate migrations for any model fields they use with 'makemigrations'. +- Deprecated Phone Number fields + (`gh-262 `_) + + 1.3 (2016-05-06) ------------------ diff --git a/docs/index.rst b/docs/index.rst index 631785def..b96d9acc0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -196,6 +196,23 @@ Version numbers follow the appropriate Python standards, e.g. PEPs 386_ and 440_ .. _440: http://www.python.org/dev/peps/pep-0440/ .. _`Django's release process`: https://docs.djangoproject.com/en/dev/internals/release-process/ +Roadmap +------- + +django-localflavor releases follow `semver`_. +Within one month of django release we would release a new verision. +We might have an extra release if there are enough features in between django releases. + +=========== =========== =============== + Version Django Date +=========== =========== =============== +1.4 1.10 December 2016 +1.x ... ... +2.0 2.0 January 2018 +=========== =========== =============== + +.. _semver: http://semver.org/ + How to migrate ============== diff --git a/localflavor/au/forms.py b/localflavor/au/forms.py index 0029bb420..43438b6cf 100644 --- a/localflavor/au/forms.py +++ b/localflavor/au/forms.py @@ -10,6 +10,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .au_states import STATE_CHOICES from .validators import AUBusinessNumberFieldValidator, AUTaxFileNumberFieldValidator @@ -33,7 +35,7 @@ def __init__(self, max_length=4, min_length=None, *args, **kwargs): max_length, min_length, *args, **kwargs) -class AUPhoneNumberField(CharField): +class AUPhoneNumberField(CharField, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates input as an Australian phone number. diff --git a/localflavor/au/models.py b/localflavor/au/models.py index d78400663..8ee8842c8 100644 --- a/localflavor/au/models.py +++ b/localflavor/au/models.py @@ -1,6 +1,7 @@ from django.db.models import CharField from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.models import DeprecatedPhoneNumberField from . import forms from .au_states import STATE_CHOICES from .validators import AUBusinessNumberFieldValidator, AUTaxFileNumberFieldValidator @@ -45,7 +46,7 @@ def formfield(self, **kwargs): return super(AUPostCodeField, self).formfield(**defaults) -class AUPhoneNumberField(CharField): +class AUPhoneNumberField(CharField, DeprecatedPhoneNumberField): """A model field that checks that the value is a valid Australian phone number (ten digits).""" description = _("Australian Phone number") diff --git a/localflavor/be/forms.py b/localflavor/be/forms.py index 59acf35d7..458ab4cc3 100644 --- a/localflavor/be/forms.py +++ b/localflavor/be/forms.py @@ -3,6 +3,8 @@ from django.forms.fields import RegexField, Select from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .be_provinces import PROVINCE_CHOICES from .be_regions import REGION_CHOICES @@ -28,7 +30,7 @@ def __init__(self, max_length=None, min_length=None, *args, **kwargs): max_length, min_length, *args, **kwargs) -class BEPhoneNumberField(RegexField): +class BEPhoneNumberField(RegexField, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates its input as a belgium phone number. diff --git a/localflavor/br/forms.py b/localflavor/br/forms.py index a398e6611..25ac7d74f 100644 --- a/localflavor/br/forms.py +++ b/localflavor/br/forms.py @@ -11,6 +11,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .br_states import STATE_CHOICES phone_digits_re = re.compile(r'^(\d{2})[-\.]?(\d{4,5})[-\.]?(\d{4})$') @@ -35,7 +37,7 @@ def __init__(self, max_length=None, min_length=None, *args, **kwargs): max_length, min_length, *args, **kwargs) -class BRPhoneNumberField(Field): +class BRPhoneNumberField(Field, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates input as a Brazilian phone number. diff --git a/localflavor/ca/forms.py b/localflavor/ca/forms.py index 0311ca3d8..3abecb846 100644 --- a/localflavor/ca/forms.py +++ b/localflavor/ca/forms.py @@ -11,6 +11,7 @@ from django.utils.translation import ugettext_lazy as _ from localflavor.generic.checksums import luhn +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin phone_digits_re = re.compile(r'^(?:1-?)?(\d{3})[-\.]?(\d{3})[-\.]?(\d{4})$') sin_re = re.compile(r"^(\d{3})-(\d{3})-(\d{3})$") @@ -44,7 +45,7 @@ def clean(self, value): return "%s %s" % (m.group(1), m.group(2)) -class CAPhoneNumberField(Field): +class CAPhoneNumberField(Field, DeprecatedPhoneNumberFormFieldMixin): """Canadian phone number form field.""" default_error_messages = { diff --git a/localflavor/ch/forms.py b/localflavor/ch/forms.py index 75ac519a0..2e39d4c9e 100644 --- a/localflavor/ch/forms.py +++ b/localflavor/ch/forms.py @@ -10,6 +10,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from ..generic import validators from .ch_states import STATE_CHOICES @@ -38,7 +40,7 @@ def __init__(self, max_length=None, min_length=None, *args, **kwargs): super(CHZipCodeField, self).__init__(zip_re, max_length, min_length, *args, **kwargs) -class CHPhoneNumberField(Field): +class CHPhoneNumberField(Field, DeprecatedPhoneNumberFormFieldMixin): """ Validate local Swiss phone number (not international ones). diff --git a/localflavor/cn/forms.py b/localflavor/cn/forms.py index e93497d87..cf45e6f03 100644 --- a/localflavor/cn/forms.py +++ b/localflavor/cn/forms.py @@ -8,6 +8,8 @@ from django.forms.fields import CharField, RegexField, Select from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .cn_provinces import CN_PROVINCE_CHOICES __all__ = ( @@ -167,7 +169,7 @@ def has_valid_checksum(self, value): return '10X98765432'[checksum_index] == value[-1] -class CNPhoneNumberField(RegexField): +class CNPhoneNumberField(RegexField, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates input as a telephone number in mainland China. @@ -183,7 +185,7 @@ def __init__(self, *args, **kwargs): super(CNPhoneNumberField, self).__init__(PHONE_RE, *args, **kwargs) -class CNCellNumberField(RegexField): +class CNCellNumberField(RegexField, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates input as a cellphone number in mainland China. diff --git a/localflavor/dk/forms.py b/localflavor/dk/forms.py index cea62511c..bb0ceacdf 100644 --- a/localflavor/dk/forms.py +++ b/localflavor/dk/forms.py @@ -6,6 +6,8 @@ from django.forms import fields, widgets from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .dk_municipalities import DK_MUNICIPALITIES from .dk_postalcodes import DK_POSTALCODES @@ -33,7 +35,7 @@ def __init__(self, attrs=None, *args, **kwargs): ) -class DKPhoneNumberField(fields.RegexField): +class DKPhoneNumberField(fields.RegexField, DeprecatedPhoneNumberFormFieldMixin): """ Field with phone number validation. diff --git a/localflavor/es/forms.py b/localflavor/es/forms.py index 9a9fbcca6..4a627305d 100644 --- a/localflavor/es/forms.py +++ b/localflavor/es/forms.py @@ -11,6 +11,8 @@ from django.utils import six from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .es_provinces import PROVINCE_CHOICES from .es_regions import REGION_CHOICES @@ -33,7 +35,7 @@ def __init__(self, max_length=None, min_length=None, *args, **kwargs): max_length, min_length, *args, **kwargs) -class ESPhoneNumberField(RegexField): +class ESPhoneNumberField(RegexField, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates its input as a Spanish phone number. diff --git a/localflavor/fr/forms.py b/localflavor/fr/forms.py index 513c6daf1..34c8e6d6b 100644 --- a/localflavor/fr/forms.py +++ b/localflavor/fr/forms.py @@ -12,6 +12,7 @@ from django.utils.translation import ugettext_lazy as _ from localflavor.generic.checksums import luhn +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin from .fr_department import DEPARTMENT_CHOICES_PER_REGION from .fr_region import REGION_CHOICES @@ -40,7 +41,7 @@ def __init__(self, *args, **kwargs): super(FRZipCodeField, self).__init__(r'^\d{5}$', *args, **kwargs) -class FRPhoneNumberField(CharField): +class FRPhoneNumberField(CharField, DeprecatedPhoneNumberFormFieldMixin): """ Validate local French phone number (not international ones). diff --git a/localflavor/generic/deprecation.py b/localflavor/generic/deprecation.py new file mode 100644 index 000000000..239764cb1 --- /dev/null +++ b/localflavor/generic/deprecation.py @@ -0,0 +1,2 @@ +class RemovedInLocalflavor20Warning(PendingDeprecationWarning): + pass diff --git a/localflavor/generic/forms.py b/localflavor/generic/forms.py index 9e3e45a26..18f4bb494 100644 --- a/localflavor/generic/forms.py +++ b/localflavor/generic/forms.py @@ -1,5 +1,10 @@ +from __future__ import unicode_literals + +import warnings + from django import forms +from localflavor.generic.deprecation import RemovedInLocalflavor20Warning from .validators import IBAN_COUNTRY_CODE_LENGTH, BICValidator, IBANValidator DEFAULT_DATE_INPUT_FORMATS = ( @@ -127,3 +132,14 @@ def prepare_value(self, value): if value is not None: return value.upper() return value + + +class DeprecatedPhoneNumberFormFieldMixin(object): + def __init__(self): + super(DeprecatedPhoneNumberFormFieldMixin, self).__init__() + warnings.warn( + "{} is deprecated in favor of the django-phonenumber-field library.".format( + self.__class__.__name__ + ), + RemovedInLocalflavor20Warning, + ) diff --git a/localflavor/generic/models.py b/localflavor/generic/models.py index 629c77aa6..c45eaf0db 100644 --- a/localflavor/generic/models.py +++ b/localflavor/generic/models.py @@ -95,3 +95,11 @@ def formfield(self, **kwargs): defaults = {'form_class': BICFormField} defaults.update(kwargs) return super(BICField, self).formfield(**defaults) + + +class DeprecatedPhoneNumberField(object): + def __init__(self): + self.system_check_deprecated_details = { + 'msg': self.__class__.__name__ + " is deprecated.", + 'hint': 'Use django-phonenumber-field library instead.' + } diff --git a/localflavor/gr/forms.py b/localflavor/gr/forms.py index 2de872f37..879a07a84 100644 --- a/localflavor/gr/forms.py +++ b/localflavor/gr/forms.py @@ -6,6 +6,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + NUMERIC_RE = re.compile('^\d+$') @@ -65,7 +67,7 @@ def clean(self, value): return val -class GRPhoneNumberField(Field): +class GRPhoneNumberField(Field, DeprecatedPhoneNumberFormFieldMixin): """ Greek general phone field. @@ -92,7 +94,7 @@ def clean(self, value): raise ValidationError(self.error_messages['invalid']) -class GRMobilePhoneNumberField(Field): +class GRMobilePhoneNumberField(Field, DeprecatedPhoneNumberFormFieldMixin): """ Greek mobile phone field. diff --git a/localflavor/hk/forms.py b/localflavor/hk/forms.py index 5da61a81e..c79de1c09 100644 --- a/localflavor/hk/forms.py +++ b/localflavor/hk/forms.py @@ -8,6 +8,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + hk_phone_digits_re = re.compile(r'^(?:852-?)?(\d{4})[-\.]?(\d{4})$') hk_special_numbers = ('999', '992', '112') hk_phone_prefixes = ('2', '3', '5', '6', '8', '9') @@ -15,7 +17,7 @@ 'XXXX XXXX', 'XXXXXXXX'] -class HKPhoneNumberField(CharField): +class HKPhoneNumberField(CharField, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates Hong Kong phone numbers. diff --git a/localflavor/hr/forms.py b/localflavor/hr/forms.py index f57e32380..c238aba74 100644 --- a/localflavor/hr/forms.py +++ b/localflavor/hr/forms.py @@ -12,6 +12,7 @@ from django.utils.translation import ugettext_lazy as _ from localflavor.generic.checksums import luhn +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin from .hr_choices import HR_COUNTY_CHOICES, HR_LICENSE_PLATE_PREFIX_CHOICES, HR_PHONE_NUMBER_PREFIX_CHOICES @@ -204,7 +205,7 @@ def clean(self, value): return '%s' % value -class HRPhoneNumberField(Field): +class HRPhoneNumberField(Field, DeprecatedPhoneNumberFormFieldMixin): """ Phone number of Croatia field. diff --git a/localflavor/id_/forms.py b/localflavor/id_/forms.py index 9f7e7d8f7..af56bdac4 100644 --- a/localflavor/id_/forms.py +++ b/localflavor/id_/forms.py @@ -11,6 +11,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + postcode_re = re.compile(r'^[1-9]\d{4}$') phone_re = re.compile(r'^(\+62|0)[2-9]\d{7,10}$') plate_re = re.compile(r'^(?P[A-Z]{1,2}) ' + @@ -57,7 +59,7 @@ def __init__(self, attrs=None): super(IDProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES) -class IDPhoneNumberField(Field): +class IDPhoneNumberField(Field, DeprecatedPhoneNumberFormFieldMixin): """ An Indonesian telephone number field. diff --git a/localflavor/il/forms.py b/localflavor/il/forms.py index 67bc4ac48..dd0f1a665 100644 --- a/localflavor/il/forms.py +++ b/localflavor/il/forms.py @@ -9,6 +9,7 @@ from django.utils.translation import ugettext_lazy as _ from localflavor.generic.checksums import luhn +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin id_number_re = re.compile(r'^(?P\d{1,8})-?(?P\d)$') mobile_phone_number_re = re.compile(r'^(\()?0?(5[02-9])(?(1)\))-?\d{7}$') # including palestinian mobile carriers @@ -72,7 +73,7 @@ def clean(self, value): return value -class ILMobilePhoneNumberField(RegexField): +class ILMobilePhoneNumberField(RegexField, DeprecatedPhoneNumberFormFieldMixin): """A form field that validates its input as an Israeli Mobile phone number.""" default_error_messages = { diff --git a/localflavor/in_/forms.py b/localflavor/in_/forms.py index 4eb9eb465..ed53fed25 100644 --- a/localflavor/in_/forms.py +++ b/localflavor/in_/forms.py @@ -10,6 +10,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .in_states import STATE_CHOICES, STATES_NORMALIZED phone_digits_re = re.compile(r""" @@ -147,7 +149,7 @@ def __init__(self, attrs=None): super(INStateSelect, self).__init__(attrs, choices=STATE_CHOICES) -class INPhoneNumberField(CharField): +class INPhoneNumberField(CharField, DeprecatedPhoneNumberFormFieldMixin): """ INPhoneNumberField validates that the data is a valid Indian phone number, including the STD code. diff --git a/localflavor/is_/forms.py b/localflavor/is_/forms.py index 29c3126f3..4004fc990 100644 --- a/localflavor/is_/forms.py +++ b/localflavor/is_/forms.py @@ -9,6 +9,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .is_postalcodes import IS_POSTALCODES @@ -58,7 +60,7 @@ def _format(self, value): return force_text(value[:6] + '-' + value[6:]) -class ISPhoneNumberField(RegexField): +class ISPhoneNumberField(RegexField, DeprecatedPhoneNumberFormFieldMixin): """ Icelandic phone number. diff --git a/localflavor/it/forms.py b/localflavor/it/forms.py index 6127f20d3..39fe76cea 100644 --- a/localflavor/it/forms.py +++ b/localflavor/it/forms.py @@ -10,6 +10,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .it_province import PROVINCE_CHOICES from .it_region import REGION_CHOICES, REGION_PROVINCE_CHOICES from .util import ssn_validation, vat_number_validation @@ -114,7 +116,7 @@ def clean(self, value): raise ValidationError(self.error_messages['invalid']) -class ITPhoneNumberField(CharField): +class ITPhoneNumberField(CharField, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates input as an Italian phone number. diff --git a/localflavor/nl/forms.py b/localflavor/nl/forms.py index 681251ace..febf638c5 100644 --- a/localflavor/nl/forms.py +++ b/localflavor/nl/forms.py @@ -6,6 +6,8 @@ from django import forms from django.utils import six +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .nl_provinces import PROVINCE_CHOICES from .validators import NLPhoneNumberFieldValidator, NLSoFiNumberFieldValidator, NLZipCodeFieldValidator @@ -32,7 +34,7 @@ def __init__(self, attrs=None): super(NLProvinceSelect, self).__init__(attrs, choices=PROVINCE_CHOICES) -class NLPhoneNumberField(forms.CharField): +class NLPhoneNumberField(forms.CharField, DeprecatedPhoneNumberFormFieldMixin): """A Dutch telephone number field.""" default_validators = [NLPhoneNumberFieldValidator()] diff --git a/localflavor/nl/models.py b/localflavor/nl/models.py index cd99b6f0a..adf9ac162 100644 --- a/localflavor/nl/models.py +++ b/localflavor/nl/models.py @@ -3,9 +3,11 @@ from django.db import models from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.models import DeprecatedPhoneNumberField from . import forms from .nl_provinces import PROVINCE_CHOICES -from .validators import (NLBankAccountNumberFieldValidator, NLPhoneNumberFieldValidator, NLSoFiNumberFieldValidator, +from .validators import (NLBankAccountNumberFieldValidator, NLPhoneNumberFieldValidator, + NLSoFiNumberFieldValidator, NLZipCodeFieldValidator) @@ -84,7 +86,7 @@ def formfield(self, **kwargs): return super(NLSoFiNumberField, self).formfield(**defaults) -class NLPhoneNumberField(models.CharField): +class NLPhoneNumberField(models.CharField, DeprecatedPhoneNumberField): """ Dutch phone number model field. diff --git a/localflavor/no/forms.py b/localflavor/no/forms.py index 426b647f0..f0dd0cfc4 100644 --- a/localflavor/no/forms.py +++ b/localflavor/no/forms.py @@ -10,6 +10,8 @@ from django.forms.fields import Field, RegexField, Select from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .no_municipalities import MUNICIPALITY_CHOICES @@ -90,7 +92,7 @@ def multiply_reduce(aval, bval): return value -class NOPhoneNumberField(RegexField): +class NOPhoneNumberField(RegexField, DeprecatedPhoneNumberFormFieldMixin): """ Field with phonenumber validation. diff --git a/localflavor/nz/forms.py b/localflavor/nz/forms.py index 41be9d6e2..a28fe469a 100644 --- a/localflavor/nz/forms.py +++ b/localflavor/nz/forms.py @@ -10,6 +10,8 @@ from django.utils.encoding import smart_str from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .nz_councils import NORTH_ISLAND_COUNCIL_CHOICES, SOUTH_ISLAND_COUNCIL_CHOICES from .nz_provinces import PROVINCE_CHOICES from .nz_regions import REGION_CHOICES @@ -61,7 +63,7 @@ def __init__(self, *args, **kwargs): *args, **kwargs) -class NZPhoneNumberField(Field): +class NZPhoneNumberField(Field, DeprecatedPhoneNumberFormFieldMixin): """A form field that validates its input as New Zealand phone number.""" default_error_messages = {'invalid': _('Invalid phone number.')} diff --git a/localflavor/pk/forms.py b/localflavor/pk/forms.py index 028ee87be..95038adcd 100644 --- a/localflavor/pk/forms.py +++ b/localflavor/pk/forms.py @@ -10,6 +10,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .pk_states import STATE_CHOICES POSTCODE_DIGITS_RE = re.compile(r'^(\d{5})$') @@ -31,7 +33,7 @@ def __init__(self, *args, **kwargs): super(PKPostCodeField, self).__init__(POSTCODE_DIGITS_RE, *args, **kwargs) -class PKPhoneNumberField(CharField): +class PKPhoneNumberField(CharField, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates input as an Pakistani phone number. diff --git a/localflavor/pk/models.py b/localflavor/pk/models.py index be38523e2..47f2e0e38 100644 --- a/localflavor/pk/models.py +++ b/localflavor/pk/models.py @@ -1,6 +1,7 @@ from django.db.models import CharField from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.models import DeprecatedPhoneNumberField from . import forms from .pk_states import STATE_CHOICES @@ -44,7 +45,7 @@ def formfield(self, **kwargs): return super(PKPostCodeField, self).formfield(**defaults) -class PKPhoneNumberField(CharField): +class PKPhoneNumberField(CharField, DeprecatedPhoneNumberField): """A model field that checks that the value is a valid Pakistani phone number (nine to eleven digits).""" description = _("Pakistani Phone number") diff --git a/localflavor/pt/forms.py b/localflavor/pt/forms.py index ed7598079..0633aa189 100644 --- a/localflavor/pt/forms.py +++ b/localflavor/pt/forms.py @@ -19,6 +19,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .pt_regions import REGION_CHOICES CITIZEN_CARD_NUMBER_REGEX = regex_compile(r'^(\d{8})-?(\d[A-Z0-9]{2}\d)$') @@ -78,7 +80,7 @@ def compute(index, value): return value if value < 10 else value - 9 -class PTPhoneNumberField(Field): +class PTPhoneNumberField(Field, DeprecatedPhoneNumberFormFieldMixin): """ A field which validates Portuguese phone numbers. diff --git a/localflavor/ro/forms.py b/localflavor/ro/forms.py index b565606cd..5f4eeafa4 100644 --- a/localflavor/ro/forms.py +++ b/localflavor/ro/forms.py @@ -9,6 +9,8 @@ from django.forms import Field, RegexField, Select, ValidationError from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from ..generic.forms import IBANFormField from .ro_counties import COUNTIES_CHOICES @@ -190,7 +192,7 @@ def __init__(self, *args, **kwargs): super(ROIBANField, self).__init__(*args, **kwargs) -class ROPhoneNumberField(RegexField): +class ROPhoneNumberField(RegexField, DeprecatedPhoneNumberFormFieldMixin): """ Romanian phone number field. diff --git a/localflavor/sg/forms.py b/localflavor/sg/forms.py index b056b546d..d7c4119a3 100644 --- a/localflavor/sg/forms.py +++ b/localflavor/sg/forms.py @@ -10,6 +10,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + PHONE_DIGITS_RE = re.compile(r'^[689](\d{7})$') NRIC_FIN_RE = re.compile(r'^[SFTG](\d{7})[A-Z]$') @@ -33,7 +35,7 @@ def __init__(self, *args, **kwargs): super(SGPostCodeField, self).__init__(r'^\d{6}$', *args, **kwargs) -class SGPhoneNumberField(CharField): +class SGPhoneNumberField(CharField, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates input as a Singapore phone number. diff --git a/localflavor/si/forms.py b/localflavor/si/forms.py index b74a6a706..66d6d799f 100644 --- a/localflavor/si/forms.py +++ b/localflavor/si/forms.py @@ -10,6 +10,8 @@ from django.forms.fields import CharField, ChoiceField, Select from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .si_postalcodes import SI_POSTALCODES_CHOICES @@ -133,7 +135,7 @@ def __init__(self, attrs=None): choices=SI_POSTALCODES_CHOICES) -class SIPhoneNumberField(CharField): +class SIPhoneNumberField(CharField, DeprecatedPhoneNumberFormFieldMixin): """ Slovenian phone number field. diff --git a/localflavor/tr/forms.py b/localflavor/tr/forms.py index 1380858fa..7728c105e 100644 --- a/localflavor/tr/forms.py +++ b/localflavor/tr/forms.py @@ -8,6 +8,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + from .tr_provinces import PROVINCE_CHOICES phone_digits_re = re.compile(r'^(\+90|0)? ?(([1-9]\d{2})|\([1-9]\d{2}\)) ?([2-9]\d{2} ?\d{2} ?\d{2})$') @@ -40,7 +42,7 @@ def clean(self, value): return value -class TRPhoneNumberField(CharField): +class TRPhoneNumberField(CharField, DeprecatedPhoneNumberFormFieldMixin): """ A form field that validates input as a Turkish phone number. diff --git a/localflavor/us/forms.py b/localflavor/us/forms.py index 4fc7d1291..e78ea052c 100644 --- a/localflavor/us/forms.py +++ b/localflavor/us/forms.py @@ -10,6 +10,8 @@ from django.utils.encoding import force_text from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.forms import DeprecatedPhoneNumberFormFieldMixin + phone_digits_re = re.compile(r'^(?:1-?)?(\d{3})[-\.]?(\d{3})[-\.]?(\d{4})$') ssn_re = re.compile(r"^(?P\d{3})[-\ ]?(?P\d{2})[-\ ]?(?P\d{4})$") @@ -43,7 +45,7 @@ def to_python(self, value): return value.strip() -class USPhoneNumberField(CharField): +class USPhoneNumberField(CharField, DeprecatedPhoneNumberFormFieldMixin): """A form field that validates input as a U.S. phone number.""" default_error_messages = { diff --git a/localflavor/us/models.py b/localflavor/us/models.py index a7b92b922..c2b8ed9f0 100644 --- a/localflavor/us/models.py +++ b/localflavor/us/models.py @@ -1,6 +1,7 @@ from django.db.models import CharField from django.utils.translation import ugettext_lazy as _ +from localflavor.generic.models import DeprecatedPhoneNumberField from .forms import USPhoneNumberField as USPhoneNumberFormField from .forms import USSocialSecurityNumberField as USSocialSecurityNumberFieldFormField from .forms import USZipCodeField as USZipCodeFormField @@ -79,7 +80,7 @@ def formfield(self, **kwargs): return super(USZipCodeField, self).formfield(**defaults) -class PhoneNumberField(CharField): +class PhoneNumberField(CharField, DeprecatedPhoneNumberField): """ A :class:`~django.db.models.CharField` that checks that the value is a valid U.S.A.-style phone number. diff --git a/tests/settings.py b/tests/settings.py index 0ab4dc817..ca5911b24 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -16,6 +16,7 @@ 'tests.test_us', 'tests.test_pk', 'tests.test_generic', + 'tests.test_deprecated', ] SECRET_KEY = 'spam-spam-spam-spam' diff --git a/tests/test_deprecated/__init__.py b/tests/test_deprecated/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_deprecated/tests.py b/tests/test_deprecated/tests.py new file mode 100644 index 000000000..095c66791 --- /dev/null +++ b/tests/test_deprecated/tests.py @@ -0,0 +1,88 @@ +from __future__ import unicode_literals + +import warnings + +from django.db.models import Model +from django.test import SimpleTestCase, override_settings + +from localflavor.au import models as au_models +from localflavor.au.forms import AUPhoneNumberField +from localflavor.be.forms import BEPhoneNumberField +from localflavor.br.forms import BRPhoneNumberField +from localflavor.ca.forms import CAPhoneNumberField +from localflavor.ch.forms import CHPhoneNumberField +from localflavor.cn.forms import CNCellNumberField, CNPhoneNumberField +from localflavor.dk.forms import DKPhoneNumberField +from localflavor.es.forms import ESPhoneNumberField +from localflavor.fr.forms import FRPhoneNumberField +from localflavor.generic.deprecation import RemovedInLocalflavor20Warning +from localflavor.gr.forms import GRMobilePhoneNumberField, GRPhoneNumberField +from localflavor.hk.forms import HKPhoneNumberField +from localflavor.hr.forms import HRPhoneNumberField +from localflavor.id_.forms import IDPhoneNumberField +from localflavor.il.forms import ILMobilePhoneNumberField +from localflavor.in_.forms import INPhoneNumberField +from localflavor.is_.forms import ISPhoneNumberField +from localflavor.it.forms import ITPhoneNumberField +from localflavor.nl import models as nl_models +from localflavor.nl.forms import NLPhoneNumberField +from localflavor.no.forms import NOPhoneNumberField +from localflavor.nz.forms import NZPhoneNumberField +from localflavor.pk import models as pk_models +from localflavor.pk.forms import PKPhoneNumberField +from localflavor.pt.forms import PTPhoneNumberField +from localflavor.ro.forms import ROPhoneNumberField +from localflavor.sg.forms import SGPhoneNumberField +from localflavor.si.forms import SIPhoneNumberField +from localflavor.tr.forms import TRPhoneNumberField +from localflavor.us import models as us_models +from localflavor.us.forms import USPhoneNumberField + + +class DeprecatedFieldsTests(SimpleTestCase): + @override_settings(SILENCED_SYSTEM_CHECKS=[]) + def test_PhoneNumberField_deprecated(self): + class PhoneNumberModel(Model): + nl_phone_number = nl_models.NLPhoneNumberField() + au_phone_number = au_models.AUPhoneNumberField() + us_phone_number = us_models.PhoneNumberField() + pk_phone_number = pk_models.PKPhoneNumberField() + + model = PhoneNumberModel() + + self.assertTrue(all('is deprecated.' in warn.msg[0] for warn in model.check())) + + def test_PhoneNumberFormField_deprecated(self): + with warnings.catch_warnings(record=True) as recorded: + warnings.simplefilter("always") + AUPhoneNumberField() + BEPhoneNumberField() + BRPhoneNumberField() + CAPhoneNumberField() + CHPhoneNumberField() + CNPhoneNumberField() + CNCellNumberField() + DKPhoneNumberField() + ESPhoneNumberField() + FRPhoneNumberField() + GRPhoneNumberField() + GRMobilePhoneNumberField() + HKPhoneNumberField() + HRPhoneNumberField() + IDPhoneNumberField() + ILMobilePhoneNumberField() + INPhoneNumberField() + ISPhoneNumberField() + ITPhoneNumberField() + NLPhoneNumberField() + NOPhoneNumberField() + NZPhoneNumberField() + PKPhoneNumberField() + PTPhoneNumberField() + ROPhoneNumberField() + SGPhoneNumberField() + SIPhoneNumberField() + TRPhoneNumberField() + USPhoneNumberField() + + self.assertTrue(all(w.category is RemovedInLocalflavor20Warning for w in recorded))