1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
|
from trac.core import *
from tracrpc.api import IXMLRPCHandler
from trac.Search import ISearchSource
try:
a = set()
except:
from sets import Set as set
class SearchRPC(Component):
""" Search Trac. """
implements(IXMLRPCHandler)
search_sources = ExtensionPoint(ISearchSource)
# IXMLRPCHandler methods
def xmlrpc_namespace(self):
return 'search'
def xmlrpc_methods(self):
yield ('SEARCH_VIEW', ((list,),), self.getSearchFilters)
yield ('SEARCH_VIEW', ((list, str), (list, str, list)), self.performSearch)
# Others
def getSearchFilters(self, req):
""" Retrieve a list of search filters with each element in the form
(name, description). """
for source in self.search_sources:
for filter in source.get_search_filters(req):
yield filter
def performSearch(self, req, query, filters = []):
""" Perform a search using the given filters. Defaults to all if not
provided. Results are returned as a list of tuples in the form
(href, title, date, author, excerpt)."""
from trac.Search import search_terms
query = search_terms(query)
chosen_filters = set(filters)
available_filters = []
for source in self.search_sources:
available_filters += source.get_search_filters(req)
filters = [f[0] for f in available_filters if f[0] in chosen_filters]
if not filters:
filters = [f[0] for f in available_filters]
self.env.log.debug("Searching with %s" % filters)
results = []
for source in self.search_sources:
for result in source.get_search_results(req, query, filters):
result = map(unicode, result)
results.append(['/'.join(req.base_url.split('/')[0:3])
+ result[0]] + list(result[1:]))
return results
|