[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