[Checkins] SVN: z3c.formjs/trunk/src/z3c/formjs/ initial work on ajax helpers.

Paul Carduner paulcarduner at gmail.com
Sat Jul 14 09:40:54 EDT 2007


Log message for revision 77926:
  initial work on ajax helpers.

Changed:
  A   z3c.formjs/trunk/src/z3c/formjs/ajax.py
  A   z3c.formjs/trunk/src/z3c/formjs/ajax.pyc
  A   z3c.formjs/trunk/src/z3c/formjs/ajax.txt
  U   z3c.formjs/trunk/src/z3c/formjs/interfaces.py
  U   z3c.formjs/trunk/src/z3c/formjs/jsvalidator.py
  U   z3c.formjs/trunk/src/z3c/formjs/jsvalidator.txt
  U   z3c.formjs/trunk/src/z3c/formjs/tests/test_doc.py
  A   z3c.formjs/trunk/src/z3c/formjs/util.py

-=-
Added: z3c.formjs/trunk/src/z3c/formjs/ajax.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/ajax.py	                        (rev 0)
+++ z3c.formjs/trunk/src/z3c/formjs/ajax.py	2007-07-14 13:40:54 UTC (rev 77926)
@@ -0,0 +1,89 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Javascript Form Framework AJAX Framework.
+
+$Id: $
+"""
+__docformat__ = "reStructuredText"
+import sys
+import zope.component
+import zope.interface
+from zope.publisher.interfaces import NotFound
+
+from z3c.traverser import traverser
+from z3c.form.util import SelectionManager
+from z3c.traverser.interfaces import ITraverserPlugin
+from z3c.formjs import util, interfaces
+
+
+class AJAXHandlers(SelectionManager):
+    """A selection manager for handling AJAX request handlers."""
+
+    def addHandler(self, name, handler):
+        self._data_keys.append(name)
+        self._data_values.append(handler)
+        self._data[name] = handler
+
+
+class AJAXRequestHandler(util.FormTraverser):
+    zope.interface.implements(interfaces.IHaveAJAXMethods)
+
+    ajaxRequestHandlers = AJAXHandlers()
+
+
+class AJAXHandler(object):
+    zope.interface.implements(interfaces.IAJAXHandler)
+
+    def __init__(self, func):
+        self.func = func
+
+    def __call__(self, context, request):
+
+        class HandlerView(object):
+            def __init__(self, context, request, func):
+                self.context = context
+                self.request = request
+                self.func = func
+
+            def __call__(self):
+                return self.func(self.context, self.request)
+
+        return HandlerView(context, request, self.func)
+
+
+def handler(func):
+    """A decorator for defining an AJAX request handler."""
+    handler = AJAXHandler(func)
+    frame = sys._getframe(1)
+    f_locals = frame.f_locals
+    handlers = f_locals.setdefault('ajaxRequestHandlers', AJAXHandlers())
+    handlers.addHandler(func.__name__, handler)
+    return handler
+
+
+class AJAXRequestTraverser(object):
+    """Allow access to methods registered as an ajax request handler."""
+
+    zope.interface.implements(ITraverserPlugin)
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def publishTraverse(self, request, name):
+        handler = self.context.ajaxRequestHandlers.get(name)
+        if handler is None:
+            raise NotFound(self.context, name, request)
+
+        return handler(self.context, request)


Property changes on: z3c.formjs/trunk/src/z3c/formjs/ajax.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: z3c.formjs/trunk/src/z3c/formjs/ajax.pyc
===================================================================
(Binary files differ)


Property changes on: z3c.formjs/trunk/src/z3c/formjs/ajax.pyc
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: z3c.formjs/trunk/src/z3c/formjs/ajax.txt
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/ajax.txt	                        (rev 0)
+++ z3c.formjs/trunk/src/z3c/formjs/ajax.txt	2007-07-14 13:40:54 UTC (rev 77926)
@@ -0,0 +1,52 @@
+============
+AJAX Helpers
+============
+
+The formjs package also sports utilities for working with AJAX
+queries.  These utilities are provided by the ``ajax`` module.
+
+  >>> from z3c.formjs import ajax
+
+
+AJAX Request Handlers
+---------------------
+
+AJAX requests are sent from a client-side JavaScript script to the web
+server.  The request may contain form data or any other request data
+and the server sends back a response based on the request.  The
+functionality for handling requests and returning responses is already
+handled by browser views.  But browser views can be a bit overkill for
+handling very simple requests and responses that don't necessarily
+involve rendering full page templates.  The ``ajax`` module allows you
+to quickly build in short ajax request handlers into your form.
+
+We will first do the necessary setup steps:
+
+  >>> from z3c.form.testing import setupFormDefaults
+  >>> setupFormDefaults()
+
+Now we will create a simple form with an AJAX request handler.
+
+  >>> from z3c.form import form
+  >>> from z3c.formjs import interfaces
+  >>> import zope.interface
+  >>> class PingForm(ajax.AJAXRequestHandler, form.Form):
+  ...     
+  ...     @ajax.handler
+  ...     def pingBack(self, request):
+  ...         return request.get('message', 'Nothing to ping back.')
+
+Now we can call the pingBack method from a url using a pluggable traverser
+that we register.
+
+  >>> from z3c.form.testing import TestRequest
+  >>> import zope.component
+  >>> zope.component.provideSubscriptionAdapter(
+  ...     ajax.AJAXRequestTraverser,
+  ...     (interfaces.IHaveAJAXMethods, TestRequest) )
+  >>> request = TestRequest(form={'message': u'hello'})
+  >>> ping = PingForm(None, request)
+  >>> ping.update()
+  >>> ping.publishTraverse(request, 'pingBack')()
+  u'hello'
+


Property changes on: z3c.formjs/trunk/src/z3c/formjs/ajax.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: z3c.formjs/trunk/src/z3c/formjs/interfaces.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/interfaces.py	2007-07-14 13:06:19 UTC (rev 77925)
+++ z3c.formjs/trunk/src/z3c/formjs/interfaces.py	2007-07-14 13:40:54 UTC (rev 77926)
@@ -187,3 +187,24 @@
 
     def validate():
         """Return validation data."""
+
+
+# -----[ AJAX ]--------------------------------------------------------
+
+
+class IHaveAJAXMethods(zope.interface.Interface):
+    """An object that has methods for handling ajax requests."""
+
+    ajaxRequestHandlers = zope.schema.Object(
+        title=u"AJAX Request Handlers Manager",
+        schema=ISelectionManager)
+
+
+class IAJAXHandler(zope.interface.Interface):
+
+    def __call__(context, request):
+        """Return a callable that calls the handler function.
+
+        Return a callable which has access to context and request
+        without context and request being passed as arguments.
+        """

Modified: z3c.formjs/trunk/src/z3c/formjs/jsvalidator.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/jsvalidator.py	2007-07-14 13:06:19 UTC (rev 77925)
+++ z3c.formjs/trunk/src/z3c/formjs/jsvalidator.py	2007-07-14 13:40:54 UTC (rev 77926)
@@ -24,12 +24,12 @@
 from z3c.traverser.interfaces import IPluggableTraverser, ITraverserPlugin
 from z3c.form.interfaces import IWidget, IField
 
-from z3c.formjs import interfaces
+from z3c.formjs import interfaces, util
 
 # Traverser Plugin to the ``validate()`` method of the ``IAJAXValidator``
 ValidateTraverser = SingleAttributeTraverserPlugin('validate')
 
-class BaseValidator(object):
+class BaseValidator(util.FormTraverser):
     zope.interface.implements(interfaces.IAJAXValidator, IPluggableTraverser)
 
     # See ``interfaces.IAJAXValidator``
@@ -41,18 +41,7 @@
         self.updateWidgets()
         return self.widgets.extract()
 
-    def publishTraverse(self, request, name):
-        # Act like a pluggable traverser.
-        for traverser in zope.component.subscribers(
-                 (self, request), ITraverserPlugin):
-            try:
-                return traverser.publishTraverse(request, name)
-            except NotFound:
-                pass
 
-        raise NotFound(self.context, name, request)
-
-
 class MessageValidationScript(object):
     zope.interface.implements(interfaces.IMessageValidationScript)
 

Modified: z3c.formjs/trunk/src/z3c/formjs/jsvalidator.txt
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/jsvalidator.txt	2007-07-14 13:06:19 UTC (rev 77925)
+++ z3c.formjs/trunk/src/z3c/formjs/jsvalidator.txt	2007-07-14 13:40:54 UTC (rev 77926)
@@ -26,7 +26,6 @@
 
 So let's do some necessary setups:
 
-
   >>> from z3c.form.testing import setupFormDefaults
   >>> setupFormDefaults()
 

Modified: z3c.formjs/trunk/src/z3c/formjs/tests/test_doc.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/tests/test_doc.py	2007-07-14 13:06:19 UTC (rev 77925)
+++ z3c.formjs/trunk/src/z3c/formjs/tests/test_doc.py	2007-07-14 13:40:54 UTC (rev 77926)
@@ -29,6 +29,11 @@
             optionflags=zope.testing.doctest.NORMALIZE_WHITESPACE |
                         zope.testing.doctest.ELLIPSIS),
         zope.testing.doctest.DocFileSuite(
+            '../ajax.txt',
+            setUp=testing.setUp, tearDown=testing.tearDown,
+            optionflags=zope.testing.doctest.NORMALIZE_WHITESPACE |
+                        zope.testing.doctest.ELLIPSIS),
+        zope.testing.doctest.DocFileSuite(
             '../jsaction.txt',
             setUp=testing.setUp, tearDown=testing.tearDown,
             optionflags=zope.testing.doctest.NORMALIZE_WHITESPACE |

Added: z3c.formjs/trunk/src/z3c/formjs/util.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/util.py	                        (rev 0)
+++ z3c.formjs/trunk/src/z3c/formjs/util.py	2007-07-14 13:40:54 UTC (rev 77926)
@@ -0,0 +1,20 @@
+import zope.interface
+import zope.component
+from zope.publisher.interfaces import NotFound
+
+
+from z3c.traverser.interfaces import IPluggableTraverser, ITraverserPlugin
+
+class FormTraverser(object):
+    zope.interface.implements(IPluggableTraverser)
+
+    def publishTraverse(self, request, name):
+        # Act like a pluggable traverser.
+        for traverser in zope.component.subscribers(
+                 (self, request), ITraverserPlugin):
+            try:
+                return traverser.publishTraverse(request, name)
+            except NotFound:
+                pass
+
+        raise NotFound(self.context, name, request)


Property changes on: z3c.formjs/trunk/src/z3c/formjs/util.py
___________________________________________________________________
Name: svn:eol-style
   + native



More information about the Checkins mailing list