<?xml version="1.0" encoding="UTF-8"?>

<rss version='2.0'
     xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule">
    <channel>
        <!-- This XML Feed shows details for the page Planet Zope -->
        <creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.5/
          </creativeCommons:license>
        <title>Planet Zope</title>
        <description>&lt;p&gt;Zope related news&lt;/p&gt;
</description>
                <category>planet</category>

        <pubDate>Sun, 03 Jul 2005 06:46:07 -0700</pubDate>
        <lastBuildDate>Wed, 06 Jul 2005 23:57:48 -0700</lastBuildDate>
            
        <item>
            <title>Repoze Presentation at ZPUG-DC Tuesday September 2, 2008</title>
            <link>http://swik.net/Zope/Planet+Zope/Repoze+Presentation+at+ZPUG-DC+Tuesday+September+2%2C+2008/cdy6y</link>
            <description>
Python web
framework at a meeting of the Washington DC Zope and Python User&#039;s
Group on Tuesday, September 2 2008 in the Radio Free Asia
boardroom
  </description>
            
            <pubDate>Sun, 07 Sep 2008 09:57:41 -0700</pubDate>
        </item>
            
        <item>
            <title>Installing Deliverance</title>
            <link>http://swik.net/Zope/Planet+Zope/Installing+Deliverance/cdy6x</link>
            <description>
Deliverance is a cool tool, that makes it possible to give web based software a new skin.works
  </description>
            
            <pubDate>Sun, 07 Sep 2008 09:57:41 -0700</pubDate>
        </item>
            
        <item>
            <title>New Blogging Pastures</title>
            <link>http://swik.net/Zope/Planet+Zope/New+Blogging+Pastures/cdy6w</link>
            <description>
So head over to . Gods and time willing, I&#039;ll get around to knocking out my tech thoughts again on topics such as:
  </description>
            
            <pubDate>Sun, 07 Sep 2008 09:57:41 -0700</pubDate>
        </item>
            
        <item>
            <title>XML configuration vs wiring</title>
            <link>http://swik.net/Zope/Planet+Zope/XML+configuration+vs+wiring/cdy6v</link>
            <description>
Lessons from Java and Zope
  </description>
            
            <pubDate>Sun, 07 Sep 2008 09:57:41 -0700</pubDate>
        </item>
            
        <item>
            <title>More on repoze.urispace</title>
            <link>http://swik.net/Zope/Planet+Zope/More+on+repoze.urispace/cdy6u</link>
            <description>
I blogged yesterday about the fact that I had docs online
 for the repoze.urispace package, but didn&#039;t do much to motivate
 readers&#039; interest:  repoze.urispace should be interesting if you have
 an application which needs policies which vary based on &quot;where&quot; in
 the site the request is addressed.  Examples might include:  fine-
 grained security, theme selection, caching policies, etc.
  </description>
            
            <pubDate>Sun, 07 Sep 2008 09:57:41 -0700</pubDate>
        </item>
            
        <item>
            <title>Helping the ZCML-Allergic</title>
            <link>http://swik.net/Zope/Planet+Zope/Helping+the+ZCML-Allergic/cdy6t</link>
            <description>
OK.  I&#039;ll pander to the ZCML-allergic crowd by making it possible to configure repoze.bfg applications without writing any ZCML.
  </description>
            
            <pubDate>Sun, 07 Sep 2008 09:57:41 -0700</pubDate>
        </item>
            
        <item>
            <title>My September schedule is empty!</title>
            <link>http://swik.net/Zope/Planet+Zope/My+September+schedule+is+empty%21/cdy6s</link>
            <description>

  </description>
            
            <pubDate>Sun, 07 Sep 2008 09:57:41 -0700</pubDate>
        </item>
            
        <item>
            <title>collective.flowplayer</title>
            <link>http://swik.net/Zope/Planet+Zope/collective.flowplayer/cdy6r</link>
            <description>
Hot off the presses - a video/audio player for Plone
  </description>
            
            <pubDate>Sun, 07 Sep 2008 09:57:41 -0700</pubDate>
        </item>
            
        <item>
            <title>One Month To Plone Conference 2008</title>
            <link>http://swik.net/Zope/Planet+Zope/One+Month+To+Plone+Conference+2008/cdy6q</link>
            <description>
Make your plans now!
  </description>
            
            <pubDate>Sun, 07 Sep 2008 09:57:41 -0700</pubDate>
        </item>
            
        <item>
            <title>repoze.bfg.viewgroup (&quot;content provider&quot;-like Thingies for repoze.bfg)</title>
            <link>http://swik.net/Zope/Planet+Zope/repoze.bfg.viewgroup+%28%22content+provider%22-like+Thingies+for+repoze.bfg%29/cdcco</link>
            <description>
