Plone/Zope time based event mechanism
collective.timedevents fires clock based Zope 3 events. They can make Zope application react to timers. This is useful for creating services where something must happen regurlarly or after a certain period has expired.
This is a developer level product. This product is indended to replace Products.TickingMachine with more robust Zope 3 codebase.
There are two different styles of using it:
- Using the ITickEvent and calculating if action needs to be done in the event subscriber. This will also take care of timing over zope restarts by keeping event timing persistent.
- Subscribing to any of the cron-style IIntervalTicks*-events, not worrying about the timing client side. For the longer ticks (weekly, montly) a cron-job as trigger makes most sense, in case of zope restarts.
Tested by Travis:
Add collective.timedevents to your buildout by adding the egg to your buildout.cfg:
eggs = ... collective.timedevents
Can either be cron-jobs or zope clock-server.
Add clock server to tick timedevents subscribers - use your Plone instance name:
[instance] ... zope-conf-additional = <clock-server> method /mysite/@@tick period 90 user clockserver-user password password host localhost </clock-server>
Or for the cron-like interval-based events, here 900 seconds for the 15-minute event:
<clock-server> method /mysite/@@tick_fifteen period 900 user clockserver-user password password host localhost </clock-server>
Now you should start to see ticks in the zope event log.
Subscribe to the events/ticks you need.
- Using the ITickEvent method:
Add collective.timedevents.interfaces.ITickEvent subscribers to your product ZCML declarations:<configure xmlns="http://namespaces.zope.org/zope" xmlns:browser="http://namespaces.zope.org/browser" i18n_domain="harvinaiset.app"> <subscriber handler="myproduct.tickers.on_tick" for="collective.timedevents.intefaces.ITickEvent" /> </configure>
Configure your event handler to react after certain period has expired:from zope.app.component.hooks import getSite def on_tick(event): """ Do something after one hour has elapsed """ interval_in_days = 1.0 / 24.0 # One hour, floating point context = site.my_magic_context # Persistent object which stores our timing data if event.last_tick > context.last_action + interval_in_days: # Check whether enough time has elaped do_stuff() context.last_action = event.last_tick # Store when we last time did something
- Using the IIntervalTicks*-events:
Add collective.timedevents.interfaces.IIntervalTicks* subscribers to your module ZCML declarations:<configure xmlns="http://namespaces.zope.org/zope" xmlns:browser="http://namespaces.zope.org/browser" i18n_domain="mymodule"> <subscriber handler="myproduct.tickers.on_tick_fifteen" for="collective.timedevents.intefaces.IIntervalTicks15Event" /> </configure>
All ticking code is executed under admin privileges.
ITickEvent tick period is 300 seconds by default. This can be controlled in views.py.
Ticks for ITickEvent are logged by events.tick_logger defined in configure.zcml.
This product fills the following quality criteria:
- Unit tests provided
- Good documentation provided
- Commented code
- PyPi eggs provided