[Checkins] SVN: z3c.formjs/trunk/src/z3c/formjs/ reimplemend the ajax traverser so it now looks like @@index.html/@@ajax/someFunc?someVar=someVal. This was to use the standard PluggableTraverser while bypassing possible inheritance of publishTraverse method from BrowserPage class by forms.

Paul Carduner paulcarduner at gmail.com
Sat Jul 14 20:22:43 EDT 2007


Log message for revision 77986:
  reimplemend the ajax traverser so it now looks like @@index.html/@@ajax/someFunc?someVar=someVal.  This was to use the standard PluggableTraverser while bypassing possible inheritance of publishTraverse method from BrowserPage class by forms.

Changed:
  U   z3c.formjs/trunk/src/z3c/formjs/ajax.py
  D   z3c.formjs/trunk/src/z3c/formjs/ajax.pyc
  U   z3c.formjs/trunk/src/z3c/formjs/ajax.txt
  U   z3c.formjs/trunk/src/z3c/formjs/configure.zcml
  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/util.py

-=-
Modified: z3c.formjs/trunk/src/z3c/formjs/ajax.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/ajax.py	2007-07-14 22:05:04 UTC (rev 77985)
+++ z3c.formjs/trunk/src/z3c/formjs/ajax.py	2007-07-15 00:22:40 UTC (rev 77986)
@@ -20,7 +20,7 @@
 import zope.component
 import zope.interface
 from zope.publisher.interfaces import NotFound
-
+from zope.publisher.browser import BrowserPage
 from z3c.traverser import traverser
 from z3c.form.util import SelectionManager
 from z3c.traverser.interfaces import ITraverserPlugin
@@ -36,32 +36,23 @@
         self._data[name] = handler
 
 
-class AJAXRequestHandler(util.FormTraverser):
-    zope.interface.implements(interfaces.IHaveAJAXMethods)
+class AJAXRequestHandler(object):
+    zope.interface.implements(interfaces.IAJAXRequestHandler,
+                              interfaces.IFormTraverser)
 
     ajaxRequestHandlers = AJAXHandlers()
 
 
-class AJAXHandler(object):
+class AJAXHandler(BrowserPage):
     zope.interface.implements(interfaces.IAJAXHandler)
 
     def __init__(self, func):
         self.func = func
 
-    def __call__(self, context, request):
+    def __call__(self):
+        return self.func(self.context)
 
-        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)
@@ -72,7 +63,7 @@
     return handler
 
 
-class AJAXRequestTraverser(object):
+class AJAXRequestTraverserPlugin(object):
     """Allow access to methods registered as an ajax request handler."""
 
     zope.interface.implements(ITraverserPlugin)
@@ -86,4 +77,6 @@
         if handler is None:
             raise NotFound(self.context, name, request)
 
-        return handler(self.context, request)
+        handler.context = self.context
+        handler.request = self.request
+        return handler#(self.context, request)

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

Modified: z3c.formjs/trunk/src/z3c/formjs/ajax.txt
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/ajax.txt	2007-07-14 22:05:04 UTC (rev 77985)
+++ z3c.formjs/trunk/src/z3c/formjs/ajax.txt	2007-07-15 00:22:40 UTC (rev 77986)
@@ -33,7 +33,7 @@
   >>> class PingForm(ajax.AJAXRequestHandler, form.Form):
   ...     
   ...     @ajax.handler
-  ...     def pingBack(self, request):
+  ...     def pingBack(self):
   ...         return request.get('message', 'Nothing to ping back.')
 
 Now we can call the pingBack method from a url using a pluggable traverser
@@ -41,12 +41,18 @@
 
   >>> from z3c.form.testing import TestRequest
   >>> import zope.component
+
+  >>> from z3c.traverser.browser import PluggableBrowserTraverser
+  >>> from z3c.traverser.interfaces import ITraverserPlugin
+  >>> from zope.publisher.interfaces.browser import IBrowserRequest
   >>> zope.component.provideSubscriptionAdapter(
-  ...     ajax.AJAXRequestTraverser,
-  ...     (interfaces.IHaveAJAXMethods, TestRequest) )
+  ...     ajax.AJAXRequestTraverserPlugin,
+  ...     (interfaces.IFormTraverser, IBrowserRequest),
+  ...     provides=ITraverserPlugin)
   >>> request = TestRequest(form={'message': u'hello'})
   >>> ping = PingForm(None, request)
   >>> ping.update()
