Opened 14 years ago
Closed 13 years ago
#14608 closed New feature (fixed)
Adding a INPhoneNumberField to indian localflavor
Reported by: | Kenneth Gonsalves | Owned by: | Kenneth Gonsalves |
---|---|---|---|
Component: | contrib.localflavor | Version: | dev |
Severity: | Normal | Keywords: | india phone |
Cc: | Triage Stage: | Ready for checkin | |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Indian landline phone numbers have an STD code prefixed by a '0' and followed by 2-4 digits. Followed by a 7 digit number that starts with the numbers 1-8. The two are separated by either a '-' or a space.
Attachments (6)
Change History (41)
by , 14 years ago
Attachment: | inphone.diff added |
---|
comment:1 by , 14 years ago
After extensive discussion in Indian python circles it was found that the patch submitted is not fully accurate. A fresh regex has been formulated and tests are being rewritten, so this ticket is not yet ready for review.
comment:2 by , 14 years ago
Patch needs improvement: | set |
---|---|
Triage Stage: | Unreviewed → Accepted |
comment:3 by , 14 years ago
Owner: | changed from | to
---|---|
Patch needs improvement: | unset |
Status: | new → assigned |
ok, now all is done. The documentation explains the format. Two files attached - the diff on django/contrib/localflavor/in_/forms.py and in.py which contains the tests. (why does the in directory have a trailing underscore?)
comment:4 by , 14 years ago
Needs tests: | set |
---|---|
Severity: | → Normal |
Type: | → New feature |
Thanks for this suggestion. Could you write some tests for this, either in source:django/trunk/tests/regressiontests/localflavor or source:django/trunk/tests/regressiontests/forms/localflavor ?
comment:5 by , 14 years ago
Needs tests: | unset |
---|
tests are there in 'in.py' uploaded 7 weeks back. I have unchecked the 'needs tests' field.
comment:6 by , 14 years ago
Patch needs improvement: | set |
---|
OK I see. Could you rewrite your tests using unittest, and also combine all changes within one single diff patch? Thanks!
comment:7 by , 14 years ago
you want unittests in addition to doctests? or instead of doctests? I have the unittests, but since I could not find unittests for other phonenumber flavors, I did not put them.
comment:8 by , 14 years ago
One of the features of 1.3 is that we replaced almost all the doctests in Django with unit tests. Going forward, we're only adding unit tests.
So - any patch being proposed for trunk needs to include unittests not doctests.
comment:9 by , 14 years ago
You may add your unittests either in source:django/trunk/tests/regressiontests/localflavor or source:django/trunk/tests/regressiontests/forms/localflavor , whichever makes more sense to you ;)
comment:10 by , 14 years ago
ok - will do - good thing you are removing doctests - they are a pain to write.
comment:11 by , 14 years ago
all ready, but I am confused as how to combine everything in one patch. svn diff gives me the changes in forms.py. I have also created an in.py in http://code.djangoproject.com/browser/django/trunk/tests/regressiontests/forms/localflavor - how do I add this to the patch?
comment:12 by , 14 years ago
My svn skills are a bit rusty but I think you need to 'svn add' the new file before running diff. I've also found this: http://stackoverflow.com/questions/4248768/including-new-files-in-svn-diff
If you're still struggling, I suggest you ask for help on the django-users list. Thank you!
comment:13 by , 14 years ago
cool - I haven't used svn for some years now. svn add did the trick. I will just test everything out and upload tomorrow. Thanks for you patience
comment:14 by , 14 years ago
Patch needs improvement: | unset |
---|---|
Resolution: | → fixed |
Status: | assigned → closed |
attached the patch with tests
comment:15 by , 14 years ago
Resolution: | fixed |
---|---|
Status: | closed → reopened |
A ticket isn't closed when a patch is uploaded.
comment:17 by , 14 years ago
Needs documentation: | set |
---|
Thank you for your own patience, lawgon. Could you also please write some documentation for this new feature? :)
comment:18 by , 14 years ago
class in_.forms.INPhoneNumberField validates that the data is a valid Indian phone number, including the STD code. It's normalised to 0XXX-XXXXXXX or 0XXX XXXXXXX format. The first string is the STD code which is a '0' followed by 2-4 digits. The second string is 8 digits if the STD code is 3 digits, 7 digits if the STD code is 4 digits and 6 digits if the STD code is 5 digits. The second string will start with numbers between 1 and 6. The separator is either a space or a hyphen.
This is the documentation (I had put it in the doctests file which has now been left out) - It is now in the docstring. Will upload the latest patch.
comment:19 by , 14 years ago
Sorry, I should have been clearer. You need to write the doc in source:django/trunk/docs/ref/contrib/localflavor.txt so that it appears in http://docs.djangoproject.com/en/dev/ref/contrib/localflavor/#india-in
By the way, what contribution did "Steve Fernandez" do in this patch? You may add his name and yours -- or maybe YOU are Steve :-) -- in source:django/trunk/AUTHORS if you like.
comment:20 by , 14 years ago
Needs documentation: | unset |
---|
documentation added. Steve removed. Fresh patch attached. Changed type in docs - the directory is 'in_' and not 'in' (wonder why?)
comment:21 by , 14 years ago
Patch needs improvement: | set |
---|
I tried your patch was the test wasn't run because it wasn't actually hooked up to the test suite. I've fixed that in the attached patch by updating tests/regressiontests/forms/localflavortests.py
and tests/regressiontests/forms/tests/__init__.py
Now, the test can be run but it raises this error:
====================================================================== ERROR: test_INPhoneNumberField (regressiontests.forms.localflavor.in_.INLocalFlavorTests) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/julien/.virtualenvs/djangotests/src/django/tests/regressiontests/forms/localflavor/in_.py", line 24, in test_INPhoneNumberField self.assertFieldOutput(INPhoneNumberField, valid, invalid) File "/Users/julien/.virtualenvs/djangotests/src/django/tests/regressiontests/forms/localflavor/utils.py", line 41, in assertFieldOutput required.clean, input File "/Users/julien/.virtualenvs/djangotests/src/django/django/utils/unittest/case.py", line 991, in assertRaisesRegexp expected_regexp = re.compile(expected_regexp) File "/opt/local/lib/python2.5/re.py", line 188, in compile return _compile(pattern, flags) File "/opt/local/lib/python2.5/re.py", line 241, in _compile raise error, v # invalid expression error: bad character range ----------------------------------------------------------------------
Needs fixing :)
I'm not sure if that's the cause, but tests need to pass on Python 2.5.
comment:22 by , 14 years ago
@lawgon -- the directory is called in_ because "in" is a keyword in Python.
comment:23 by , 14 years ago
I have only tested on 2.7 - will check on 2.6 and 2.5 and revert. Nice to know that our country has been honoured with a python keyword
comment:24 by , 14 years ago
it fails in 2.6 also. However the unit tests of the re expression pass in 2.6. I will investigate.
comment:25 by , 14 years ago
I am unable to fix this. Import of INPhoneNumberField into a form works as advertised. I also tried with a single line re (without VERBOSE) but the same re error comes up in the tests. Finally I tried with a very simple re - r'\d*'. This works. My conclusion is that in testing, an re beyond a certain length (or maybe beyond a certain level of complexity) will cause a syntax error although the same works in django itself. This is beyond my competence to correct. Should I file a bug?
comment:26 by , 14 years ago
I now tried with a simple re containing the '\d' repeated 85 times (this makes it the same length of my re). The tests accept it. So it must lie in the complexity.
comment:27 by , 14 years ago
Wow, it took me a long time to track this down. In fact, there's nothing really wrong with your patch. I think the problem is in the way that django.tests.regressiontests.forms.localflavor.utils.assertFieldOutput
works.
assertFieldOutput
calls assertRaisesRegexp
and passes the expected errors as a unicode string:
In source:django/trunk/tests/regressiontests/forms/localflavor/utils.py#L40 :
self.assertRaisesRegexp(ValidationError, unicode(errors), required.clean, input )
... and further down the track, in assertRaisesRegexp
, that string is compiled as a regular expression:
In source:django/trunk/django/utils/unittest/case.py#L991 :
expected_regexp = re.compile(expected_regexp)
Now, the issue here is that the error message in your patch contains some '-' characters, which are interpreted as a range, hence the 'bad character range' error that is raised when running the tests:
class INLocalFlavorTests(LocalFlavorTestCase): def test_INPhoneNumberField(self): error_format = [u'Phone numbers must be in 02X-7X or 03X-6X or 04X-5X format.'] ...
Remove those '-' characters and the tests will pass... Now of course, this is not satisfactory. I tend to think it's a bug in the test framework. Let me know if somebody has an opinion on this, otherwise I might bring this up on django-dev.
comment:28 by , 14 years ago
Given that the framework itself does not barf when the patch is used, I think that this bug needs to be fixed. The world will not end if django does not yet have an Indian Phone number field, but I have a few more of this type of thing in the Queue and some of them also use '-' in the error messages. So please take it up on the dev list. Frankly I do not think that error messages should compile as regex.
comment:29 by , 14 years ago
I think I've found the root cause for this problem and posted a proposed fix in #15805. If that fix gets checked in then your patch will be ready for checkin.
by , 14 years ago
Attachment: | INPhoneNumberField.diff added |
---|
fresh patch that fixes typo in the error message
comment:31 by , 14 years ago
Thanks for the update. By the way, feel free to add your name to the AUTHORS file, if only in memory of this epic ticket :)
comment:32 by , 14 years ago
Easy pickings: | unset |
---|---|
Patch needs improvement: | unset |
UI/UX: | unset |
as #15805 is fixed, can this be checked in?
comment:33 by , 14 years ago
This one can easily proceed as soon as #15813 gets checked in. I'm keeping an eye on it ;)
by , 13 years ago
Attachment: | 14608.IndianPhoneNumber-LocalFlavor.diff added |
---|
Patch updated to latest trunk
diff between current forms.py and proposed forms.py