logo       

Kinder, gentler validators: msg#00058

web.zope.plone.archetypes.devel

Subject: Kinder, gentler validators

If you would like to replace Archetypes' default validators with some code
that produces better error messages and that is a little more forgiving of
imperfectly formatted data, you can use the code that follows.

Would anybody object to my replacing the RegExValidator in
validation.validators.validator.py and the default validators in
validation.validators.__init__.py with the code below?

Geoff Davis
http://www.geoffdavis.net



# code to install custom validators -- add this to MyProduct.__init__.py
from Products.MyProduct.CustomValidators import install
install()


# add this in your product as CustomValidators.py
import re
from Products.validation import validation
from Products.validation.interfaces import ivalidator
from Products.validation.validators.validator import ignoreRE

class RegexValidator:
__implements__ = (ivalidator,)

def __init__(self, name, errmsg='Validation Failed(%(name)s): on
%(value)s', *args):
self.name = name
self.errmsg = errmsg
self.regex = []
for r in args:
self.regex.append(re.compile(r))

def __call__(self, value, *args, **kwargs):
ignore = kwargs.get('ignore', None)
if ignore:
value = ignoreRE(value, ignore)

for r in self.regex:
m = r.match(value)
if not m:
return self.errmsg % {'name':self.name, 'value':value}
return 1


_validators = [
RegexValidator('isDecimal', 'Please enter a decimal number',

r'^\s*([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?\s*$'),
RegexValidator('isInt', 'Please enter an integer',
r'^\s*([+-])?\d+\s*$'),
# RegexValidator('isPrintable', r'[a-zA-Z0-9\s]+$'),
# RegexValidator('isSSN', r'^\d{9}$'),
RegexValidator('isUSPhoneNumber', 'Please enter a phone number
XXX-XXX-XXXX', r'\s*1?\s*[\(]?\s*\d{3}\s*[\)/.-]?\s*\d{3}\s*[\)/.-]?\d{4}'),
# RegexValidator('isInternationalPhoneNumber', r'^\d+$'),
# RegexValidator('isZipCode', r'^(\d{5}|\d{9})$'),
# RegexValidator('isURL', r'(ht|f)tps?://[^\s\r\n]+'),
RegexValidator('isEmail', 'Please enter a complete e-mail address',
"^\s*([0-9a-zA-Z_&.+-]+!)*[0-9a-zA-Z_&.+-]+@(([0-9a-z]([0-9a-z-]*[0-9a-z])?\
.)+[a-z]{2,6}|([0-9]{1,3}\.){3}[0-9]{1,3})\s*$"),
]


def install():
import sys
sys.stdout.write('installing validators\n')
for v in _validators:
validation.register(v)





-------------------------------------------------------
This SF.NET email is sponsored by: eBay
Great deals on office technology -- on eBay now! Click here:
http://adfarm.mediaplex.com/ad/ck/711-11697-6916-5


<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise