[PEAK] Example using sitemap.xml and bulletins

Phillip J. Eby pje at telecommunity.com
Sat Mar 26 14:30:57 EST 2005

At 08:46 PM 3/25/05 -0100, Tiago Cogumbreiro wrote:
>I've been playing with sitemap a little further and actually managed
>to make it show something. I've used an example analogical to
>bulletins, yet it's not the same. However i'm going to "translate" the
>sitemap in order to make it simillar for simplicity's sake:
><location id="root" config="bulletins">
>         <import module="bulletins.app"/>
>         <import module="bulletins.model"/>
>         <import module="bulletins.storage"/>
>         <container object="bulletins.app.BulletinsApp()"/>
>         <content type="bulletins.model.Bulletin">
>                 <allow attributes="fullText"/>
>                 <view name="index_html" 
> resource="bulletins.templates/bulletin"/>
>         </content>
>         <content type="bulletin.storage.BulletinDM">
>                 <view name="index_html" 
> resource="bulletin.templates/list_bulletins"/>
>         </content>
>         <content type="bulletins.app.BulletinsApp">
>                 <allow attributes="Bulletins"/>
>                 <view name="index_html" resource="imobil.templates/main"/>
>         </content>
>This sitemap is supposed to create a /Bulletins location which allows
>/Bulletins/<ID> to retrieve a bulletins.model.Bulletin, using the
>bulletin.templates/bulletin template.

You need something more like this (untested):

<location config="bulletins">
    <import module="bulletins.model" />
    <import module="bulletins.storage" />

    <location name="Bulletins" />
        <container object="storage.BulletinDM()"/>

    <content type="model.Bulletin">

The main problem with getting this to work properly is that the bulletins 
application's structure is a bit off.  Looking at it, it's clear to me that 
the App object doesn't really belong there; it's a holdover from when I 
thought peak.web was going to work differently.

Really, everything that's in the BulletinsApp class should actually be 
configured in bulletins.ini, and then just referenced from BulletinsCmd 
where needed.  But there are some problems with doing that, because there 
currently isn't an "obvious" way to register a DMFor() using an .ini.

What I think I need to do to make this work well is:

1) Have a 'component="key"' option for <container>, so that you can specify 
an expression like 'storage.DMFor(sometype)', or 'PropertyName("foo.bar")', 
etc.  This would do a 'lookupComponent()' on the location object so you can 
obtain something you need.

2) Have a cleaner way to register DMFor() objects in an .ini  (maybe using 
a "[Data Managers]" section)

3) Refactor the bulletins example to remove BulletinsApp and do all the 
configuration in bulletins.ini, with something like:

     [Data Managers]
     bulletins.model.Bulletin = 'bulletins.storage:BulletinDM'
     bulletins.model.Category = 'bulletins.storage:CategoryDM'
     bulletins.model.User     = 'bulletins.storage:UserDM'

As part of this, I'd also get rid of the 'bulletins.databaseURL' property 
and change the 'bulletins' start file to read something like:

     [Named Services]
     bulletins.db = naming.LinkRef("sqlite:///tmp/bulletins.db")

And then I'd add 'db' and other bindings to BulletinsCmd, so that it 
wouldn't need BulletinsApp.  Finally, the sitemap would be able to refer to 
DM's using e.g.:

     <location name="Bulletins">
         <container component="storage.DMFor(model.Bulletin)"/>

>The views inside the BulletinDM are ignored, thus the resource
>'bulletin.templates/list_bulletins' is never accessed. This happens
>because it tries to do a __getitem__ on the object first, so it sends
>an error message because it tries to access the object with an id

If you change the 'peak.web.defaultMethod' configuration to '@@index_html', 
or if you manually go to the URL '/Bulletins/@@index_html' this should fix 
it.  The '@@' means to look only at views, not items.  It occurs to me that 
this should probably be the default configuration for the index_html 
method, except that then objects with an 'index_html()' method would not 
work.  I probably won't be able to fix this properly until peak.web moves 
to using generic functions.

>oid's related to sql are usually int's, but they (the web controller)
>send a string. How can one intercept this procedure? Currently I'm
>converting any argument to an int inside the DM, but this feels like
>an hack.

Yes, it does.  The <container> tag probably needs an optional 'key_type' 
attribute to let you define a conversion function.

It looks like I need to make quite a few changes to make this conveniently 
usable.  That is, although it's *possible* right now to define a sitemap 
for the bulletins application, you have to do a lot of Python coding inside 
of modules, and it's pretty obscure coding at that.  I'll try to take some 
time this weekend to fix these things up a bit, and create a working 
sitemap for the bulletins example.  :(

>Can I embedd views inside of each other?

I don't understand the question.

More information about the PEAK mailing list