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.


CategoryBlog TagMoinMoin

Blog/2008-07-04-2236-MoinMoinEventSystem (last edited 2008-07-04 14:38:51 by YuJieLin)

blog comments powered by Disqus