[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