-  >>> ping.publishTraverse(request, 'pingBack')()
+  >>> traverser = PluggableBrowserTraverser(ping, request)
+  >>> traverser.publishTraverse(request, 'pingBack')()
   u'hello'
 

Modified: z3c.formjs/trunk/src/z3c/formjs/configure.zcml
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/configure.zcml	2007-07-14 22:05:04 UTC (rev 77985)
+++ z3c.formjs/trunk/src/z3c/formjs/configure.zcml	2007-07-15 00:22:40 UTC (rev 77986)
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
 <configure
     xmlns="http://namespaces.zope.org/zope"
     i18n_domain="z3c.formjs">
@@ -36,6 +37,28 @@
       factory=".jsvalidator.ValidateTraverser"
       />
 
+  <!-- AJAX Traversers -->
+  <adapter
+      trusted="True"
+      for=".interfaces.IFormTraverser
+	   zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="zope.publisher.interfaces.browser.IBrowserPublisher"
+      factory="z3c.traverser.browser.PluggableBrowserTraverser"
+      permission="zope.Public"
+      name="ajax"
+      />
+
+  <subscriber
+      for=".interfaces.IFormTraverser
+	   zope.publisher.interfaces.browser.IBrowserRequest"
+      provides="z3c.traverser.interfaces.ITraverserPlugin"
+      factory=".ajax.AJAXRequestTraverserPlugin"
+      />
+
+  <class class=".ajax.AJAXHandler">
+    <allow interface="zope.publisher.interfaces.browser.IBrowserPage" />
+  </class>
+
   <!-- JavaScript Event Utitilities -->
   <utility
       name="click"

Modified: z3c.formjs/trunk/src/z3c/formjs/interfaces.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/interfaces.py	2007-07-14 22:05:04 UTC (rev 77985)
+++ z3c.formjs/trunk/src/z3c/formjs/interfaces.py	2007-07-15 00:22:40 UTC (rev 77986)
@@ -192,7 +192,7 @@
 # -----[ AJAX ]--------------------------------------------------------
 
 
-class IHaveAJAXMethods(zope.interface.Interface):
+class IAJAXRequestHandler(zope.interface.Interface):
     """An object that has methods for handling ajax requests."""
 
     ajaxRequestHandlers = zope.schema.Object(
@@ -208,3 +208,10 @@
         Return a callable which has access to context and request
         without context and request being passed as arguments.
         """
+
+
+# -----[ Form Traverser ]-------------------------------------------------
+
+class IFormTraverser(zope.interface.Interface):
+    """Marker interface for forms that can be traversed by the @@ajax
+    view."""

Modified: z3c.formjs/trunk/src/z3c/formjs/jsvalidator.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/jsvalidator.py	2007-07-14 22:05:04 UTC (rev 77985)
+++ z3c.formjs/trunk/src/z3c/formjs/jsvalidator.py	2007-07-15 00:22:40 UTC (rev 77986)
@@ -24,12 +24,12 @@
 from z3c.traverser.interfaces import IPluggableTraverser, ITraverserPlugin
 from z3c.form.interfaces import IWidget, IField
 
-from z3c.formjs import interfaces, util
+from z3c.formjs import interfaces
 
 # Traverser Plugin to the ``validate()`` method of the ``IAJAXValidator``
 ValidateTraverser = SingleAttributeTraverserPlugin('validate')
 
-class BaseValidator(util.FormTraverser):
+class BaseValidator(object):
     zope.interface.implements(interfaces.IAJAXValidator, IPluggableTraverser)
 
     # See ``interfaces.IAJAXValidator``
@@ -41,7 +41,18 @@
         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)
 
@@ -63,4 +74,3 @@
         if errors:
             return errors[0].message
         return u'' # all OK
-

Modified: z3c.formjs/trunk/src/z3c/formjs/util.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/util.py	2007-07-14 22:05:04 UTC (rev 77985)
+++ z3c.formjs/trunk/src/z3c/formjs/util.py	2007-07-15 00:22:40 UTC (rev 77986)
@@ -1,20 +0,0 @@
-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)



More information about the Checkins mailing list