[Checkins] SVN: z3c.formjsdemo/trunk/src/z3c/formjsdemo/ added demo that shows how server side events can propagate to the clients browser through javascript injections.

Paul Carduner paulcarduner at gmail.com
Mon Aug 20 17:46:51 EDT 2007


Log message for revision 79051:
  added demo that shows how server side events can propagate to the clients browser through javascript injections.

Changed:
  U   z3c.formjsdemo/trunk/src/z3c/formjsdemo/browser/index.pt
  A   z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/
  A   z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/__init__.py
  A   z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/addarticle.pt
  A   z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/article.py
  A   z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/browser.py
  A   z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/clientevent.pt
  A   z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/configure.zcml
  A   z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/interfaces.py
  U   z3c.formjsdemo/trunk/src/z3c/formjsdemo/configure.zcml

-=-
Modified: z3c.formjsdemo/trunk/src/z3c/formjsdemo/browser/index.pt
===================================================================
--- z3c.formjsdemo/trunk/src/z3c/formjsdemo/browser/index.pt	2007-08-20 21:01:54 UTC (rev 79050)
+++ z3c.formjsdemo/trunk/src/z3c/formjsdemo/browser/index.pt	2007-08-20 21:46:50 UTC (rev 79051)
@@ -16,6 +16,11 @@
     <a href="/widgetswitch.html">Widget Switching</a>
   </div>
 
+  <div>
+    <a href="/addArticle.html">Server to Client Event Propogation</a>
+  </div>
+
+
   <h4>Advanced Demos</h4>
 
   <div>

Added: z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/__init__.py
===================================================================

Added: z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/addarticle.pt
===================================================================
--- z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/addarticle.pt	                        (rev 0)
+++ z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/addarticle.pt	2007-08-20 21:46:50 UTC (rev 79051)
@@ -0,0 +1,9 @@
+<div metal:use-macro="macro:form" />
+
+<h1>Existing Articles</h1>
+<ul>
+  <li tal:repeat="article view/articles">
+    <a tal:attributes="href article/@@absolute_url"
+       tal:content="article/title">Article</a>
+  </li>
+</ul>

Added: z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/article.py
===================================================================
--- z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/article.py	                        (rev 0)
+++ z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/article.py	2007-08-20 21:46:50 UTC (rev 79051)
@@ -0,0 +1,13 @@
+import persistent
+import zope.interface
+from zope.schema.fieldproperty import FieldProperty
+
+import interfaces
+
+class Article(persistent.Persistent):
+
+    zope.interface.implements(interfaces.IArticle)
+
+    title = FieldProperty(interfaces.IArticle['title'])
+    subtitle = FieldProperty(interfaces.IArticle['subtitle'])
+    body = FieldProperty(interfaces.IArticle['body'])

Added: z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/browser.py
===================================================================
--- z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/browser.py	                        (rev 0)
+++ z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/browser.py	2007-08-20 21:46:50 UTC (rev 79051)
@@ -0,0 +1,81 @@
+##############################################################################
+#
+# 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.
+#
+##############################################################################
+"""Browser code for JS button demo.
+
+$Id: layer.py 75942 2007-05-24 14:53:46Z srichter $
+"""
+__docformat__="restructuredtext"
+import zope.interface
+from zope.viewlet.viewlet import CSSViewlet
+from zope.event import notify
+from zope.component.interfaces import IObjectEvent
+from zope.component.interfaces import ObjectEvent
+from zope.app.pagetemplate.viewpagetemplatefile import ViewPageTemplateFile
+from zope.lifecycleevent.interfaces import IObjectModifiedEvent
+from zope.lifecycleevent.interfaces import IAttributes
+from zope.security.proxy import removeSecurityProxy
+from zope.app.container.interfaces import INameChooser
+from zope.traversing.browser.absoluteurl import absoluteURL
+
+from z3c.form import form, button, field
+from z3c.form.interfaces import IWidgets
+from z3c.formui import layout
+
+from z3c.formjs import jsaction, jsevent, ajax, jsclientevent
+
+import interfaces, article
+
+class ArticleAddForm(layout.FormLayoutSupport, form.AddForm):
+
+    template = ViewPageTemplateFile('addarticle.pt')
+    label = "Add an article"
+    fields = field.Fields(interfaces.IArticle)
+
+    def articles(self):
+        return filter(interfaces.IArticle.providedBy, self.context.values())
+
+    def create(self, data):
+        art = article.Article()
+        art.title = data['title']
+        art.subtitle = data['subtitle']
+        art.body = data['body']
+        return art
+
+    def add(self, object):
+        name = object.title.lower().replace(' ','')
+        context = removeSecurityProxy(self.context)
+        name = INameChooser(context).chooseName(name, object)
+        context[name] = object
+        self._name = name
+
+    def nextURL(self):
+        return absoluteURL(removeSecurityProxy(self.context)[self._name], self.request)
+
+
+class IButtons(zope.interface.Interface):
+    notify = jsaction.JSButton(title=u'Notify')
+
+class EventForm(jsclientevent.ClientEventsForm,
+                ajax.AJAXRequestHandler,
+                layout.FormLayoutSupport,
+                form.EditForm):
+
+    fields = field.Fields(interfaces.IArticle)
+
+    @jsclientevent.listener((interfaces.IArticle, IObjectModifiedEvent))
+    def customEventListener(self, event):
+        attributes = []
+        for attr in filter(IAttributes.providedBy, event.descriptions):
+            attributes += list(attr.attributes)
+        return 'alert("The following fields have changed: %s");' % ','.join(attributes)

