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