1
2# Copyright 2011 Marcel Stimberg <stimberg@users.sourceforge.net>
3
4'''Push events to the Zeitgeist daemon'''
5
6import logging
7import sys
8
9from gi.repository import Gio
10
11from zim.plugins import PluginClass
12from zim.notebook import NotebookExtension
13from zim.signals import SIGNAL_AFTER
14from zim.fs import File
15
16from zim.gui.mainwindow import MainWindowExtension
17
18
19logger = logging.getLogger('zim.plugins.zeitgeist')
20
21
22try:
23	from zeitgeist.client import ZeitgeistClient
24	from zeitgeist.datamodel import Event, Subject, Interpretation, Manifestation
25except:
26	ZeitgeistClient = None
27
28
29class ZeitgeistPlugin(PluginClass):
30
31	plugin_info = {
32		'name': _('Log events with Zeitgeist'), # T: plugin name
33		'description': _('Pushes events to the Zeitgeist daemon.'), # T: plugin description
34		'author': 'Marcel Stimberg',
35		'help': 'Plugins:Log events with Zeitgeist',
36	}
37
38	@classmethod
39	def check_dependencies(klass):
40		has_zeitgeist = not ZeitgeistClient is None
41		return has_zeitgeist, [('libzeitgeist', has_zeitgeist, False)]
42
43	def __init__(self):
44		PluginClass.__init__(self)
45		try:
46			self.zeitgeist_client = ZeitgeistClient()
47			self.zeitgeist_client.register_data_source('application://zim.desktop',
48			    'Zim', _('Zim Desktop Wiki'), []) # T: short description of zim
49		except RuntimeError as e:
50			logger.exception('Loading zeitgeist client failed, will not log events')
51			self.zeitgeist_client = None
52
53	def create_and_send_event(self, page, event_type):
54		if not self.zeitgeist_client:
55			return
56
57		if not hasattr(page, 'source') \
58		or not isinstance(page.source, File):
59			return
60
61		uri = page.source.uri
62		origin = page.source_file.dirname
63		text = _('Wiki page: %s') % page.name
64			# T: label for how zim pages show up in the recent files menu, %s is the page name
65
66		subject = Subject.new_for_values(mimetype='text/x-zim-wiki',
67		                                 uri=uri,
68		                                 origin=origin,
69		                                 interpretation=Interpretation.PLAIN_TEXT_DOCUMENT,
70		                                 manifestation=Manifestation.FILE_DATA_OBJECT,
71		                                 text=text)
72		event = Event.new_for_values(actor='application://zim.desktop',
73		                             interpretation=event_type,
74		                             manifestation=Manifestation.USER_ACTIVITY,
75		                             subjects=[subject, ])
76
77		self.zeitgeist_client.insert_event(event)
78
79
80class ZeitGeistMainWindowExtension(MainWindowExtension):
81
82	def __init__(self, plugin, window):
83		MainWindowExtension.__init__(self, plugin, window)
84		self.connectto(window, 'page-changed')
85		if window.page is not None:
86			self.plugin.create_and_send_event(window.page, Interpretation.ACCESS_EVENT)
87			self.page = window.page
88		else:
89			self.page = None
90
91	def on_page_changed(self, pageview, page):
92		if self.page is not None:
93			self.plugin.create_and_send_event(self.page, Interpretation.LEAVE_EVENT)
94
95		self.plugin.create_and_send_event(page, Interpretation.ACCESS_EVENT)
96		self.page = page
97
98	def destroy(self):
99		if self.page is not None:
100			self.plugin.create_and_send_event(self.page, Interpretation.LEAVE_EVENT)
101			self.page = None
102
103
104class ZeitgeistNotebookExtension(NotebookExtension):
105
106	def __init__(self, plugin, notebook):
107		NotebookExtension.__init__(self, plugin, notebook)
108		self.connectto_all(notebook,
109			('deleted-page', 'stored-page'), order=SIGNAL_AFTER)
110
111	def on_deleted_page(self, notebook, page):
112		logger.debug("Deleted page: %s", page.name)
113		self.plugin.create_and_send_event(page, Interpretation.DELETE_EVENT)
114
115	def on_stored_page(self, notebook, page):
116		logger.debug("Modified page: %s", page.name)
117		self.plugin.create_and_send_event(page, Interpretation.MODIFY_EVENT)
118