MoinMoin 1.7 Event System
I have just learn how to create an event handler in MoinMoin 1.7. The source of Event System is MoinMoin/events/__init__.py. Here is an excerpt of it:
# The base
class Event(object):
# Built-in Events
class PageEvent(Event):
class PagePreSaveEvent(Event):
# Built-in Results
class EventResult:
class Abort(EventResult):
Example Code
This example is a real code from HeadLink. It tries to prevent some changes if the current user doesn't have admin permission.
As a event handler, actually a Python module, it may look like as follows and should be stored at data/plugins/events/.
import MoinMoin.events as ev
def handle_page_presave(event):
request = event.request
page_editor = event.page_editor
# If current user has admin permission, then don't need to check
if request.user.may.admin(page_editor.page_name):
return
[snip]
# Changed without having admin permission?
if newer_pragma != old_pragma:
return ev.Abort('Only admin can change HeadLink processing instruction!')
def handle(event):
"""An event handler"""
if isinstance(event, ev.PagePreSaveEvent):
return handle_page_presave(event)
An event handler must have handle(), it's the entry point. The event sender send_event in MoinMoin/events/__init__.py invokes handle() of each event handler. The handle() like a dispatcher, it shall identify the Event and invoke real corresponding event handler, in this case, they are PagePreSaveEvent and handle_page_presave().
Parameters
The parameters of event can be retrieved, but you may need to read the source of certain Event. For PagePreSaveEvent,
class PagePreSaveEvent(Event):
[snip]
name = u"PagePreSaveEvent"
def __init__(self, request, page_editor, new_text):
Event.__init__(self, request)
self.page_editor = page_editor
self.new_text = new_text
And you always can get request from event.request.
Result
The sender of PagePreSaveEvent provides an opportunity to cancel a save. Line 1098~1105 of MoinMoin/PageEditor.py:
presave = PagePreSaveEvent(request, self, newtext)
results = send_event(presave)
for result in results:
if isinstance(result, Abort):
# XXX: this should return a list of messages to the sorrounding context
# XXX: rather than dumbly concatenate them. Fix in the future.
msg = msg + result.reason
If this event handler want to about, it can return an instance of MoinMoin.events.About; if don't, just don't return anything.

