|
From: <sub...@co...> - 2008-08-13 14:02:01
|
Author: mark
Date: 2008-08-13 08:02:09 -0600 (Wed, 13 Aug 2008)
New Revision: 3554
Modified:
FormEncode/trunk/formencode/national.py
Log:
DelimitedDigitsPostalCode to support even more exotic postal codes
Modified: FormEncode/trunk/formencode/national.py
===================================================================
--- FormEncode/trunk/formencode/national.py 2008-08-13 13:12:36 UTC (rev 3553)
+++ FormEncode/trunk/formencode/national.py 2008-08-13 14:02:09 UTC (rev 3554)
@@ -73,8 +73,8 @@
"""
Abstraction of common postal code formats, such as 55555, 55-555 etc.
- With constant amount of digits. You can set the right block to 0 to
- obtain a trivial 'x digits' postal code validator.
+ With constant amount of digits. By providing a single digit as partition you
+ can obtain a trivial 'x digits' postal code validator.
::
@@ -85,7 +85,7 @@
Traceback (most recent call last):
...
Invalid: Please enter a zip code (5 digits)
- >>> polish = DelimitedDigitsPostalCode(2, '-', 3)
+ >>> polish = DelimitedDigitsPostalCode([2, 3], '-')
>>> polish.to_python('55555')
'55-555'
>>> polish.to_python('55-555')
@@ -94,20 +94,39 @@
Traceback (most recent call last):
...
Invalid: Please enter a zip code (nn-nnn)
+ >>> nicaragua = DelimitedDigitsPostalCode([3, 3, 1], '-')
+ >>> nicaragua.to_python('5554443')
+ '555-444-3'
+ >>> nicaragua.to_python('555-4443')
+ '555-444-3'
+ >>> nicaragua.to_python('5555')
+ Traceback (most recent call last):
+ ...
+ Invalid: Please enter a zip code (nnn-nnn-n)
"""
strip = True
- def __init__(self, length_left_block, delimiter = None, length_right_block = 0, \
+ def assembly_formatstring(self, partition_lengths, delimiter):
+ if len(partition_lengths) == 1:
+ return _("%d digits") % partition_lengths[0]
+ else:
+ return delimiter.join(['n'*l for l in partition_lengths])
+
+ def assembly_regex(self, partition_lengths, delimiter):
+ mg = [r"(\d{%d})" % l for l in partition_lengths]
+ rd = r"\%s?" % delimiter
+ return rd.join(mg)
+
+ def __init__(self, partition_lengths, delimiter = None, \
*args, **kw):
- (self.length_left_block, self.delimiter, self.length_right_block) \
- = (length_left_block, delimiter, length_right_block)
- if length_right_block > 0:
- self.format = delimiter.join(['n'*length_left_block, 'n'*length_right_block])
- self.regex = r'^(\d{%d})\%s?(\d{%d})$' % (length_left_block, delimiter, length_right_block)
- else:
- self.format = _("%d digits") % length_left_block
- self.regex = r'^(\d{%d})$' % length_left_block
+ if type(partition_lengths) == type(1):
+ partition_lengths = [partition_lengths]
+ if not delimiter:
+ delimiter = ''
+ self.format = self.assembly_formatstring(partition_lengths, delimiter)
+ self.regex = self.assembly_regex(partition_lengths, delimiter)
+ (self.partition_lengths, self.delimiter) = (partition_lengths, delimiter)
Regex.__init__(self, *args, **kw)
messages = {
@@ -120,10 +139,7 @@
if not match:
raise Invalid(
self.message('invalid', state) % self.format, value, state)
- if self.delimiter:
- return ''.join([match.group(1), self.delimiter, match.group(2)])
- else:
- return match.group(1)
+ return self.delimiter.join(match.groups())
def USPostalCode(*args, **kw):
"""
@@ -141,17 +157,17 @@
...
Invalid: Please enter a zip code (5 digits)
"""
- return Any(DelimitedDigitsPostalCode(5, None, 0, *args, **kw),
- DelimitedDigitsPostalCode(5, '-', 4, *args, **kw))
+ return Any(DelimitedDigitsPostalCode(5, None, *args, **kw),
+ DelimitedDigitsPostalCode([5, 4], '-', *args, **kw))
def GermanPostalCode(*args, **kw):
- return DelimitedDigitsPostalCode(5, None, 0, *args, **kw)
+ return DelimitedDigitsPostalCode(5, None, *args, **kw)
def FourDigitsPostalCode(*args, **kw):
- return DelimitedDigitsPostalCode(4, None, 0, *args, **kw)
+ return DelimitedDigitsPostalCode(4, None, *args, **kw)
def PolishPostalCode(*args, **kw):
- return DelimitedDigitsPostalCode(2, '-', 3, *args, **kw)
+ return DelimitedDigitsPostalCode([2, 3], '-', *args, **kw)
class ArgentinianPostalCode(Regex):
@@ -319,18 +335,38 @@
'AR': ArgentinianPostalCode,
'AT': FourDigitsPostalCode,
'BE': FourDigitsPostalCode,
+ 'BG': FourDigitsPostalCode,
'CA': CanadianPostalCode,
'CL': lambda: DelimitedDigitsPostalCode(7),
+ 'CN': lambda: DelimitedDigitsPostalCode(6),
'CR': FourDigitsPostalCode,
'DE': GermanPostalCode,
'DK': FourDigitsPostalCode,
'DO': lambda: DelimitedDigitsPostalCode(5),
+ 'ES': lambda: DelimitedDigitsPostalCode(5),
+ 'FI': lambda: DelimitedDigitsPostalCode(5),
+ 'FR': lambda: DelimitedDigitsPostalCode(5),
'GB': UKPostalCode,
'GF': lambda: DelimitedDigitsPostalCode(5),
+ 'GR': lambda: DelimitedDigitsPostalCode([2, 3], ' '),
+ 'HN': lambda: DelimitedDigitsPostalCode(5),
'HT': FourDigitsPostalCode,
- 'HN': lambda: DelimitedDigitsPostalCode(5),
+ 'HU': FourDigitsPostalCode,
+ 'IS': lambda: DelimitedDigitsPostalCode(3),
+ 'IT': lambda: DelimitedDigitsPostalCode(5),
+ 'JP': lambda: DelimitedDigitsPostalCode([3, 4], '-'),
+ 'KR': lambda: DelimitedDigitsPostalCode([3, 3], '-'),
+ 'LI': FourDigitsPostalCode,
+ 'LU': FourDigitsPostalCode,
+ 'MC': lambda: DelimitedDigitsPostalCode(5),
+ 'NI': lambda: DelimitedDigitsPostalCode([3, 3, 1], '-'),
+ 'NO': FourDigitsPostalCode,
'PL': PolishPostalCode,
+ 'PT': lambda: DelimitedDigitsPostalCode([4, 3], '-'),
'PY': FourDigitsPostalCode,
+ 'RO': lambda: DelimitedDigitsPostalCode(6),
+ 'SE': lambda: DelimitedDigitsPostalCode([3, 2], ' '),
+ 'SG': lambda: DelimitedDigitsPostalCode(6),
'US': USPostalCode,
'UY': lambda: DelimitedDigitsPostalCode(5),
}
|