[Checkins]
SVN: z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/ajax.
create a JSONRequestHandler which exposes a view method that
serializes from and to JSON on the way in and out.
Paul Carduner
paulcarduner at gmail.com
Fri Aug 8 05:35:31 EDT 2008
Log message for revision 89537:
create a JSONRequestHandler which exposes a view method that serializes from and to JSON on the way in and out.
Changed:
U z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/ajax.py
U z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/ajax.txt
-=-
Modified: z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/ajax.py
===================================================================
--- z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/ajax.py 2008-08-08 09:24:46 UTC (rev 89536)
+++ z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/ajax.py 2008-08-08 09:35:30 UTC (rev 89537)
@@ -18,15 +18,16 @@
__docformat__ = "reStructuredText"
import sys
import cjson
+import inspect
import zope.component
import zope.interface
from zope.publisher.interfaces import NotFound
from zope.publisher.browser import BrowserPage
+from zope.publisher.publish import mapply
from zope.traversing.api import getParents
from z3c.traverser import traverser
from z3c.form.util import SelectionManager, createCSSId
from z3c.traverser.interfaces import ITraverserPlugin
-
from z3c.formjs import interfaces
@@ -82,18 +83,21 @@
self.func = func
def __call__(self, view):
- result = self.func(view)
- if type(result) in (dict, list, set):
- try:
- result = cjson.encode(result)
- except TypeError:
- result = str(result)
+ result = mapply(self.func, (view,), view.request)
return result
def __repr__(self):
return "<%s %r>" % (self.__class__.__name__, self.func.__name__)
+class JSONHandler(AJAXHandler):
+ def __call__(self, view):
+ args = [cjson.decode(view.request[name])
+ for name in inspect.getargspec(self.func)[0][1:]]
+ result = self.func(view, *args)
+ return cjson.encode(result)
+
+
class AJAXRequestHandler(object):
"""Mix-in class for forms to support AJAX calls."""
zope.interface.implements(interfaces.IAJAXRequestHandler,
@@ -112,6 +116,19 @@
return handler
+def json(func):
+ """A decorator for defining JSONHandler objects.
+
+ This AJAX request handlers does JSON pre and post processing.
+ """
+ handler = JSONHandler(func)
+ frame = sys._getframe(1)
+ f_locals = frame.f_locals
+ handlers = f_locals.setdefault('ajaxRequestHandlers', AJAXHandlers())
+ handlers.addHandler(func.__name__, handler)
+ return handler
+
+
class AJAXView(BrowserPage):
"""A wrapper class around AJAX handler to allow it to be publishable."""
Modified: z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/ajax.txt
===================================================================
--- z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/ajax.txt 2008-08-08 09:24:46 UTC (rev 89536)
+++ z3c.formjs/branches/pcardune-client-notify-r87806/src/z3c/formjs/ajax.txt 2008-08-08 09:35:30 UTC (rev 89537)
@@ -39,7 +39,7 @@
... message = self.request.get('message', 'Nothing to ping back.')
... return "from %r: %s" % (self, message)
...
- ... @ajax.handler
+ ... @ajax.json
... def info(self):
... return {'class':self.__class__.__name__,
... 'requestKeys':self.request.keys(),
More information about the Checkins
mailing list