Commit 6f7aa51b authored by Julien Phalip's avatar Julien Phalip
Browse files

Fixed #17864 -- Added Hong Kong localflavor. Thanks to mrkschan and Adrien Lemaire.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@17886 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent 883c38c4
Loading
Loading
Loading
Loading
+0 −0

Empty file added.

+71 −0
Original line number Diff line number Diff line
"""
Hong Kong specific Form helpers
"""
from __future__ import absolute_import

import re

from django.core.validators import EMPTY_VALUES
from django.forms import CharField
from django.forms import ValidationError
from django.utils.encoding import smart_unicode
from django.utils.translation import ugettext_lazy as _


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')
hk_formats = ['XXXX-XXXX', '852-XXXX-XXXX', '(+852) XXXX-XXXX',
    'XXXX XXXX', 'XXXXXXXX']



class HKPhoneNumberField(CharField):
    """
    Validate Hong Kong phone number.
    The input format can be either one of the followings:
    'XXXX-XXXX', '852-XXXX-XXXX', '(+852) XXXX-XXXX',
    'XXXX XXXX', or 'XXXXXXXX'.
    The output format is 'XXXX-XXXX'.

    Note: The phone number shall not start with 999, 992, or 112.
          And, it should start with either 2, 3, 5, 6, 8, or 9.

    Ref - http://en.wikipedia.org/wiki/Telephone_numbers_in_Hong_Kong
    """
    default_error_messages = {
        'disguise': _('Phone number should not start with ' \
                    'one of the followings: %s.' % \
                    ', '.join(hk_special_numbers)),
        'invalid': _('Phone number must be in one of the following formats: '
                    '%s.' % ', '.join(hk_formats)),
        'prefix': _('Phone number should start with ' \
                  'one of the followings: %s.' % \
                  ', '.join(hk_phone_prefixes)),
    }

    def __init__(self, *args, **kwargs):
        super(HKPhoneNumberField, self).__init__(*args, **kwargs)

    def clean(self, value):
        super(HKPhoneNumberField, self).clean(value)

        if value in EMPTY_VALUES:
            return u''

        value = re.sub('(\(|\)|\s+|\+)', '', smart_unicode(value))
        m = hk_phone_digits_re.search(value)
        if not m:
            raise ValidationError(self.error_messages['invalid'])

        value = u'%s-%s' % (m.group(1), m.group(2))
        for special in hk_special_numbers:
            if value.startswith(special):
                raise ValidationError(self.error_messages['disguise'])

        prefix_found = map(lambda prefix: value.startswith(prefix),
                           hk_phone_prefixes)
        if not any(prefix_found):
            raise ValidationError(self.error_messages['prefix'])

        return value
+10 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ Countries currently supported by :mod:`~django.contrib.localflavor` are:
* Finland_
* France_
* Germany_
* `Hong Kong`_
* Iceland_
* India_
* Indonesia_
@@ -108,6 +109,7 @@ Here's an example of how to use them::
.. _Finland: `Finland (fi)`_
.. _France: `France (fr)`_
.. _Germany: `Germany (de)`_
.. _Hong Kong: `Hong Kong (hk)`_
.. _The Netherlands: `The Netherlands (nl)`_
.. _Iceland: `Iceland (is\_)`_
.. _India: `India (in\_)`_
@@ -560,6 +562,14 @@ Germany (``de``)

    A ``Select`` widget that uses a list of German states as its choices.

Hong Kong (``hk``)
==================

.. class:: hk.forms.HKPhoneNumberField

    A form field that validates input as a Hong Kong phone number.


The Netherlands (``nl``)
========================

+0 −0

Empty file added.

+11 −0
Original line number Diff line number Diff line
from __future__ import absolute_import

from django.forms import ModelForm

from .models import HKPlace


class HKPlaceForm(ModelForm):

    class Meta:
        model = HKPlace
Loading