ed colmar writes:
I've succesfully gotten the catalog to work (thanks everyone!), but in doing so, I've created a problem. Squishdot uses this code like this in order to add an item:
id=self.createId() # make a datestamp id msg=PromoterPost(id,title) msg=msg.__of__(self) # ??? self.setItem(id,msg) # set the item
This code is incompatible with the catalog. As far as I can tell because The catalog likes to see id's as strings, As far as I know the sources, ZCatalog expects its fields to be either simple objects (strings, numbers, dates, ...) or be callable with the result a simple object. but I don't think the object gets completely added to the zope fs either. What does that mean?
After changing the code that does the adding to the zope fs everything related to the catalog seems good. Here's the new code:
ob=PromoterPost(id,title) ob.id = id ob.title = title
self._setObject(id,ob) self.getCatalog().catalog_object(ob,id) I would expect that "_setObject" stores the association "id -> ob" somewhere. I assume, a Python dictionary is used for this purpose.
Squishdot probably uses a BTree instead, because is can handle a big number of content objects more efficiently than a Python dict.
So here's the problem, the methods that squishdot uses to locate sub-objects relies on a BTree() type method, called "data", and is used by a few methods like this:
def objectValues(self): """ return list of subobjects """ return map(lambda x, p=self: x.__of__(p), self.data.map(self.ids)) or
def is_local_user(self, thisuser): """ returns true with ID if user is a local user based on rev_id_list in squishdot """ rlist = map(None,self.ids) rlist = filter(lambda x,p=self : p.data[x].validated, rlist) rlist = filter(lambda x,p=self : p.data[x].meta_type == 'SRPersonPost', rlist) rlist = filter(lambda x,p=self,s=thisuser : p.data[x].title == s, rlist) return rlist
Neither return any results, becuase in the new code, the data object is not getting updated. Do I need to keep a record of all the ids like squishdot does, or can I leave that up to zope? Use the BTree, if you want to use major parts of Squishdot.
Otherwise, you must use methods from the same place you have taken "_setObject" from. I am sure, the class will have "objectValues" and "objectIds", too. And I expect, there will be some form of "_getObject" (probably named differently) to access the object corresponding to an "id". Have a look at the Object Reference in the Zope documentation. Dieter
It seems like there should be an easier way than "self.data" to do this...
Any ideas?