Edgewall Software

Version 5 (modified by anonymous, 7 years ago) ( diff )

Added method attachment_moved (#12870)

Extension Point : IAttachmentChangeListener

InterfaceIAttachmentChangeListenerSince0.10
Moduletrac.attachmentSourceattachment.py

The IAttachmentChangeListener allows components to listen for and to react to attachment events.

Purpose

Trac allows users to attach arbitrary files to e.g. tickets or wiki pages. Plugins can hook into the attachment module to trigger their own actions when attachments are added, deleted or moved (i.e. moved to another parent resource and / or renamed).

The main purpose for this interface is to allow plugins to stay informed about the existing attachments and trigger appropriate actions elsewhere (e.g. sending notifications, starting indexing services, updating supplementary data structures etc.)

(For attachment validation and manipulation use IAttachmentManipulator instead.)

Usage

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

When a user adds a new attachment the attachment_added method is called. Similarly attachment_deleted is called when a user deletes an attachment or its parent resource, and attachment_moved is called when a user moves an attachment to a new parent resource or renames the attachment or the parent resource.

Examples

A common use case for attachments is to attach images to wiki pages. For convenience you might want to automatically append an Image macro to the wiki page. The following minimal example IAttachmentChangeListener implementation could implement such a feature:

from trac.core import Component, implements
from trac.attachment import IAttachmentChangeListener
from trac.mimeview.api import get_mimetype
from trac.wiki.model import WikiPage

class ImageAutoAppender(Component):
    implements(IAttachmentChangeListener)

    def attachment_added(self, attachment):
        if attachment.parent_realm != 'wiki':
            return
        mimetype = get_mimetype(attachment.filename)
        if not mimetype.startswith('image/'):
            return
        page = WikiPage(self.env, attachment.parent_id)
        page.text += '[[Image(%s)]]' % (attachment.filename,)
        page.save(attachment.author, 'Auto-append image', attachment.ipnr)

    def attachment_deleted(self, attachment):
        pass

    def attachment_moved(attachment, old_parent_realm, old_parent_id, old_filename):
        pass

Available Implementations

Additional Information and References

API History

Note: See TracWiki for help on using the wiki.