[Zope3-Users] Re: worldcookery "Christmas Dinner"

Duncan McGreggor duncan.mcgreggor at gmail.com
Mon Oct 3 03:50:24 EDT 2005


On Oct 3, 2005, at 12:32 AM, Joel Moxley wrote:

> * RecipeFolder Views.  In a RecipeFolder page template file, how would
> you view both parameters on the parent RecipeFolder as well as
> specific child Recipes within the container?
>
> * RecipeFolder Controllers.  How would you access an external python
> method for compiling statistics on this container and then update the
> view?

I think for both of these, what you're looking for is the catalog. It 
might mean writing your own custom index, based on your needs... (but 
you should be able to at least prototype it with just the field and 
text indices that are a part of the catalog by default). If, with your 
content objects, you are storing or annotating the data you want to 
analyze, you'll just need to add indices in your site catalog for those 
schema fields/attributes.

For your first bullet item above... hmm, maybe catalog + checking for 
children? Never done anything directly with the children of a 
particular container before.

For the second one, I think just catalog should do the trick.

What I'd do is

1) create a class in browser (e.g., myproject.browser.stats.Stats) 
where in I write the catalog queries. I put mine in browser because I 
mentally associate my queries with displaying data with page templates. 
Arguably, they might be better the next level up, since data queries 
really should be agnostic as to the final medium (http, webdav, ftp, 
etc.). For every type of processed stats I would want, I'd write a 
method in the Stats class. As Alen and I discussed in a recent thread, 
perhaps something like

from zope.app.publisher.browser import BrowserView
from zope.app.catalog.interfaces import ICatalog
from zope.app import zapi

class Stats(BrowserView):
     def getParentAndChildStats(self):
         catalog = zapi.getUtility(ICatalog)
         results = catalog.searchResults(index_name_for_field=[some, 
list, of, criteria])
         # process your results
         # do child checks? efficiency issues? I'm sure there's a better 
way...

My queries are typically associated with a particular content type (as 
it sounds like yours will be... particularly RecipeFolder). So then I'd

2) add something like this to the browser/configure.zcml file:

     <browser:page
         for="myproject.containers.IRecipeFolder"
         name="index.html"
         template="recipefolderview.pt"
         class=".stats.Stats"
         permission="zope.Public" />

Then,

3) use "view/method_name" in your page templates to access the the 
Stats methods you wrote. Data presentation gets messy in HTML/ZPT, so I 
typically separate that out into a macro so I can keep my *view.pt 
files clean. You'd have something like this in your recipefolderview.pt 
(or macro that recipefolderview.pt calls):

<ul>
<tal:stats repeat="stat view/getParentAndChildStats">
   <!-- display stat and/or its attributes /-->
</tal:stats>

Hope that helps...

d



More information about the Zope3-users mailing list