175
174
return tools.decorated(wrapper, fn, secured=False)
178
from itertools import izip, islice
179
from inspect import getargspec
181
def to_kw(func, args, kw):
183
argnames, defaults = getargspec(func)[::3]
184
defaults = defaults or []
186
kv = zip(islice(argnames, 0, len(argnames) - len(defaults)), args)
189
return args[len(argnames)-len(defaults):], kw
191
def from_kw(func, args, kw):
193
argnames, defaults = getargspec(func)[::3]
194
defaults = defaults or []
196
newargs = [kw.pop(name) for name in islice(argnames, 0, len(argnames) - len(defaults)) if name in kw]
202
def validate(form=None, validators=None):
204
def validate_wrapper(func):
206
if callable(form) and not hasattr(form, "validate"):
207
init_form = lambda self: form(self)
209
init_form = lambda self: form
211
def func_wrapper(*args, **kw):
213
# do not validate a second time if already validated
214
if hasattr(cherrypy.request, 'validation_state'):
215
return func(*args, **kw)
217
form = init_form(args and args[0] or kw["self"])
218
args, kw = to_kw(func, args, kw)
224
value.pop('self', None)
226
kw.update(form.validate(value, None))
228
errors = e.unpack_errors()
229
cherrypy.request.validation_exception = e
230
cherrypy.request.validation_value = value
231
cherrypy.request.validated_form = form
235
if isinstance(validators, dict):
236
for field, validator in validators.iteritems():
238
kw[field] = validator.to_python(
239
kw.get(field, None), None)
240
except Invalid, error:
241
errors[field] = error
245
kw.update(validators.to_python(value, None))
247
errors = e.unpack_errors()
248
cherrypy.request.validation_exception = e
249
cherrypy.request.validation_value = value
251
cherrypy.request.validation_errors = errors
252
cherrypy.request.input_values = kw.copy()
253
cherrypy.request.validation_state = True
255
args, kw = from_kw(func, args, kw)
256
return func(*args, **kw)
258
return tools.decorated(func_wrapper, func)
260
return validate_wrapper
262
def error_handler(handler):
266
def func_wrapper(*args, **kw):
268
tg_errors = getattr(cherrypy.request, 'validation_errors', None)
270
kw['tg_errors'] = tg_errors
271
return handler(*args, **kw)
273
return func(*args, **kw)
275
return tools.decorated(func_wrapper, func)
279
def exception_handler(*args, **kw):
283
177
# vim: ts=4 sts=4 sw=4 si et