File: search.py

package info (click to toggle)
trac-xmlrpc 1.0.6%2Bsvn6598-1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 308 kB
  • ctags: 427
  • sloc: python: 2,413; cs: 100; makefile: 4
file content (54 lines) | stat: -rw-r--r-- 1,936 bytes parent folder | download | duplicates (5)
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