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
-~----------~----~----~----~------~----~------~--~---

Reply via email to