Edgewall Software

Version 2 (modified by Peter Suter, 7 years ago) ( diff )

Fix link

Extension Point : INotificationFormatter


The INotificationFormatter formats notification events to messages in various formats ready to be distributed.


Trac provides an extendible and flexible notification system, that historically has sent plain text emails for ticket changes. Notifications of different event realms (e.g. wiki notifications), transports (e.g. SMS) and message formats (e.g. HTML messages) might all require different formatting logic though.


Implementing the interface follows the standard guidelines found in TracDev/ComponentArchitecture and of course TracDev/PluginDevelopment.

A simple get_supported_styles() method lists the supported MIME types and event realms for a given transport.

The format() method formats a notification event. It receives the following parameters:

  • transport: The name of the transports that should be used. (See INotificationDistributor)
  • style: The style that should be used. One of those returned by get_supported_styles().
  • event: A trac.notification.api.NotificationEvent instance describing the event about which the recipients should be notified.

It should return the formatted message. The exact return type depends on the transport.


The following example formats notifications to a short string for distribution via SMS.

from trac.core import *
from trac.notification.api import INotificationFormatter

class ShortTicketNotificationFormatter(Component):


    # INotificationFormatter methods
    def get_supported_styles(self, transport):
        if transport == 'sms':
            yield ('text/plain', 'ticket')

    def format(self, transport, style, event):
        if transport == 'sms' and event.realm == 'ticket':
            return "#{0} {1} by {2}" % (event.target,

Available Implementations

Additional Information and References


  • 1.1.3: Integrated INotificationFormatter in Trac as part of this proposal (#3517)
    • Dropped the alternative_style_for() method. (The distributor can select fallbacks without this.)
    • Dropped the realm parameter to the format() method. (Use event.realm instead.)
    • Switched from styles(transport, realm) to get_supported_styles(transport)
Note: See TracWiki for help on using the wiki.