[Checkins] SVN: Sandbox/philikon/megrok.kiss/trunk/ KSS integration for grok (megrok.kiss) along with a sample app, a jazzed up

Philipp von Weitershausen philikon at philikon.de
Sat Aug 25 18:35:07 EDT 2007


Log message for revision 79271:
  KSS integration for grok (megrok.kiss) along with a sample app, a jazzed up
  version of the TodoList example application I once wrote. This one is actually
  from the Snow Sprint 2007 and contains some additional Ajax views (based on
  KSS). It doesn't work currently, unfortunately. For some reason, KSS isn't
  sending back any commands to the client.
  

Changed:
  A   Sandbox/philikon/megrok.kiss/trunk/
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/setup.py
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/AGENDA.txt
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/README.txt
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/__init__.py
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app.py
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/deleteitem.pt
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/index.pt
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/search.pt
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/application.py
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/configure.zcml
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/interfaces.py
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority.py
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority_templates/
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority_templates/index.pt
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/static/
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/static/add.png
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/static/app.kss
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem.py
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem_templates/
  A   Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem_templates/index.pt
  A   Sandbox/philikon/megrok.kiss/trunk/buildout.cfg
  A   Sandbox/philikon/megrok.kiss/trunk/deploy.ini
  A   Sandbox/philikon/megrok.kiss/trunk/log/
  A   Sandbox/philikon/megrok.kiss/trunk/setup.py
  A   Sandbox/philikon/megrok.kiss/trunk/site.zcml
  A   Sandbox/philikon/megrok.kiss/trunk/src/
  A   Sandbox/philikon/megrok.kiss/trunk/src/megrok/
  A   Sandbox/philikon/megrok.kiss/trunk/src/megrok/__init__.py
  A   Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/
  A   Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/KSSNOTES.txt
  A   Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/__init__.py
  A   Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/component.py
  A   Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/configure.zcml
  A   Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/grokker.py
  A   Sandbox/philikon/megrok.kiss/trunk/var/
  A   Sandbox/philikon/megrok.kiss/trunk/zope.conf