Although I&#039;m not much of a fan of the concept of Zope 3 content providers (aka &quot;viewlets&quot; and &quot;viewlet managers&quot;), I&#039;ve implemented something a lot like them for repoze.bfg named &quot;repoze.bfg.viewgroup&quot;.
  </description>
            
            <pubDate>Mon, 01 Sep 2008 00:52:26 -0700</pubDate>
        </item>
            
        <item>
            <title>Docs online for new repoze.urispace package</title>
            <link>http://swik.net/Zope/Planet+Zope/Docs+online+for+new+repoze.urispace+package/cc9ae</link>
            <description>
I have uploaded Sphinxified documentation for repoze.urispace, a
library package which implements most of the W3C URISpace spec
for use in WSGI middleware.  I&#039;m planning to use it to select
themes and rulesets for Deliverance based on the URI;  other uses
might include setting caching headers, or doing some flavor of
&quot;declarative security&quot; in middleware.
  </description>
            
            <pubDate>Sat, 30 Aug 2008 20:52:03 -0700</pubDate>
        </item>
            
        <item>
            <title>Grok-by-Example: Wiki</title>
            <link>http://swik.net/Zope/Planet+Zope/Grok-by-Example%3A+Wiki/cc7l9</link>
            <description>
install_requires=[&#039;setuptools&#039;,
                  &#039;grok&#039;,
                  ...
                  &#039;megrok.tinymce&#039;,
                  ],&lt;p&gt;
&amp;lt;script type=&quot;text/javascript&quot;
  tal:attributes=&quot;src context/++resource++TinyMCE/tiny_mce.js&quot;&gt;&amp;lt;/script&gt;&lt;p&gt;
GAE uses the webapp.WSGIApplication and already configures the URL dispatching as a wildcard pattern:&lt;p&gt;
&lt;p&gt;
class WikiPage(grok.Application, grok.Container):
    ...
    def traverse(self, page_name=default_page_name):
        ...&lt;p&gt;

While GAE webapp.RequestHandler classes understand HTTP methods and dispatch accordingly, Grok uses grok.View classes that &amp;#8216;render&amp;#8217; the representation of the current context object.&lt;p&gt;
Here both frameworks use templating to render the context object and return the result.&lt;p&gt;
class BaseRequestHandler(webapp.RequestHandler):
    def generate(self, template_name, template_values={}):
        ...
        self.response.out.write(template.render(path, values, debug=_DEBUG))&lt;p&gt;

