[PEAK] Example using sitemap.xml and bulletins

Tiago Cogumbreiro cogumbreiro at gmail.com
Sat Mar 26 14:58:26 EST 2005

On Sat, 26 Mar 2005 14:30:57 -0500, Phillip J. Eby
<pje at telecommunity.com> wrote:
> 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>
> ></location>
> >
> >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()"/>
>     </location>
>     <content type="model.Bulletin">
>        etc.
> 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'
That would be very interesting! Looking at the BulletinsApp it does
make you think that it could all be done in the configuration part,
giving more flexibility.

> 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")
What about the DDL?

> 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)"/>
>          etc.
Very clean and straight forward.

> >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
> >index_html.
> 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.
I see...

> >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.
Nice :)

> 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't wait for it.

> >Can I embedd views inside of each other?
> I don't understand the question.
I was trying to ask if I could could reuse views/templates inside each
other. I was thinking in terms of the widget analogy. I'm asking this
because I still didn't get the peak.web's way of working. But maybe
this is not needed at all, since I didn't got how does peak.web really

Tiago Cogumbreiro <cogumbreiro at users.sf.net>


More information about the PEAK mailing list