Jim, Paul, thanks for your comments - Jim Fulton <jim.fulton@digicool.com> writes:
By "my find function" do you mean using the find tab or do you mean something that you have written yourself? I'm a bit surprised that this would take so long, although I can't say I've tried an application like the
I mean an external method which I based on PrincipiaFind(). It's appended below.
It makes me wonder if I need "ExternalFile" and "ExternalFolder" objects,
Do you have reason to think that this would make things faster?
No, beyond my gut feelings about how long a filesystem "find" of 179 files should take. I thought that perhaps by stuffing large data files into the zbase, I am using the machinery inefficiently. Thanks also for the comments on the file-less method product. I see someone else asked about it too. I'll put that aside for now. The other problem I'm having is how to filter the search results based on user permissions. My best guess, after much wailing and gnashing of teeth, is: if (REQUEST.AUTHENTICATED_USER.allowed(ob,ob.aq_acquire('__roles__'))) but I don't see roles getting acquired like I would expect. Any light on *this* subject would be most helpful! Regards, -Simon def Find(self, obj, obj_searchterm=None, obj_days=0, search_sub=0, REQUEST=None, result=None, pre=''): """find function, based on PrincipiaFind""" if result is None: result=[] try: obj_days = int(obj_days) except: obj_days = 0 base=obj if hasattr(obj, 'aq_base'): base=obj.aq_base if not hasattr(base, 'objectItems'): return result try: items=base.objectItems() except: return result try: add_result=result.append except: raise AttributeError, `result` for id, ob in items: if pre: p="%s/%s" % (pre, id) else: p=id dflag=0 if hasattr(ob, '_p_changed') and (ob._p_changed == None): dflag=1 if hasattr(ob, 'aq_base'): bs=ob.aq_base if ( # it's a file, (hasattr(bs, 'meta_type') and bs.meta_type == 'File') and # we have access, # see if we have permission to access this object # do I know what I'm doing (REQUEST.AUTHENTICATED_USER.allowed(ob,ob.aq_acquire('__roles__'))) and # the text matches, (not obj_searchterm or find(lower(absattr(bs.id)), lower(obj_searchterm)) >= 0 or find(lower(absattr(bs.title)), lower(obj_searchterm)) >= 0) and # and the age matches (not obj_days or (hasattr(ob, '_p_mtime') and ((DateTime().earliestTime() - DateTime(ob._p_mtime).earliestTime()) < obj_days))) ): add_result((p, ob)) # then add it to the results dflag=0 if search_sub and hasattr(bs, 'objectItems'): Find(self, ob, obj_searchterm, obj_days, search_sub, REQUEST, result, p) if dflag: ob._p_deactivate() return result