[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