1# -*- coding: iso-8859-1 -*-
2"""
3    MoinMoin - (re)building of Xapian indices
4
5    @copyright: 2007 MoinMoin:KarolNowak
6    @license: GNU GPL, see COPYING for details.
7"""
8
9import MoinMoin.events as ev
10
11
12def _get_index(request):
13    try:
14        from MoinMoin.search.Xapian import XapianIndex
15        return XapianIndex(request)
16    except ImportError:
17        pass
18
19
20def handle_renamed(event):
21    """Updates Xapian index when a page changes its name"""
22
23    request = event.request
24
25    if request.cfg.xapian_search:
26        index = _get_index(request)
27        if index and index.exists():
28            index.update_item(event.old_page.page_name, now=False)
29            index.update_item(event.page.page_name)
30
31
32def handle_copied(event):
33    """Updates Xapian index when a page is copied"""
34
35    request = event.request
36
37    if request.cfg.xapian_search:
38        index = _get_index(request)
39        if index and index.exists():
40            index.update_item(event.page.page_name)
41
42
43def handle_changed(event):
44    """Updates Xapian index when a page is changed"""
45
46    request = event.request
47
48    if request.cfg.xapian_search:
49        index = _get_index(request)
50        if index and index.exists():
51            index.update_item(event.page.page_name)
52
53
54def handle_deleted(event):
55    """Updates Xapian index when a page is deleted"""
56    event = ev.PageChangedEvent(event.request, event.page, event.comment)
57    handle_changed(event)
58
59
60def handle_attachment_change(event):
61    """Updates Xapian index when attachment is added or removed"""
62
63    request = event.request
64
65    if request.cfg.xapian_search:
66        index = _get_index(request)
67        if index and index.exists():
68            index.update_item(event.pagename, event.filename)
69
70
71def handle(event):
72    if isinstance(event, ev.PageRenamedEvent):
73        handle_renamed(event)
74    elif isinstance(event, ev.PageCopiedEvent):
75        handle_copied(event)
76    elif isinstance(event, (ev.PageChangedEvent, ev.TrivialPageChangedEvent)):
77        handle_changed(event)
78    elif isinstance(event, ev.PageDeletedEvent):
79        handle_deleted(event)
80    elif isinstance(event, (ev.FileAttachedEvent, ev.FileRemovedEvent)):
81        handle_attachment_change(event)
82
83