-=-

Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList
___________________________________________________________________
Name: svn:ignore
   + TodoList.egg-info


Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/setup.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/setup.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/setup.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,26 @@
+from setuptools import setup, find_packages
+
+setup(name='TodoList',
+      version='0.1',
+      description="A todo list application",
+      long_description="", # TODO
+      # Get strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[], 
+      keywords="",
+      author="Philipp von Weitershausen",
+      author_email="philipp at weitershausen.de",
+      url="",
+      license="ZPL",
+      packages=find_packages(),
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=['setuptools',
+                        'grok',
+                        'hurry.query',
+                        'megrok.kiss',
+                        ],
+      entry_points="""
+      [paste.app_factory]
+      main = todolist.application:application_factory
+      """,
+      )


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/setup.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/AGENDA.txt
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/AGENDA.txt	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/AGENDA.txt	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,49 @@
+* question for the audience: who has Zope 3 experience?
+
+* grokproject
+
+* SnowPlow app (container)
+
+* SnowPlow index view
+
+* TodoItem model, view
+
+* AddTodoItem form
+
+* DeleteItem view
+
+* Edit view
+
+
+* schema
+
+* utility (vocabulary)
+
+
+
+* catalog local utility
+
+* ISearchableText adapter
+
+* Search view
+
+
+
+* static resources
+
+* skins
+
+
+* traversal (1 step, 2 steps)
+
+* security
+
+
+TODO:
+-----
+
+* annotations (tagging)
+
+* common layout (macros)
+
+* testing with grok


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/AGENDA.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/README.txt
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/README.txt	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/README.txt	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,8 @@
+Put your application code in this Python package.
+
+todoitem_templates
+  Place Page Templates (file extension '.pt') in this directory.  They
+  will automatically be associated as views with the model in todoitem.py.
+
+static
+  Place static resources such as CSS, JS, images, etc. in here.


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/README.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/__init__.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/__init__.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/__init__.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1 @@
+# this directory is a package


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,117 @@
+import grok
+import hurry.query.value
+
+from zope import component
+from zope.index.text.interfaces import ISearchableText
+from zope.dublincore.interfaces import IZopeDublinCore
+from zope.app.intid import IntIds
+from zope.app.intid.interfaces import IIntIds
+from zope.app.catalog.catalog import Catalog
+from zope.app.catalog.interfaces import ICatalog
+from zope.app.catalog.text import TextIndex
+from zc.catalog.catalogindex import ValueIndex
+
+from todolist.interfaces import ITodoItem
+from todolist.todoitem import TodoItem
+from todolist.priority import Priority
+
+def setup_catalog(catalog):
+    catalog['fulltext'] = TextIndex('getSearchableText', ISearchableText, True)
+    catalog['created'] = ValueIndex('created', IZopeDublinCore, False)
+    catalog['modified'] = ValueIndex('modified', IZopeDublinCore, False)
+    catalog['priority'] = ValueIndex('priority', ITodoItem, False)
+
+class SnowPlow(grok.Application, grok.Container):
+    grok.local_utility(IntIds, provides=IIntIds) # necessary for catalog
+    grok.local_utility(Catalog, provides=ICatalog, setup=setup_catalog)
+
+    def traverse(self, name):
+        if name == 'last':
+            catalog = component.getUtility(ICatalog)
+            last_modification_date = catalog['created'].maxValue()
+            last = catalog.searchResults(created={'any_of':
+                                                  (last_modification_date,)})
+            return list(last)[0]
+        if name == 'by-priority':
+            return ByPriority()
+
+grok.context(SnowPlow)
+
+class ByPriority(grok.Model):
+
+    def traverse(self, name):
+        return Priority(name)
+
+class Index(grok.View):
+    pass
+
+class AddTodoItem(grok.AddForm):
+    form_fields = grok.AutoFields(ITodoItem)
+
+    @grok.action('Add')
+    def add(self, title, priority):
+        id = title.lower().replace(' ', '-')
+        self.context[id] = todoitem = TodoItem(title, priority)
+        grok.notify(grok.ObjectCreatedEvent(todoitem))
+        self.redirect(self.url(self.context))
+
+class DeleteItem(grok.View):
+
+    def update(self):
+        name = self.request.form.get('name', None)
+        if name is not None:
+            del self.context[name]
+            self.redirect(self.url(self.context))
+
+class Search(grok.View):
+
+    def update(self):
+        query = self.request.form.get('query')
+        self.search_results = []
+        if query is not None:
+            catalog = component.getUtility(ICatalog)
+            self.search_results = catalog.searchResults(fulltext=query)
+
+import megrok.kiss
+
+class DeleteKSS(megrok.kiss.AjaxAction):
+
+    def action(self):
+        name = self.request.form.get('name', None)
+        if name is not None:
+            del self.context[name]
+            self.core.deleteNode(self.core.getHtmlIdSelector('item-' + name))
+
+class EditKSS(megrok.kiss.AjaxAction):
+
+    def action(self):
+        name = self.request.form.get('name', None)
+        if name is not None:
+            item = self.context[name]
+            self.core.replaceInnerHTML(
+                self.core.getHtmlIdSelector('title-' + name),
+                '<input type="text" name="title" value="%s" />' % item.title
+                )
+            self.core.replaceInnerHTML(
+                self.core.getHtmlIdSelector('edit-' + name),
+                '<input type="submit" value="Save" class="edit-submit kukit-name-%s" />' % name
+                )
+
+class EditSaveKSS(megrok.kiss.AjaxAction):
+
+    def action(self):
+        name = self.request.form.get('name', None)
+        if name is not None:
+            item = self.context[name]
+            title = self.request.form.get('title')
+            item.title = title
+
+            self.core.replaceInnerHTML(
+                self.core.getHtmlIdSelector('title-' + name),
+                '<a href="%s">%s</a>' % (self.url(item), title)
+                )
+
+            self.core.replaceInnerHTML(
+                self.core.getHtmlIdSelector('edit-' + name),
+                '<a href="%s">edit</a>' % self.url(item, 'edit')
+                )


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/deleteitem.pt
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/deleteitem.pt	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/deleteitem.pt	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,7 @@
+<html>
+<body>
+
+You didn't provide a name.
+
+</body>
+</html>


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/deleteitem.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/index.pt
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/index.pt	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/index.pt	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,64 @@
+<html>
+<head>
+  <base href="" tal:attributes="href python:view.url(context)" />
+
+  <script type="text/javascript" src=""
+          tal:attributes="src context/++resource++sarissa.js">
+  </script>
+  <script type="text/javascript" src=""
+          tal:attributes="src context/++resource++cssQuery.js">
+  </script>
+  <script type="text/javascript" src=""
+          tal:attributes="src context/++resource++MochiKit.js">
+  </script>
+  <script type="text/javascript" src=""
+          tal:attributes="src context/++resource++kukit.js">
+  </script>
+
+  <link rel="k-stylesheet" type="text/css" href="" tal:attributes="href static/app.kss" />
+</head>
+<body>
+<h1>SnowPlow - keep track of your todo items!</h1>
+
+<form name="edit">
+<table>
+  <tr tal:repeat="item context/values"
+      tal:attributes="id string:item-${item/__name__}">
+    <td tal:attributes="id string:title-${item/__name__}">
+      <a href="" tal:attributes="href python:view.url(item)"
+         tal:content="item/title">item</a>
+    </td>
+    <td>
+      <a href=""
+         tal:attributes="href python:view.url(context, 'by-priority/%s' % item.priority)"
+         tal:content="item/priority">priority</a>
+    </td>
+    <td tal:attributes="id string:edit-${item/__name__}">
+      [<a href="" class="edit"
+          tal:attributes="href python:view.url(item, 'edit');
+                          class string:edit kukit-name-${item/__name__}">edit</a>]
+    </td>
+    <td>
+      [<a href="" class="delete"
+          tal:attributes="href python:view.url('deleteitem') + '?name=%s' % item.__name__;
+                          class string:delete kukit-name-${item/__name__}">del</a>]
+    </td>
+  </tr>
+</table>
+</form>
+
+<p><a href="addtodoitem"
+      tal:attributes="href python:view.url('addtodoitem')">
+    <img src="" tal:attributes="src static/add.png" border="0" />
+</a></p>
+
+<form name="search" action=""
+      tal:attributes="action python:view.url('search')" method="post">
+  <input type="text" name="query" />
+  <input type="submit"  value="Search"/>
+</form>
+
+<button onclick="void(createLoggingPane(true));">Show Debug</button>
+
+</body>
+</html>


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/index.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/search.pt
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/search.pt	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/search.pt	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,13 @@
+<html>
+<body>
+
+Your search results:
+
+<ul>
+  <li tal:repeat="result view/search_results"
+      tal:content="result/title">
+  </li>
+</ul>
+
+</body>
+</html>


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/app_templates/search.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/application.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/application.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/application.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,32 @@
+import sys, os
+import ZConfig
+import zope.event
+import zope.app.appsetup
+from zope.app.wsgi import WSGIPublisherApplication
+from zope.app.appsetup.appsetup import multi_database
+from zope.app.appsetup.interfaces import DatabaseOpened, ProcessStarting
+
+def application_factory(global_conf, conf='zope.conf'):
+    # load 'zope.conf' configuration
+    schema_xml = os.path.join(
+        os.path.dirname(zope.app.appsetup.__file__), 'schema', 'schema.xml')
+    schema = ZConfig.loadSchema(schema_xml)
+    options, handlers = ZConfig.loadConfig(
+        schema, os.path.join(global_conf['here'], conf))
+
+    if options.path:
+        sys.path[0:0] = [os.path.abspath(p) for p in options.path]
+    options.eventlog()
+
+    # load ZCML configuration
+    features = ()
+    if options.devmode:
+        features += ('devmode',)
+    zope.app.appsetup.config(options.site_definition, features)
+
+    # notify of ZODB database opening
+    db = multi_database(options.databases)[0][0]
+    zope.event.notify(DatabaseOpened(db))
+
+    zope.event.notify(ProcessStarting())
+    return WSGIPublisherApplication(db)


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/application.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/configure.zcml
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/configure.zcml	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/configure.zcml	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,8 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:grok="http://namespaces.zope.org/grok">
+  <include package="grok" />
+  <include package="megrok.kiss" />
+  <include package="hurry.query" />
+
+  <grok:grok package="." />
+</configure>


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/interfaces.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/interfaces.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/interfaces.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,8 @@
+from zope import schema, interface
+
+class ITodoItem(interface.Interface):
+
+    title = schema.TextLine(title=u"Title")
+
+    priority = schema.Choice(title=u'Category',
+                             vocabulary='Todo Priorities')


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/interfaces.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,24 @@
+import grok
+from zope import component
+from zope.app.catalog.interfaces import ICatalog
+from zope.schema.interfaces import IVocabularyFactory
+from zope.schema.vocabulary import SimpleVocabulary
+
+class PriorityVocabulary(grok.GlobalUtility):
+    grok.implements(IVocabularyFactory)
+    grok.name('Todo Priorities')
+
+    def __call__(self, context):
+        return SimpleVocabulary.fromValues(['important', 'medium', 'forgetit'])
+
+class Priority(grok.Model):
+
+    def __init__(self, priority):
+        self.priority = priority
+
+class Index(grok.View):
+
+    def update(self):
+        catalog = component.getUtility(ICatalog)
+        self.todoitems = catalog.searchResults(
+            priority={'any_of': (self.context.priority,)})


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority_templates/index.pt
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority_templates/index.pt	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority_templates/index.pt	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,12 @@
+<html>
+<body>
+
+Todo items with priority <span tal:replace="context/priority" />:
+
+<ul>
+  <li tal:repeat="item view/todoitems"
+      tal:content="item/title">todo items</li>
+</ul>
+
+</body>
+</html>


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/priority_templates/index.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/static/add.png
===================================================================
(Binary files differ)


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/static/add.png
___________________________________________________________________
Name: svn:mime-type
   + image/png

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/static/app.kss
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/static/app.kss	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/static/app.kss	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,16 @@
+a.delete:click {
+  action-server: deletekss;
+  deletekss-name: kssAttr('name');
+  evt-click-preventdefault: True;
+}
+a.edit:click {
+  action-server: editkss;
+  editkss-name: kssAttr('name');
+  evt-click-preventdefault: True;
+}
+input.edit-submit:click {
+  action-server: editsavekss;
+  editsavekss-name: kssAttr('name');
+  editsavekss-title: currentFormVar('title');
+  evt-click-preventdefault: True;
+}
\ No newline at end of file

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,29 @@
+import grok
+from zope.index.text.interfaces import ISearchableText
+from todolist.interfaces import ITodoItem
+
+grok.define_permission('todolist.ViewTodoItem')
+
+class TodoItem(grok.Model):
+    grok.implements(ITodoItem)
+
+    def __init__(self, title, priority):
+        self.title = title
+        self.priority = priority
+
+class TodoItemSearchableText(grok.Adapter):
+    grok.implements(ISearchableText)
+
+    def getSearchableText(self):
+        return self.context.title
+
+class Index(grok.View):
+    grok.require('todolist.ViewTodoItem')
+
+class Edit(grok.EditForm):
+    form_fields = grok.AutoFields(TodoItem)
+
+    @grok.action('Save changes')
+    def save(self, **data):
+        self.applyChanges(**data)
+        self.redirect(self.url(self.context))


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem_templates/index.pt
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem_templates/index.pt	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem_templates/index.pt	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,9 @@
+<html>
+<body>
+
+<h1 tal:content="context/title">title</h1>
+
+<p>Priority: <span tal:replace="context/priority" /></p>
+
+</body>
+</html>


Property changes on: Sandbox/philikon/megrok.kiss/trunk/TodoList/todolist/todoitem_templates/index.pt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/buildout.cfg
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/buildout.cfg	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/buildout.cfg	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,17 @@
+[buildout]
+develop = . TodoList
+parts = app test
+find-links = http://download.zope.org/distribution/
+newest = false
+
+[app]
+recipe = zc.recipe.egg
+eggs = TodoList
+       Paste
+       PasteScript
+       PasteDeploy
+
+[test]
+recipe = zc.recipe.testrunner
+eggs = megrok.kiss
+defaults = ['--tests-pattern', '^f?tests$', '-v']

Added: Sandbox/philikon/megrok.kiss/trunk/deploy.ini
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/deploy.ini	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/deploy.ini	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,7 @@
+[app:main]
+use = egg:TodoList
+
+[server:main]
+use = egg:Paste#http
+host = 127.0.0.1
+port = 8080

Added: Sandbox/philikon/megrok.kiss/trunk/setup.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/setup.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/setup.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,27 @@
+from setuptools import setup, find_packages
+
+setup(name='megrok.kiss',
+      version='0.1',
+      description="KSS integration for grok",
+      long_description="", # TODO
+      # Get strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[], 
+      keywords="",
+      author="Philipp von Weitershausen",
+      author_email="philipp at weitershausen.de",
+      url="",
+      license="ZPL",
+      package_dir={'': 'src'},
+      packages=find_packages('src'),
+      namespace_packages=['megrok',],
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=['setuptools',
+                        'zope.component',
+                        'zope.traversing',
+                        'zope.publisher',
+                        'kss.core',
+                        'martian',
+                        'grok',  # only needed for ZCML
+                        ],
+      )


Property changes on: Sandbox/philikon/megrok.kiss/trunk/setup.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/site.zcml
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/site.zcml	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/site.zcml	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,36 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           i18n_domain="foo">
+
+  <include package="todolist" />
+
+  <securityPolicy 
+      component="zope.app.securitypolicy.zopepolicy.ZopeSecurityPolicy" />
+
+  <unauthenticatedPrincipal id="zope.anybody"
+                            title="Unauthenticated User" />
+  <unauthenticatedGroup id="zope.Anybody"
+                        title="Unauthenticated Users" />
+  <authenticatedGroup id="zope.Authenticated"
+                      title="Authenticated Users" />
+  <everybodyGroup id="zope.Everybody"
+                  title="All Users" />
+  <principal id="zope.manager"
+             title="Manager"
+             login="grok"
+             password_manager="Plain Text"
+             password="grok"
+             />
+
+  <!-- Replace the following directive if you don't want public access -->
+  <grant permission="zope.View"
+         principal="zope.Anybody" />
+  <grant permission="zope.app.dublincore.view"
+         principal="zope.Anybody" />
+  
+  <role id="zope.Manager" title="Site Manager" />
+  <role id="zope.Member" title="Site Member" />
+  <grantAll role="zope.Manager" />
+  <grant role="zope.Manager"
+         principal="zope.manager" />
+
+</configure>


Property changes on: Sandbox/philikon/megrok.kiss/trunk/site.zcml
___________________________________________________________________
Name: svn:eol-style
   + native


Property changes on: Sandbox/philikon/megrok.kiss/trunk/src
___________________________________________________________________
Name: svn:ignore
   + megrok.kiss.egg-info


Added: Sandbox/philikon/megrok.kiss/trunk/src/megrok/__init__.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/src/megrok/__init__.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/src/megrok/__init__.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,3 @@
+# make this directory a namespace package
+import pkg_resources
+pkg_resources.declare_namespace('megrok')


Property changes on: Sandbox/philikon/megrok.kiss/trunk/src/megrok/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/KSSNOTES.txt
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/KSSNOTES.txt	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/KSSNOTES.txt	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,10 @@
+
+* SiteView shouldn't do the hook thing.
+
+* IAzaxView mandates render() which is not needed, but the commands
+  property is widely used
+
+* cancelRedirect needs to check for two redirect status codes
+
+
+depend on concatresources as an egg???


Property changes on: Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/KSSNOTES.txt
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/__init__.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/__init__.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/__init__.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1 @@
+from megrok.kiss.component import AjaxAction


Property changes on: Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/__init__.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/component.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/component.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/component.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,52 @@
+from zope.publisher.browser import BrowserPage
+from kss.core import KSSView
+from kss.core.pluginregistry import KSSPluginError
+
+# XXX for AjaxAction.url() method
+import urllib
+from zope import component
+from zope.traversing.browser.interfaces import IAbsoluteURL
+from zope.traversing.browser.absoluteurl import _safe as SAFE_URL_CHARACTERS
+
+class AjaxAction(KSSView, BrowserPage):
+
+    def __call__(self):
+        self.action()
+        return self.render()
+
+    def action(self):
+        raise NotImplementedError("AjaxAction subclasses should implement "
+                                  "the 'action' method.")
+
+    def __getattr__(self, name):
+        try:
+            return self.getCommandSet(name)
+        except KSSPluginError:
+            raise AttributeError(name)
+
+    # XXX warning, code duplication from grok.View
+
+    def url(self, obj=None, name=None):
+        # if the first argument is a string, that's the name. There should
+        # be no second argument
+        if isinstance(obj, basestring):
+            if name is not None:
+                raise TypeError(
+                    'url() takes either obj argument, obj, string arguments, '
+                    'or string argument')
+            name = obj
+            obj = None
+
+        if name is None and obj is None:
+            # create URL to view itself
+            obj = self
+        elif name is not None and obj is None:
+            # create URL to view on context
+            obj = self.context
+        url = component.getMultiAdapter((obj, self.request), IAbsoluteURL)()
+        if name is None:
+            # URL to obj itself
+            return url
+        # URL to view on obj
+        return url + '/' + urllib.quote(name.encode('utf-8'),
+                                        SAFE_URL_CHARACTERS)


Property changes on: Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/component.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/configure.zcml
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/configure.zcml	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/configure.zcml	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,6 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:grok="http://namespaces.zope.org/grok">
+  <include package="kss.core" file="meta.zcml" />
+  <include package="kss.core" />
+  <grok package="." xmlns="http://namespaces.zope.org/grok" />
+</configure>


Property changes on: Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/configure.zcml
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/grokker.py
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/grokker.py	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/grokker.py	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,57 @@
+from zope import component, interface
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.security.checker import NamesChecker, defineChecker
+
+import martian
+from martian import util
+from martian.error import GrokError
+
+from megrok.kiss.component import AjaxAction
+
+class KSSActionGrokker(martian.ClassGrokker):
+    component_class = AjaxAction
+
+    def grok(self, name, factory, context, module_info, templates):
+        factory_name = factory.__name__.lower()
+        view_context = util.determine_class_context(factory, context)
+        view_name = util.class_annotation(factory, 'grok.name', factory_name)
+
+        component.provideAdapter(factory,
+                                 adapts=(view_context, IDefaultBrowserLayer),
+                                 provides=interface.Interface,
+                                 name=view_name)
+
+
+        # XXX code duplication from grok.meta.ViewGrokker happening here!!!
+
+        # protect view, public by default
+        permissions = util.class_annotation(factory, 'grok.require', [])
+        if not permissions:
+            checker = NamesChecker(['__call__'])
+        elif len(permissions) > 1:
+            raise GrokError('grok.require was called multiple times in view '
+                            '%r. It may only be called once.' % factory,
+                            factory)
+        elif permissions[0] == 'zope.Public':
+            checker = NamesChecker(['__call__'])
+        else:
+            perm = permissions[0]
+            if component.queryUtility(IPermission, name=perm) is None:
+                raise GrokError('Undefined permission %r in view %r. Use '
+                                'grok.define_permission first.'
+                                % (perm, factory), factory)
+            checker = NamesChecker(['__call__'], permissions[0])
+
+        defineChecker(factory, checker)
+
+        # safety belt: make sure that the programmer didn't use
+        # @grok.require on any of the view's methods.
+        methods = util.methods_from_class(factory)
+        for method in methods:
+            if getattr(method, '__grok_require__', None) is not None:
+                raise GrokError('The @grok.require decorator is used for '
+                                'method %r in view %r. It may only be used '
+                                'for XML-RPC methods.'
+                                % (method.__name__, factory), factory)
+        return True
+


Property changes on: Sandbox/philikon/megrok.kiss/trunk/src/megrok/kiss/grokker.py
___________________________________________________________________
Name: svn:eol-style
   + native

Added: Sandbox/philikon/megrok.kiss/trunk/zope.conf
===================================================================
--- Sandbox/philikon/megrok.kiss/trunk/zope.conf	                        (rev 0)
+++ Sandbox/philikon/megrok.kiss/trunk/zope.conf	2007-08-25 22:35:07 UTC (rev 79271)
@@ -0,0 +1,38 @@
+# Identify the component configuration used to define the site:
+site-definition site.zcml
+
+<zodb>
+  # Standard Filestorage
+  <filestorage>
+    path var/Data.fs
+  </filestorage>
+
+# Uncomment this if you want to connect to a ZEO server instead:
+#  <zeoclient>
+#    server localhost:8100
+#    storage 1
+#    # ZEO client cache, in bytes
+#    cache-size 20MB
+#    # Uncomment to have a persistent disk cache
+#    #client zeo1
+#  </zeoclient>
+</zodb>
+
+<eventlog>
+  # This sets up logging to both a file and to standard output
+  # (STDOUT).  The "path" setting can be a relative or absolute
+  # filesystem path or the tokens STDOUT or STDERR.
+
+  <logfile>
+    path log/z3.log
+    formatter zope.exceptions.log.Formatter
+  </logfile>
+
+  <logfile>
+    path STDOUT
+    formatter zope.exceptions.log.Formatter
+  </logfile>
+</eventlog>
+
+# Uncomment this to switch on developer mode (e.g. for APIDoc)
+#devmode on



More information about the Checkins mailing list