usage just like pylons.decorators.validate()
Example:
# route
map.connect(":controller/:action/:a/:b")
class schema_test(formencode.schema):
a = form.validators.String(not_empty = False)
b = form.validators.String(not_empty = False)
# class
@argument_valdate(schem = schema_test())
def action(self, a, b):
pass
# def
# code ...
from decorator import decorator
import inspect
def argument_validate(schema = None, validators = None, on_invalid =
None):
"""schema - formencode.schema,
validators - formencode.validator dict
on_invalid - error callback(), defaults abort(404)
"""
def wrapper(func, self, *args, **kargs):
data = {}
errors = {}
validate_result = {}
func_args, func_varargs, func_varkw, func_defaults =
inspect.getargspec(func)
func_defaults_len = (len(func_defaults) if (func_defaults !=
None) else 0)
args_len = len(args)
for i in range(1, len(func_args)):
func_arg_name = func_args[i]
if (args_len > (i - 1)):
data[func_arg_name] = args[i - 1]
else:
if (func_defaults_len):
defaults_pos = func_defaults_len - i
if (func_defaults_len > defaults_pos):
data[func_arg_name] =
func_defaults[defaults_pos]
# if
# if
# if
# for
data.update(kargs)
if (schema):
try:
validate_result = schema.to_python(data)
except formencode.Invalid, e:
errors = e.unpack_errors(False, '.', '-')
# try
elif (validators):
if (isinstance(validators, dict)):
for field, validator in validators.iteritems():
try:
validate_result[field] =
validator.to_python(data[field])
except formencode.Invalid, e:
errors[field] = e
# try
# for
else:
raise(ArgumentError("argument 'validators' should be a
dict"))
# if
else:
raise(ArgumentError("one of 'validators' and 'schema' must
be specified."))
# if
if (errors):
if (on_invalid):
log.debug("action(%s) arguments(%r) invalid: %s" %
(func.__name__, data, errors))
return(on_invalid(errors))
else:
log.debug("action(%s) arguments(%r) invalid: %s" %
(func.__name__, data, errors))
abort(404)
# if
else:
return(func(self, **validate_result))
# if
# def
return(decorator(wrapper))
# def
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"pylons-discuss" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/pylons-discuss?hl=en
-~----------~----~----~----~------~----~------~--~---