Added: z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/clientevent.pt
===================================================================
--- z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/clientevent.pt	                        (rev 0)
+++ z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/clientevent.pt	2007-08-20 21:46:50 UTC (rev 79051)
@@ -0,0 +1,3 @@
+<div metal:use-macro="macro:form" />
+<script type="text/javascript"
+	tal:content="view/eventInjections"></script>
\ No newline at end of file

Added: z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/configure.zcml
===================================================================
--- z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/configure.zcml	                        (rev 0)
+++ z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/configure.zcml	2007-08-20 21:46:50 UTC (rev 79051)
@@ -0,0 +1,39 @@
+<configure
+    xmlns="http://namespaces.zope.org/browser"
+    xmlns:zope="http://namespaces.zope.org/zope"
+    xmlns:z3c="http://namespaces.zope.org/z3c"
+    i18n_domain="z3c.formjsdemo">
+
+  <zope:class class=".article.Article">
+    <allow
+	interface=".interfaces.IArticle"
+	/>
+    <require
+	permission="zope.View"
+	set_schema=".interfaces.IArticle"
+	/>
+  </zope:class>
+
+  <z3c:pagelet
+      name="addArticle.html"
+      for="zope.app.folder.interfaces.IFolder"
+      class=".browser.ArticleAddForm"
+      layer="z3c.formjsdemo.layer.IDemoBrowserLayer"
+      permission="zope.Public"
+      />
+
+  <z3c:pagelet
+      name="index.html"
+      for=".interfaces.IArticle"
+      class=".browser.EventForm"
+      layer="z3c.formjsdemo.layer.IDemoBrowserLayer"
+      permission="zope.Public"
+      />
+
+  <z3c:template
+      template="clientevent.pt"
+      for=".browser.EventForm"
+      layer="z3c.formjsdemo.layer.IDemoBrowserLayer"
+      />
+
+</configure>

Added: z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/interfaces.py
===================================================================
--- z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/interfaces.py	                        (rev 0)
+++ z3c.formjsdemo/trunk/src/z3c/formjsdemo/clientevent/interfaces.py	2007-08-20 21:46:50 UTC (rev 79051)
@@ -0,0 +1,17 @@
+import zope.interface
+from zope.schema import TextLine, Text
+
+class IArticle(zope.interface.Interface):
+    """A simple article"""
+
+    title = TextLine(
+        title=u'Title',
+        required=True)
+
+    subtitle = TextLine(
+        title=u'Subtitle',
+        required=True)
+
+    body = Text(
+        title=u'Body',
+        required=False)

Modified: z3c.formjsdemo/trunk/src/z3c/formjsdemo/configure.zcml
===================================================================
--- z3c.formjsdemo/trunk/src/z3c/formjsdemo/configure.zcml	2007-08-20 21:01:54 UTC (rev 79050)
+++ z3c.formjsdemo/trunk/src/z3c/formjsdemo/configure.zcml	2007-08-20 21:46:50 UTC (rev 79051)
@@ -19,5 +19,6 @@
   <include package=".chat" />
   <include package=".widgetswitch" />
   <include package=".tree" />
+  <include package=".clientevent" />
 
 </configure>



More information about the Checkins mailing list