
I'm trying to replicate the functionality of http://eyes.puzzling.org/ (currently powered by a bunch of Python CGI scripts running on an Apache webserver) in Woven. eyes.puzzling.org is a kind of a minimalist blog, with pages that list recent entries, the authors of the entries, and so on. At the moment, I'm trying to replicate the authors functionality (2 different sets of pages: one which lists all the authors and links to their individual page; and one for each author, which lists their individual articles. The /authors/ page (listing all the authors and linking to their individual page) is generated by objects of the AuthorsPage subclass. For each author, I would like to generate a /author/AUTHORNAME/ page which lists their individual entries. I am trying to create these pages from AuthorsPage's getDynamicChild method. The idea is to pass the already constructed submodel -- a dictionary representing the individual author -- to the IndividualPage object I will construct to represent the individual author's page, rather than have IndividualPage make its own database query for that information. At present, as you can see below, I'm using getSubmodel to retrieve the (dictionary) submodel associated with a particular author. However, this returns a twisted.web.woven.model.DeferredWrapper instance, rather than the dictionary itself. Should I make IndividualPage add callbacks to the DeferredWrapper, or am I missing something crucial about retrieving submodels or is this model more fundamentally incorrect? For example, should I be passing submodels around like that at all? If so, is there a higher level call I should make to access the submodel? The two classes following are the AuthorsPage and IndividualPage classes described above. Thanks, -Mary class IndividualPage(page.Page): # getTemplate munges two template files together template = getTemplate("/home/mary/cvs/Projects/Eye/author-page.html") def initialize(self, *args, **kwargs): self.amodel = kwargs['amodel'] def wmfactory_author(self, request): return self.amodel['author'] class AuthorsPage(page.Page): template = getTemplate("/home/mary/cvs/Projects/Eye/authors-page.html") def initialize(self, *args, **kwargs): self.dbpool = kwargs['pool'] self.authors = None def wmfactory_authors(self, request): query = self.dbpool.runQuery("SELECT DISTINCT posts.name, link, password FROM authors, posts WHERE authors.name = posts.name ORDER BY name;") query.addCallback(self.makeAuthors) return query def makeAuthors(self, rows): ''' Construct self.authors, return them as a list @return a list of author dictionaries ''' authors = {} for row in rows: (name, link, password) = row authors[name] = { 'name' : name, 'link' : link, 'password' : password } return authors def wvfactory_alink(self, request, node, model): return AuthorLink(model) def getDynamicChild(self, name, request): return IndividualPage(amodel=self.getSubmodel('authors')[name]))