ooo, this has been an annoying one to track down. When ZCatalog's ZopeFindAndApply is called, it looks at container.aq_base.objectItems() to list the objects in a container, then indexes them. This means that if you're indexing an attribute that's acquired from higher up the chain than the immediate enclosing folder, it won't get picked up. It _will_ when you call manage_catalogReIndex, as it does a resolve_url of the object. This caused much confusion for me, as the Catalog bug I was seeing would be there sometimes and not others, depending on whether a reindex had happened. Two possible fixes here: First is to force a resolve_url before indexing. Second is to index the object in the initial acquisition context (and pass the correct object to the recursive call) Not sure which is the better fix - both work for me. The second is probably cheaper, and "more correct" Note that there's another fix needed for this to work that's in the collector - there's a call to 'find' that should be 'string.find' (line numbers may be off - there's other magic stuff in my local copy.) Can anyone else confirm that this is an appropriate approach? Or is ZopeFindAndApply meant to act this way? ta, Anthony RCS file: /cvs-repository/Zope2/lib/python/Products/ZCatalog/ZCatalog.py,v retrieving revision 1.42 diff -u -r1.42 ZCatalog.py --- ZCatalog.py 1999/11/05 18:58:54 1.42 +++ ZCatalog.py 1999/12/16 07:39:38 @@ -533,7 +559,14 @@ ) ): if apply_func: - apply_func(ob, (apply_path+'/'+p)) + # needed because earlier we retrieved + # container.aq_base.objectItems, otherwise + # we don't see anything acquired from more + # than one acquisition level higher + if REQUEST: + ptmp = apply_path+'/'+p + ob = self.resolve_url(ptmp, REQUEST) + apply_func(ob, (ptmp)) else: add_result((p, ob)) dflag=0 RCS file: /cvs-repository/Zope2/lib/python/Products/ZCatalog/ZCatalog.py,v retrieving revision 1.42 diff -u -r1.42 ZCatalog.py --- ZCatalog.py 1999/11/05 18:58:54 1.42 +++ ZCatalog.py 1999/12/16 07:39:38 @@ -532,14 +558,16 @@ role_match(ob, obj_permission, obj_roles) ) ): + ob_real = getattr(obj, id) if apply_func: - apply_func(ob, (apply_path+'/'+p)) + apply_func(ob_real, (apply_path+'/'+p)) else: - add_result((p, ob)) + add_result((p, ob_real)) dflag=0 if search_sub and hasattr(bs, 'objectItems'): - self.ZopeFindAndApply(ob, obj_ids, obj_metatypes, + ob_real = getattr(obj, id) + self.ZopeFindAndApply(ob_real, obj_ids, obj_metatypes, obj_searchterm, obj_expr, obj_mtime, obj_mspec, obj_permission, obj_roles,