In this example GAE uses the low-level &amp;#8216;datastore&amp;#8217; API to store and retrieve Page objects to and from the appengine datastore:
def load(name):
    query = datastore.Query(&#039;Page&#039;)
    ...&lt;p&gt;
def save(self):
    datastore.Put(entity)&lt;p&gt;

def dc(self):
    return IZopeDublinCore(self.context)&lt;p&gt;
GAE uses the appengine &amp;#8216;users&amp;#8217; API to handle the posting of new or editing existing wiki pages. The user must be logged in with her google account:
def post(self, page_name):
    if not users.get_current_user():
        self.redirect(users.create_login_url(self.request.uri))
    ...&lt;p&gt;
class WikiPage(grok.Application, grok.Container):
    grok.local_utility(PluggableAuthentication, IAuthentication,
                       setup=setup_pau_principal)&lt;p&gt;
&lt;p&gt;
class PermissionEditPage(grok.Permission):
    grok.name(&#039;wiki.EditPage&#039;)&lt;p&gt;
class PermissionAddPage(grok.Permission):
    grok.name(&#039;wiki.AddPage&#039;)&lt;p&gt;
permission_mngr = IPrincipalPermissionManager(grok.getSite())
permission_mngr.grantPermissionToPrincipal(
   &#039;wiki.AddPage&#039;, principals.prefix + login)
permission_mngr.grantPermissionToPrincipal(
   &#039;wiki.EditPage&#039;, principals.prefix + login)&lt;p&gt;
class Login(Master):
    def update(self, login_submit=None):
        ...&lt;p&gt;
Before returning the rendered Page (@@index view) to the user, the page content gets wikified. In our example a list of transformations is applied to the &amp;#8216;content&amp;#8217; by adapting the view object itself:
class Index(Master):&lt;p&gt;
    def wikified_content(self):
        self.content = self.context.content
        ...&lt;p&gt;
        transforms = [
          &#039;wiki.AutoLink&#039;,
          &#039;wiki.ListOfPages&#039;,
          &#039;wiki.WikiWords&#039;,
        ]&lt;p&gt;
        for transform in transforms:
            self.content = getAdapter(self, ITransform, transform).run()
        return self.content&lt;p&gt;
class ITransform(Interface):
    pass&lt;p&gt;
class WikiWords(grok.Adapter):
    grok.implements(ITransform)
    grok.name(&#039;wiki.WikiWords&#039;)
    grok.context(grok.View)
    ...&lt;p&gt;
Several actions return a feedback message to the user which is displayed above the content on the next response page.&lt;p&gt;

Porting this application took quite some time (about 1 day), mostly because of implementing the user management (again) and getting megrok.tinymce working.
The wiki app is usable as is and also works fine when used inside an existing grok application. Transformation/Wikification of page contents through adapters could easily be made into a plugin-like configuration (using a distinct admin form). Also the renderer (TinyMCE and HTML) could be pluggable replaced by a RestructuredText based engine.
  </description>
            
            <pubDate>Sat, 30 Aug 2008 04:51:55 -0700</pubDate>
        </item>
            
        <item>
            <title>repoze.bfg incompatibility in 0.3.4</title>
            <link>http://swik.net/Zope/Planet+Zope/repoze.bfg+incompatibility+in+0.3.4/cc3ol</link>
            <description>
I&#039;ve just released repoze.bfg 0.3.4, which contains a backwards
incompatible change (the first since 0.1).&lt;p&gt;
&lt;p&gt;

  - Make ``repoze.bfg`` a namespace package so we can allow folks to
    create subpackages (e.g. ``repoze.bfg.otherthing``) within
    separate eggs.  This is a backwards incompatible change which
    makes it impossible to import &quot;make_app&quot; and &quot;get_options&quot; from
    the ``repoze.bfg`` module directly.  This change will break all
    existing apps generated by the paster code generator.  Instead,
    you need to import these functions as
    ``repoze.bfg.router:make_app`` and
    ``repoze.bfg.registry:get_options``, respectively.  Sorry folks,
    it has to be done now or never, and definitely better now.
  </description>
            
            <pubDate>Fri, 29 Aug 2008 02:52:29 -0700</pubDate>
        </item>
            
        <item>
            <title>Apply for Plone Foundation Membership Now</title>
            <link>http://swik.net/Zope/Planet+Zope/Apply+for+Plone+Foundation+Membership+Now/cczdx</link>
            <description>
File your application for Plone Foundation membership now if you&#039;d like it considered in time for the Plone Conference.
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:23 -0700</pubDate>
        </item>
            
        <item>
            <title>Carlos&#039; repoze.shootout In Action</title>
            <link>http://swik.net/Zope/Planet+Zope/Carlos%27+repoze.shootout+In+Action/cczdw</link>
            <description>
Carlos de la Guardia came up with an example &quot;idea competition&quot;
application named  a week or two ago.  You
can now see it &quot;in action&quot; at .
It&#039;s purty these days.&lt;p&gt;
&lt;p&gt;
&lt;p&gt;
 sample
application which currently demonstrates ,
integration with ,
integration with the 
theming engine and integration with the  WSGI
authentication system.&lt;p&gt;
&lt;p&gt;
&lt;p&gt;

  svn co http://svn.repoze.org/repoze.shootout/trunk repoze.shootout
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:23 -0700</pubDate>
        </item>
            
        <item>
            <title>Grok-by-Example</title>
            <link>http://swik.net/Zope/Planet+Zope/Grok-by-Example/cczdv</link>
            <description>
Motivation is that you can look at the original source and the grok code side-by-side and deduce from both. Source is available from
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:22 -0700</pubDate>
        </item>
            
        <item>
            <title>Repoze.bfg App Development Screencast</title>
            <link>http://swik.net/Zope/Planet+Zope/Repoze.bfg+App+Development+Screencast/cczdu</link>
            <description>
A screencast demonstrating the development of an application under repoze.bfg.
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:22 -0700</pubDate>
        </item>
            
        <item>
            <title>Cleaning up after the party</title>
            <link>http://swik.net/Zope/Planet+Zope/Cleaning+up+after+the+party/cczdt</link>
            <description>
Views are a mess in Zope! There&#039;s quite a lot of magic and too much functionality outside of Python. This is implemented by a number of ZCML directives that support various useful and not so useful use-cases. Since these days it&#039;s all about putting together frameworks that get all the good bits and pieces from the Zope libraries and leave the rest,  it&#039;s up to a framework to do away with this mess. But we can&#039;t just replace it with nothing.In the beginning of this piece I mentioned that templates would pull in additional API as needed. These would be adapters on context and request (like views), but should not provide any rendering capabilities as such. They are simply a view on some data source. We might use the terms &quot;data view&quot; and &quot;browser view&quot; to make this distinction.
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:22 -0700</pubDate>
        </item>
            
        <item>
            <title>Grok-by-Example: Guestbook</title>
            <link>http://swik.net/Zope/Planet+Zope/Grok-by-Example%3A+Guestbook/cczds</link>
            <description>
Both frameworks use the &amp;#8216;Application&amp;#8217; concept. Grok subclasses from both grok.Application and grok.Container:
    class Application(grok.Application, grok.Container):
        pass&lt;p&gt;

    application = webapp.WSGIApplication([
                        (&#039;/&#039;, MainPage),
                        (&#039;/sign&#039;, Guestbook)
                        ], debug=True)&lt;p&gt;

The application accepts 2 possible requests: the default view and the action to post the form contents to.&lt;p&gt;
    class MainPage(grok.View):
        grok.context(Application)
        grok.name(&#039;index&#039;)
        ...&lt;p&gt;
    class MainPage(webapp.RequestHandler):
        def get(self):
            ...&lt;p&gt;
Grok has a &amp;#8216;grok.REST&amp;#8217; class that supports HTTP method dispatching, but it is not used in the example:
    class Guestbook(grok.View):
        ...
        def render(self):
            if self.request.method.upper() != &#039;POST&#039;:
                return self.redirect(self.application_url())
            ...&lt;p&gt;
    class Guestbook(webapp.RequestHandler):
        def post(self):
            ...&lt;p&gt;

Grok output is collected and returned from the view &amp;#8216;render&amp;#8217; method:
    def render(self):
        out=[&#039;&amp;lt;html&gt;&amp;lt;body&gt;&#039;]
        ...
        return &#039;&#039;.join(out)&lt;p&gt;
&lt;p&gt;
Grok content objects are subclassed from grok.Model. Properties are defined in an Interface class which the object implements:
    class IGreeting(Interface):
        author = schema.Field(title=u&#039;Author&#039;)
        ...&lt;p&gt;
    class Greeting(grok.Model):
        grok.implements(IGreeting)&lt;p&gt;
    class Greeting(db.Model):
      author = db.UserProperty()&lt;p&gt;
Grok content objects are instantiated, modified and finally inserted into a container (which here is the application object itself). A local-unique name must be provided on insertion. Existing objects must be deleted and reinserted. Properties are not validated by default:
    id=str(uuid.uuid4())
    self.context[id]=greeting&lt;p&gt;
&lt;p&gt;
Grok uses python to locate objects and create a result listing:
    greetings=[(x.date, x) for x in self.context.values()]
    greetings=list(reversed(sorted(greetings)))
    for date,greeting in greetings[:10]:
        ...&lt;p&gt;
    greetings = db.GqlQuery(&quot;SELECT * &quot;
                            &quot;FROM Greeting &quot;
                            &quot;ORDER BY date DESC LIMIT 10&quot;)
    for greeting in greetings:
        ...&lt;p&gt;
Grok has no fixed &amp;#8216;user&amp;#8217; API, user management depends on loaded authentication plugins:
    greeting.author = self.request.principal
    ...
    if IUnauthenticatedPrincipal.providedBy(greeting.author):
        ...	&lt;p&gt;
    if users.get_current_user():
        greeting.author = users.get_current_user()
    ...
    if greeting.author:
        ...&lt;p&gt;
Grok is a long-running process. Requests are processed, the object graph is traversed to a final context object and the result of calling the view on the context object is returned.&lt;p&gt;
    def main():
        wsgiref.handlers.CGIHandler().run(application)&lt;p&gt;
The number of lines of code is about the same. For this small example GAE is simpler with respect to the number of APIs and concepts used and richer with respect to debugging and datasecurity.
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:21 -0700</pubDate>
        </item>
            
        <item>
            <title>World Plone Day reaches five continents</title>
            <link>http://swik.net/Zope/Planet+Zope/World+Plone+Day+reaches+five+continents/cczdr</link>
            <description>
More than 30 members of the Plone Community in 22 countries on five continents are promoting Plone around the world on November 7th 2008. Learn how you can help!
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:21 -0700</pubDate>
        </item>
            
        <item>
            <title>Silva 2.1 Released</title>
            <link>http://swik.net/Zope/Planet+Zope/Silva+2.1+Released/cczdo</link>
            <description>
Infrae is pleased to announce the alpha release of Silva 2.1. This release adds a range of features for both Author/Editors and Site Managers, as well as performance and technical improvements such as functional tests.
  </description>
            
            <pubDate>Thu, 28 Aug 2008 17:57:21 -0700</pubDate>
        </item>
            
    </channel>
</rss>
