[Zope3-dev] Heads up: major event changes

Jim Fulton jim at zope.com
Thu May 27 05:44:54 EDT 2004


This morning I'll be checking in a major simplification of Zope 3's event
system, http://dev.zope.org/Zope/SimplifyEventSystem.

The major change for application developers:

1. Any object can be an event

2. You publish events like this:

      from zope.event import notify

      ...

      notify(event)

    Calling zope.app.event.publish still works, but generates a
    deprecation warning.

3. Event handlers are now defined as functions.  For example, before:

       from datetime import datetime
       from zope.app.dublincore.interfaces import IZopeDublinCore
       from zope.app.event.interfaces import ISubscriber
       from zope.interface import implements

       class DCTimeAnnotatorBase:
           """Update Dublin-Core time property
           """
           implements(ISubscriber)

           def notify(self, event):
               dc = IZopeDublinCore(event.object, None)
               if dc is not None:
                   self.annotate(dc)

           def annotate(self, dc):
               raise RuntimeError, 'annotate not implemented'


       class ModifiedAnnotatorClass(DCTimeAnnotatorBase):
           """Updates DC modified when an object is modified."""

           def annotate(self, dc):
               dc.modified = datetime.utcnow()


       class CreatedAnnotatorClass(DCTimeAnnotatorBase):
           """Sets DC created and modified when an object is created."""

           def annotate(self, dc):
               now = datetime.utcnow()
               dc.created = now
               dc.modified = now


       ModifiedAnnotator = ModifiedAnnotatorClass()
       CreatedAnnotator = CreatedAnnotatorClass()

    After:

       from datetime import datetime
       from zope.app.dublincore.interfaces import IZopeDublinCore

       def ModifiedAnnotator(event):
           dc = IZopeDublinCore(event.object, None)
           if dc is not None:
               dc.modified = datetime.utcnow()

       def CreatedAnnotator(event):
           dc = IZopeDublinCore(event.object, None)
           if dc is not None:
               now = datetime.utcnow()
               dc.created = now
               dc.modified = now

    :)

    Handlers are also registered differently in ZCML.  There are no longer
    event:subscriber directives. Rather, subscriber directoves from the zope
    namespace are used, as in:

       <subscriber
           for="zope.app.event.interfaces.IObjectModifiedEvent"
           factory=".timeannotators.ModifiedAnnotator"
           />

       <subscriber
           for="zope.app.event.interfaces.IObjectCreatedEvent"
           factory=".timeannotators.CreatedAnnotator"
           />

Jim

-- 
Jim Fulton           mailto:jim at zope.com       Python Powered!
CTO                  (540) 361-1714            http://www.python.org
Zope Corporation     http://www.zope.com       http://www.zope.org




More information about the Zope3-dev mailing list