[Checkins] SVN: z3c.formjs/trunk/ Factored out jquery-specific code
into its own module. Unfortunately I
Stephan Richter
srichter at cosmos.phy.tufts.edu
Thu Jul 5 20:39:27 EDT 2007
Log message for revision 77493:
Factored out jquery-specific code into its own module. Unfortunately I
could not name it "jquery.py", because then I cannot access the jquery
package anymore, since Python gives precendence to local imports.
*Sigh*
Improved doctest file formatting a little bit.
Changed:
U z3c.formjs/trunk/buildout.cfg
U z3c.formjs/trunk/src/z3c/formjs/__init__.py
U z3c.formjs/trunk/src/z3c/formjs/browser/__init__.py
U z3c.formjs/trunk/src/z3c/formjs/configure.zcml
A z3c.formjs/trunk/src/z3c/formjs/jqueryrenderer.py
A z3c.formjs/trunk/src/z3c/formjs/jqueryrenderer.zcml
U z3c.formjs/trunk/src/z3c/formjs/jsevent.py
U z3c.formjs/trunk/src/z3c/formjs/jsevent.txt
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/testing.py
-=-
Modified: z3c.formjs/trunk/buildout.cfg
===================================================================
--- z3c.formjs/trunk/buildout.cfg 2007-07-05 23:29:41 UTC (rev 77492)
+++ z3c.formjs/trunk/buildout.cfg 2007-07-06 00:39:26 UTC (rev 77493)
@@ -1,5 +1,5 @@
[buildout]
-develop = .
+develop = . z3c.form
parts = test coverage
[test]
Modified: z3c.formjs/trunk/src/z3c/formjs/__init__.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/__init__.py 2007-07-05 23:29:41 UTC (rev 77492)
+++ z3c.formjs/trunk/src/z3c/formjs/__init__.py 2007-07-06 00:39:26 UTC (rev 77493)
@@ -0,0 +1 @@
+# Make a package.
Modified: z3c.formjs/trunk/src/z3c/formjs/browser/__init__.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/browser/__init__.py 2007-07-05 23:29:41 UTC (rev 77492)
+++ z3c.formjs/trunk/src/z3c/formjs/browser/__init__.py 2007-07-06 00:39:26 UTC (rev 77493)
@@ -0,0 +1 @@
+# Make a package
Modified: z3c.formjs/trunk/src/z3c/formjs/configure.zcml
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/configure.zcml 2007-07-05 23:29:41 UTC (rev 77492)
+++ z3c.formjs/trunk/src/z3c/formjs/configure.zcml 2007-07-06 00:39:26 UTC (rev 77493)
@@ -1,6 +1,5 @@
<configure
xmlns="http://namespaces.zope.org/zope"
- xmlns:browser="http://namespaces.zope.org/zope"
i18n_domain="z3c.formjs">
<!-- Action Managers and Handlers -->
@@ -10,10 +9,6 @@
/>
<adapter
- factory=".jsevent.JQueryEventRenderer"
- />
-
- <adapter
factory=".jsevent.JSEventsRenderer"
/>
@@ -22,10 +17,6 @@
/>
<!-- JavaScript Validation -->
- <adapter
- factory=".jsvalidator.JQueryMessageValidationRenderer"
- />
-
<browser:view
for=".interfaces.IAJAXValidator"
type="zope.publisher.interfaces.http.IHTTPRequest"
@@ -164,4 +155,8 @@
component="z3c.formjs.jsevent.SUBMIT"
/>
+ <!-- Specific Javascript-backend implementations -->
+
+ <include file="jqueryrenderer.zcml" />
+
</configure>
Added: z3c.formjs/trunk/src/z3c/formjs/jqueryrenderer.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/jqueryrenderer.py (rev 0)
+++ z3c.formjs/trunk/src/z3c/formjs/jqueryrenderer.py 2007-07-06 00:39:26 UTC (rev 77493)
@@ -0,0 +1,85 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""JQuery-backend implementation
+
+$Id$
+"""
+__docformat__ = "reStructuredText"
+import zope.component
+import zope.interface
+
+from jquery.layer import IJQueryJavaScriptBrowserLayer
+
+from z3c.formjs import interfaces
+
+
+class JQueryEventRenderer(object):
+ """IJSEventRenderer implementation.
+
+ See ``interfaces.IJSEventRenderer``.
+ """
+ zope.interface.implements(interfaces.IJSEventRenderer)
+ zope.component.adapts(
+ interfaces.IJSEvent, IJQueryJavaScriptBrowserLayer)
+
+ def __init__(self, event, request):
+ self.request = request
+ self.event = event
+
+ def render(self, handler, id, form):
+ return '$("#%s").bind("%s", function(){%s});' % (
+ id, self.event.name, handler(form, id))
+
+
+class JQueryBaseValidationRenderer(object):
+
+ def __init__(self, form, field, request):
+ self.form = form
+ self.field = field
+ self.request = request
+
+ def _ajaxURL(self):
+ widget = self.form.widgets[self.field.__name__]
+ # build js expression for extracting widget value
+ # XXX: Maybe we should adapt the widget to IJSValueExtractorRenderer?
+ valueString = '$("#%s").val()' % widget.id
+
+ # build a js expression that joins valueString expression
+ queryString = '"?widget-id=%s&%s=" + %s' % (
+ widget.id, widget.name, valueString)
+
+ # build a js expression that joins form url, validate path, and query
+ # string
+ ajaxURL = '"'+self.form.request.getURL() + '/validate" + ' + queryString
+
+ return ajaxURL
+
+
+class JQueryMessageValidationRenderer(JQueryBaseValidationRenderer):
+
+ zope.interface.implements(interfaces.IJSMessageValidationRenderer)
+ zope.component.adapts(interfaces.IAJAXValidator,
+ zope.interface.Interface,
+ IJQueryJavaScriptBrowserLayer)
+
+ def render(self):
+ ajaxURL = self._ajaxURL()
+ # build a js expression that shows the user the error message
+ # XXX: later this should query for a renderer based on the widget
+ # jsrenderer = zope.component.queryMultiAdapter(
+ # (widget, self.request), interfaces.IJSErrorMessageRenderer)
+ # messageSetter = jsrenderer.render()
+ messageSetter = 'alert(data);'
+ ajax = '$.get(%s,\nfunction(data){\n%s\n})' % (ajaxURL, messageSetter)
+ return ajax
Property changes on: z3c.formjs/trunk/src/z3c/formjs/jqueryrenderer.py
___________________________________________________________________
Name: svn:keywords
+ Id
Added: z3c.formjs/trunk/src/z3c/formjs/jqueryrenderer.zcml
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/jqueryrenderer.zcml (rev 0)
+++ z3c.formjs/trunk/src/z3c/formjs/jqueryrenderer.zcml 2007-07-06 00:39:26 UTC (rev 77493)
@@ -0,0 +1,12 @@
+<configure
+ xmlns="http://namespaces.zope.org/zope"
+ i18n_domain="z3c.formjs">
+
+ <adapter
+ factory=".jqueryrenderer.JQueryEventRenderer" />
+
+ <adapter
+ factory=".jqueryrenderer.JQueryMessageValidationRenderer"
+ />
+
+</configure>
Property changes on: z3c.formjs/trunk/src/z3c/formjs/jqueryrenderer.zcml
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: z3c.formjs/trunk/src/z3c/formjs/jsevent.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/jsevent.py 2007-07-05 23:29:41 UTC (rev 77492)
+++ z3c.formjs/trunk/src/z3c/formjs/jsevent.py 2007-07-06 00:39:26 UTC (rev 77493)
@@ -88,9 +88,8 @@
for eventName, handler in self.events.items():
event = zope.component.getUtility(
interfaces.IJSEvent, name=eventName)
- renderer = zope.component.queryMultiAdapter(
- (event, self.request), interfaces.IJSEventRenderer,
- default=JQueryEventRenderer(event, self.request))
+ renderer = zope.component.getMultiAdapter(
+ (event, self.request), interfaces.IJSEventRenderer)
result += renderer.render(handler, widget.id, form) + '\n'
return result
@@ -129,8 +128,9 @@
for key, button in self.form.buttons.items():
handler = self.form.jshandlers.getHandler(button)
if handler is not None:
- renderer = zope.component.getMultiAdapter((handler.event, self.request),
- interfaces.IJSEventRenderer)
+ renderer = zope.component.getMultiAdapter(
+ (handler.event, self.request),
+ interfaces.IJSEventRenderer)
# XXX: is this a safe way to get ids?
id = self.form.actions[key].id
result += renderer.render(handler, id, self.form) + '\n'
@@ -138,24 +138,6 @@
return result
-class JQueryEventRenderer(object):
- """IJSEventRenderer implementation.
-
- See ``interfaces.IJSEventRenderer``.
- """
- implements(interfaces.IJSEventRenderer)
- zope.component.adapts(interfaces.IJSEvent,
- IJQueryJavaScriptBrowserLayer)
-
- def __init__(self, event, request):
- self.request = request
- self.event = event
-
- def render(self, handler, id, form):
- return '$("#%s").bind("%s", function(){%s});' % (
- id, self.event.name, handler(form, id))
-
-
class Handlers(button.Handlers):
"""Event Handlers for Javascript Buttons."""
Modified: z3c.formjs/trunk/src/z3c/formjs/jsevent.txt
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/jsevent.txt 2007-07-05 23:29:41 UTC (rev 77492)
+++ z3c.formjs/trunk/src/z3c/formjs/jsevent.txt 2007-07-06 00:39:26 UTC (rev 77493)
@@ -81,7 +81,7 @@
... return ('alert("Some event was called '
... 'for the element with id %s '
... 'and for the form %s");'
- ... % (id, form))
+ ... % (id, form))
Another aspect of javascript events is that they get attached to a
specific dom element using an id. So let us make an imaginary dom
@@ -96,7 +96,8 @@
jquery. The renderers are registered as adapters as follows.
>>> import zope.component
- >>> zope.component.provideAdapter(jsevent.JQueryEventRenderer)
+ >>> from z3c.formjs import jqueryrenderer
+ >>> zope.component.provideAdapter(jqueryrenderer.JQueryEventRenderer)
>>> from z3c.formjs.testing import TestRequest
>>> from jquery.layer import IJQueryJavaScriptBrowserLayer
@@ -104,12 +105,13 @@
>>> IJQueryJavaScriptBrowserLayer.providedBy(request)
True
- >>> renderer = zope.component.getMultiAdapter((jsevent.CLICK,
- ... request), jsinterfaces.IJSEventRenderer)
+ >>> renderer = zope.component.getMultiAdapter(
+ ... (jsevent.CLICK, request), jsinterfaces.IJSEventRenderer)
>>> renderer.render(simpleHandler, id, None)
'$("#form-field-age").bind("click", function(){alert("Some event was
called for the element with id form-field-age and for the form None");});'
+
=======
Widgets
=======
@@ -136,7 +138,9 @@
>>> textWidgetTemplate = tempfile.mktemp('text.pt')
>>> open(textWidgetTemplate, 'w').write('''\
... <input type="text" name="" value=""
- ... tal:attributes="id view/name; name view/name; value view/value;" />\
+ ... tal:attributes="id view/name;
+ ... name view/name;
+ ... value view/value;" />\
... ''')
>>> from z3c.form.widget import WidgetTemplateFactory
@@ -160,7 +164,8 @@
... return 'alert("This Widget was Double Clicked!");'
>>> events = jsevent.JSEvents(click=ageClickHandler,
... dblclick=ageDblClickHandler)
- >>> age = zope.component.getMultiAdapter((events, age), jsinterfaces.IJSEventsWidget)
+ >>> age = zope.component.getMultiAdapter(
+ ... (events, age), jsinterfaces.IJSEventsWidget)
Now we can update and render this widget.
@@ -176,8 +181,10 @@
... jsinterfaces.IJSEventsRenderer)
>>> age.id = 'age'
>>> print renderer.render(age, None)
- $("#age").bind("click", function(){alert("This Widget was Clicked!");});
- $("#age").bind("dblclick", function(){alert("This Widget was Double Clicked!");});
+ $("#age").bind("click",
+ function(){alert("This Widget was Clicked!");});
+ $("#age").bind("dblclick",
+ function(){alert("This Widget was Double Clicked!");});
Rendering Widgets with Attached Events
@@ -238,8 +245,10 @@
>>> zope.component.provideAdapter(jsevent.JSFormEventsRenderer)
>>> print jsinterfaces.IJSFormEventsRenderer(edit).render()
- $("#form-widgets-gender").bind("change", function(){alert("The Gender was Changed!");});
- $("#form-widgets-age").bind("click", function(){alert("The Age was Clicked!");});
+ $("#form-widgets-gender").bind("change",
+ function(){alert("The Gender was Changed!");});
+ $("#form-widgets-age").bind("click",
+ function(){alert("The Age was Clicked!");});
Attaching Events to Form Fields
@@ -267,5 +276,7 @@
>>> edit.update()
>>> zope.component.provideAdapter(jsevent.JSFormEventsRenderer)
>>> print jsinterfaces.IJSFormEventsRenderer(edit).render()
- $("#form-widgets-gender").bind("change", function(){alert("The Gender was Changed!");});
- $("#form-widgets-age").bind("click", function(){alert("The Age was Clicked!");});
\ No newline at end of file
+ $("#form-widgets-gender").bind("change",
+ function(){alert("The Gender was Changed!");});
+ $("#form-widgets-age").bind("click",
+ function(){alert("The Age was Clicked!");});
Modified: z3c.formjs/trunk/src/z3c/formjs/jsvalidator.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/jsvalidator.py 2007-07-05 23:29:41 UTC (rev 77492)
+++ z3c.formjs/trunk/src/z3c/formjs/jsvalidator.py 2007-07-06 00:39:26 UTC (rev 77493)
@@ -1,3 +1,21 @@
+##############################################################################
+#
+# 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 Interfaces.
+
+$Id: $
+"""
+__docformat__ = "reStructuredText"
import zope.interface
import zope.component
@@ -5,62 +23,9 @@
from z3c.traverser.interfaces import IPluggableTraverser, ITraverserPlugin
from z3c.form.interfaces import IWidget, IField
-from jquery.layer import IJQueryJavaScriptBrowserLayer
-
from z3c.formjs import interfaces
-## @zope.component.adapter(IWidget, IJQueryJavaScriptBrowserLayer)
-## @zope.interface.implementer(interfaces.IJSErrorMessageRenderer)
-## def JQueryErrorMessageRenderer(widgetID):
-## return '''$.get()'''
-
-
-class JQueryBaseValidationRenderer(object):
-
- def __init__(self, form, field, request):
- self.form = form
- self.field = field
- self.request = request
-
- def _ajaxURL(self):
- widget = self.form.widgets[self.field.__name__]
- # build js expression for extracting widget value
- # XXX: Maybe we should adapt the widget to IJSValueExtractorRenderer?
- valueString = '$("#%s").val()' % widget.id
-
- # build a js expression that joins valueString expression
- queryString = '"?widget-id=%s&%s=" + %s' % (
- widget.id, widget.name, valueString)
-
- # build a js expression that joins form url, validate path, and query
- # string
- ajaxURL = '"'+self.form.request.getURL() + '/validate" + ' + queryString
-
- # it should look something like this now:
- # "path/to/form.html/validate" + "?widget-id=some-id&value=" + $("#some-id").val()
- return ajaxURL
-
-
-class JQueryMessageValidationRenderer(JQueryBaseValidationRenderer):
-
- zope.interface.implements(interfaces.IJSMessageValidationRenderer)
- zope.component.adapts(interfaces.IAJAXValidator,
- zope.interface.Interface,
- IJQueryJavaScriptBrowserLayer)
-
- def render(self):
- ajaxURL = self._ajaxURL()
- # build a js expression that shows the user the error message
- # XXX: later this should query for a renderer based on the widget
- # jsrenderer = zope.component.queryMultiAdapter(
- # (widget, self.request), interfaces.IJSErrorMessageRenderer)
- # messageSetter = jsrenderer.render()
- messageSetter = 'alert(data);'
- ajax = '$.get(%s,\nfunction(data){\n%s\n})' % (ajaxURL, messageSetter)
- return ajax
-
-
class MessageValidationRenderer(object):
"""An intermediate class that performs adapter look ups.
Modified: z3c.formjs/trunk/src/z3c/formjs/jsvalidator.txt
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/jsvalidator.txt 2007-07-05 23:29:41 UTC (rev 77492)
+++ z3c.formjs/trunk/src/z3c/formjs/jsvalidator.txt 2007-07-06 00:39:26 UTC (rev 77493)
@@ -42,8 +42,9 @@
We will register a jquery renderer.
>>> import zope.component
+ >>> from z3c.formjs import jqueryrenderer
>>> zope.component.provideAdapter(
- ... jsvalidator.JQueryMessageValidationRenderer)
+ ... jqueryrenderer.JQueryMessageValidationRenderer)
>>> print edit.fieldValidator(edit, edit.fields['zip'])
$.get("http://127.0.0.1/validate" +
Modified: z3c.formjs/trunk/src/z3c/formjs/testing.py
===================================================================
--- z3c.formjs/trunk/src/z3c/formjs/testing.py 2007-07-05 23:29:41 UTC (rev 77492)
+++ z3c.formjs/trunk/src/z3c/formjs/testing.py 2007-07-06 00:39:26 UTC (rev 77493)
@@ -27,7 +27,7 @@
from zope.app.testing import setup
from z3c.formjs import jsbutton, jswidget, jsevent
-from z3c.formjs import interfaces, browser
+from z3c.formjs import interfaces, browser, jqueryrenderer
class TestRequest(TestRequest):
zope.interface.implements(jquery.layer.IJQueryJavaScriptBrowserLayer,
@@ -64,7 +64,7 @@
jsbutton.JSButtonAction, provides=z3c.form.interfaces.IFieldWidget)
zope.component.provideAdapter(
jswidget.JSEventsWidget, provides=interfaces.IJSEventsWidget)
- zope.component.provideAdapter(jsevent.JQueryEventRenderer)
+ zope.component.provideAdapter(jqueryrenderer.JQueryEventRenderer)
setUpEventUtilities()
More information about the Checkins
mailing list