[Zope] Re: A Quick Event-based Cataloging How-to for Zope 2

whit d.w.morriss at gmail.com
Thu Sep 28 10:56:44 EDT 2006


thanks Chris!

-w

Chris Withers wrote:
> Hi All,
> 
> Just been playing with this and found it remarkably easy, so thought I'd 
> pass it on. If anyone can think of a better place than the mailing list 
> archives for this, please let me know!
> 
> Anyway, so I'm building a Zope 2 app where I need to index objects that 
> are not catalog aware when they're added, modified or removed. To make 
> things harder, this also needs to work via WebDAV.
> 
> OK, so here's the solution:
> 
> 1. Create yourself a python module called subscribers.py and put it on 
> your python path, containing the following:
> 
> from Acquisition import aq_base
> from zope.interface import Interface
> 
> class ICatalogAware(Interface): pass
> 
> def catalog(object,event):
>     if aq_base(object) is object:
>         # ObjectModified can get emitted during creation,
>         # before the object has any acquisition context
>         return
>     object.getPhysicalRoot().unrestrictedTraverse(
>         '/catalog'
>     ).catalog_object(object)
> 
> def uncatalog(object,event):
>     object.getPhysicalRoot().unrestrictedTraverse(
>         '/catalog'
>     ).uncatalog_object('/'.join(object.getPhysicalPath()))
> 
> 2. Slap the ICatalogAware marker interface on any classes you want to 
> have indexed. Here's an example for the good old File object. Put the 
> following in your site.zcml:
> 
> <class class="OFS.Image.File">
> <implements interface="subscribers.ICatalogAware"/>
> </class>
> 
> 3. Finally, wire up the events so that files get indexed when they're 
> created, modified or removed, again by adding the following to site.zcml:
> 
>   <subscriber
>       handler="subscribers.catalog"
>       for="ICatalogAware
>            zope.app.container.contained.ObjectAddedEvent"
>       />
> 
>   <subscriber
>       handler="subscribers.catalog"
>       for="ICatalogAware
>            zope.app.container.contained.ObjectModifiedEvent"
>       />
> 
>   <subscriber
>       handler="subscribers.uncatalog"
>       for="ICatalogAware
>            zope.app.container.contained.ObjectRemovedEvent"
>       />
> 
> 4. Okay, sadly you do need to get do some patching if you want changes 
> to the file to result in recataloging :-/ Here's a diff:
> 
> --- Image.py.original   2006-09-26 16:32:20.759375000 +0100
> +++ Image.py    2006-09-26 16:33:11.384375000 +0100
> @@ -33,6 +33,8 @@
>  from ZPublisher.HTTPRequest import FileUpload
>  from ZPublisher.Iterators import filestream_iterator
>  from zExceptions import Redirect
> +from zope.event import notify
> +from zope.app.container.contained import ObjectModifiedEvent
>  from cgi import escape
>  import transaction
> 
> @@ -437,6 +439,7 @@
>          self.ZCacheable_invalidate()
>          self.ZCacheable_set(None)
>          self.http__refreshEtag()
> +        notify(ObjectModifiedEvent(self))
> 
>      def manage_edit(self, title, content_type, precondition='',
>                      filedata=None, REQUEST=None):
> 
> Okay, well, hope this helps someone :-)
> 
> Chris
> 



More information about the Zope mailing list