view trac_plugin/MailmanPlugin.py @ 0:559393b8973f

Initial version: support for searching the archives
author Sebastien Decugis <sdecugis@nict.go.jp>
date Tue, 10 Aug 2010 15:07:25 +0900
parents
children 76549bed2e2f
line wrap: on
line source

from trac.core import *
from trac.search import ISearchSource, shorten_result
from trac.mimeview.api import Mimeview
from datetime import datetime
import pytz
import SwishE

""" Mailing-list search plugin for Trac
  This plugin relies on a working swish-e index for mailing-list.
  See for example:
  http://svn.rot13.org/index.cgi/swish/view/trunk/mailman/index_mailman.pl
  (assuming the archives are generated by pipermail)
  
  It also requires the swish-e python wrapper from 
  http://py-swish-e.berlios.de/
  
  The configuration is static in this file for now, it might be moved to 
  configuration file or an admin panel later. Each mailing-list is defined by:
  ( short name, index file, label ).
"""

MailmanConfig=( 
    ( 'help', '/var/swish/indexes/help.index', 'help@freediameter.net'),
    ( 'dev',  '/var/swish/indexes/dev.index',  'dev@freediameter.net')
  )
	     
class MailmanPlugin(Component):
    """ Search mailing-list archives. """
    implements(ISearchSource)

    # ISearchSource methods
    def get_search_filters(self, req):
        for MLShort, MLIndex, MLLabel in MailmanConfig:
	   yield ('ML-' + MLShort, MLLabel)

    def get_search_results(self, req, terms, filters):
	# Prepare keywords
	query = ''
	for word in terms :
		query = query + word + ' '
	query.rstrip(' ')
	tokyo_tz = pytz.timezone('Asia/Tokyo') 
	
        for MLShort, MLIndex, MLLabel in MailmanConfig:
            if 'ML-' + MLShort in filters:
	        self.env.log.debug ('Searching "%s" in index %s' % (query, MLIndex) )
		# perform the search
		handle = SwishE.new( MLIndex )
		#handle.setSort('swishrank')
		for result in handle.query(query):
		   date = datetime.fromtimestamp(result.getproperty('sent'))
		   content = Mimeview(self.env).to_unicode(result.getproperty('swishdescription'))
		   #(href, title, date, author, excerpt).
		   yield(result.getproperty('swishdocpath'),
		      result.getproperty('swishtitle') ,
		      date.replace(tzinfo=tokyo_tz),
		      # result.getproperty('name') + ' <' + result.getproperty('email') + '> in ' + MLLabel,
		      result.getproperty('name') + ' <' + result.getproperty('email') + '>',
		      shorten_result(content, query))


"Welcome to our mercurial repository"