diff --git a/src/history_manager.py b/src/history_manager.py index 111aed5ee..755dc5359 100644 --- a/src/history_manager.py +++ b/src/history_manager.py @@ -24,7 +24,8 @@ ## ## NOTE: some method names may match those of logger.py but that's it -## someday (TM) should have common class that abstracts db connections and helpers on it +## someday (TM) should have common class +## that abstracts db connections and helpers on it ## the same can be said for history_window.py import os @@ -108,7 +109,8 @@ import sqlite3 as sqlite class HistoryManager: def __init__(self): pix = gtkgui_helpers.get_icon_pixmap('gajim') - gtk.window_set_default_icon(pix) # set the icon to all newly opened windows + # set the icon to all newly opened windows + gtk.window_set_default_icon(pix) if not os.path.exists(LOG_DB_PATH): dialogs.ErrorDialog(_('Cannot find history logs database'), @@ -126,11 +128,11 @@ class HistoryManager: 'search_results_scrolledwindow') self.welcome_vbox = xml.get_object('welcome_vbox') - self.jids_already_in = [] # holds jids that we already have in DB + self.jids_already_in = [] # holds jids that we already have in DB self.AT_LEAST_ONE_DELETION_DONE = False - self.con = sqlite.connect(LOG_DB_PATH, timeout = 20.0, - isolation_level = 'IMMEDIATE') + self.con = sqlite.connect(LOG_DB_PATH, timeout=20.0, + isolation_level='IMMEDIATE') self.cur = self.con.cursor() self._init_jids_listview() @@ -146,47 +148,50 @@ class HistoryManager: xml.connect_signals(self) def _init_jids_listview(self): - self.jids_liststore = gtk.ListStore(str, str) # jid, jid_id + self.jids_liststore = gtk.ListStore(str, str) # jid, jid_id self.jids_listview.set_model(self.jids_liststore) self.jids_listview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) - renderer_text = gtk.CellRendererText() # holds jid - col = gtk.TreeViewColumn(_('Contacts'), renderer_text, text = 0) + renderer_text = gtk.CellRendererText() # holds jid + col = gtk.TreeViewColumn(_('Contacts'), renderer_text, text=0) self.jids_listview.append_column(col) self.jids_listview.get_selection().connect('changed', self.on_jids_listview_selection_changed) def _init_logs_listview(self): - # log_line_id (HIDDEN), jid_id (HIDDEN), time, message, subject, nickname + # log_line_id(HIDDEN), jid_id(HIDDEN), time, message, subject, nickname self.logs_liststore = gtk.ListStore(str, str, str, str, str, str) self.logs_listview.set_model(self.logs_liststore) self.logs_listview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) - renderer_text = gtk.CellRendererText() # holds time - col = gtk.TreeViewColumn(_('Date'), renderer_text, text = C_UNIXTIME) - col.set_sort_column_id(C_UNIXTIME) # user can click this header and sort + renderer_text = gtk.CellRendererText() # holds time + col = gtk.TreeViewColumn(_('Date'), renderer_text, text=C_UNIXTIME) + # user can click this header and sort + col.set_sort_column_id(C_UNIXTIME) col.set_resizable(True) self.logs_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds nickname - col = gtk.TreeViewColumn(_('Nickname'), renderer_text, text = C_NICKNAME) - col.set_sort_column_id(C_NICKNAME) # user can click this header and sort + renderer_text = gtk.CellRendererText() # holds nickname + col = gtk.TreeViewColumn(_('Nickname'), renderer_text, text=C_NICKNAME) + # user can click this header and sort + col.set_sort_column_id(C_NICKNAME) col.set_resizable(True) col.set_visible(False) self.nickname_col_for_logs = col self.logs_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds message - col = gtk.TreeViewColumn(_('Message'), renderer_text, markup = C_MESSAGE) - col.set_sort_column_id(C_MESSAGE) # user can click this header and sort + renderer_text = gtk.CellRendererText() # holds message + col = gtk.TreeViewColumn(_('Message'), renderer_text, markup=C_MESSAGE) + # user can click this header and sort + col.set_sort_column_id(C_MESSAGE) col.set_resizable(True) self.message_col_for_logs = col self.logs_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds subject - col = gtk.TreeViewColumn(_('Subject'), renderer_text, text = C_SUBJECT) - col.set_sort_column_id(C_SUBJECT) # user can click this header and sort + renderer_text = gtk.CellRendererText() # holds subject + col = gtk.TreeViewColumn(_('Subject'), renderer_text, text=C_SUBJECT) + col.set_sort_column_id(C_SUBJECT) # user can click this header and sort col.set_resizable(True) col.set_visible(False) self.subject_col_for_logs = col @@ -194,92 +199,98 @@ class HistoryManager: def _init_search_results_listview(self): # log_line_id (HIDDEN), jid, time, message, subject, nickname - self.search_results_liststore = gtk.ListStore(str, str, str, str, str, str) + self.search_results_liststore = gtk.ListStore(str, str, str, str, str, + str) self.search_results_listview.set_model(self.search_results_liststore) - renderer_text = gtk.CellRendererText() # holds JID (who said this) - col = gtk.TreeViewColumn(_('JID'), renderer_text, text = 1) - col.set_sort_column_id(1) # user can click this header and sort + renderer_text = gtk.CellRendererText() # holds JID (who said this) + col = gtk.TreeViewColumn(_('JID'), renderer_text, text=1) + col.set_sort_column_id(1) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds time - col = gtk.TreeViewColumn(_('Date'), renderer_text, text = C_UNIXTIME) - col.set_sort_column_id(C_UNIXTIME) # user can click this header and sort + renderer_text = gtk.CellRendererText() # holds time + col = gtk.TreeViewColumn(_('Date'), renderer_text, text=C_UNIXTIME) + # user can click this header and sort + col.set_sort_column_id(C_UNIXTIME) col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds message - col = gtk.TreeViewColumn(_('Message'), renderer_text, text = C_MESSAGE) - col.set_sort_column_id(C_MESSAGE) # user can click this header and sort + renderer_text = gtk.CellRendererText() # holds message + col = gtk.TreeViewColumn(_('Message'), renderer_text, text=C_MESSAGE) + col.set_sort_column_id(C_MESSAGE) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds subject - col = gtk.TreeViewColumn(_('Subject'), renderer_text, text = C_SUBJECT) - col.set_sort_column_id(C_SUBJECT) # user can click this header and sort + renderer_text = gtk.CellRendererText() # holds subject + col = gtk.TreeViewColumn(_('Subject'), renderer_text, text=C_SUBJECT) + col.set_sort_column_id(C_SUBJECT) # user can click this header and sort col.set_resizable(True) self.search_results_listview.append_column(col) - renderer_text = gtk.CellRendererText() # holds nickname - col = gtk.TreeViewColumn(_('Nickname'), renderer_text, text = C_NICKNAME) - col.set_sort_column_id(C_NICKNAME) # user can click this header and sort + renderer_text = gtk.CellRendererText() # holds nickname + col = gtk.TreeViewColumn(_('Nickname'), renderer_text, text=C_NICKNAME) + # user can click this header and sort + col.set_sort_column_id(C_NICKNAME) col.set_resizable(True) self.search_results_listview.append_column(col) def on_history_manager_window_delete_event(self, widget, event): - if self.AT_LEAST_ONE_DELETION_DONE: - def on_yes(clicked): - self.cur.execute('VACUUM') - self.con.commit() - gtk.main_quit() - - def on_no(): - gtk.main_quit() - - dialogs.YesNoDialog( - _('Do you want to clean up the database? ' - '(STRONGLY NOT RECOMMENDED IF GAJIM IS RUNNING)'), - _('Normally allocated database size will not be freed, ' - 'it will just become reusable. If you really want to reduce ' - 'database filesize, click YES, else click NO.' - '\n\nIn case you click YES, please wait...'), - on_response_yes=on_yes, on_response_no=on_no) + if not self.AT_LEAST_ONE_DELETION_DONE: + gtk.main_quit() return - gtk.main_quit() + def on_yes(clicked): + self.cur.execute('VACUUM') + self.con.commit() + gtk.main_quit() + + def on_no(): + gtk.main_quit() + + dialog = dialogs.YesNoDialog( + _('Do you want to clean up the database? ' + '(STRONGLY NOT RECOMMENDED IF GAJIM IS RUNNING)'), + _('Normally allocated database size will not be freed, ' + 'it will just become reusable. If you really want to reduce ' + 'database filesize, click YES, else click NO.' + '\n\nIn case you click YES, please wait...'), + on_response_yes=on_yes, on_response_no=on_no) + button_box = dialog.get_children()[0].get_children()[1] + button_box.get_children()[0].grab_focus() def _fill_jids_listview(self): # get those jids that have at least one entry in logs - self.cur.execute('SELECT jid, jid_id FROM jids WHERE jid_id IN (SELECT ' - 'distinct logs.jid_id FROM logs) ORDER BY jid') - rows = self.cur.fetchall() # list of tupples: [(u'aaa@bbb',), (u'cc@dd',)] + self.cur.execute('SELECT jid, jid_id FROM jids WHERE jid_id IN (' + 'SELECT distinct logs.jid_id FROM logs) ORDER BY jid') + # list of tupples: [(u'aaa@bbb',), (u'cc@dd',)] + rows = self.cur.fetchall() for row in rows: - self.jids_already_in.append(row[0]) # jid - self.jids_liststore.append(row) # jid, jid_id + self.jids_already_in.append(row[0]) # jid + self.jids_liststore.append(row) # jid, jid_id - def on_jids_listview_selection_changed(self, widget, data = None): + def on_jids_listview_selection_changed(self, widget, data=None): liststore, list_of_paths = self.jids_listview.get_selection()\ .get_selected_rows() paths_len = len(list_of_paths) - if paths_len == 0: # nothing is selected + if paths_len == 0: # nothing is selected return - self.logs_liststore.clear() # clear the store + self.logs_liststore.clear() # clear the store self.welcome_vbox.hide() self.search_results_scrolledwindow.hide() self.logs_scrolledwindow.show() list_of_rowrefs = [] - for path in list_of_paths: # make them treerowrefs (it's needed) + for path in list_of_paths: # make them treerowrefs (it's needed) list_of_rowrefs.append(gtk.TreeRowReference(liststore, path)) - for rowref in list_of_rowrefs: # FILL THE STORE, for all rows selected + for rowref in list_of_rowrefs: # FILL THE STORE, for all rows selected path = rowref.get_path() if path is None: continue - jid = liststore[path][0].decode('utf-8') # jid + jid = liststore[path][0].decode('utf-8') # jid self._fill_logs_listview(jid) def _get_jid_id(self, jid): @@ -290,10 +301,10 @@ class HistoryManager: So to ask logs we need jid_id that matches our jid in jids table this method wants jid and returns the jid_id for later sql-ing on logs """ - if jid.find('/') != -1: # if it has a / + if jid.find('/') != -1: # if it has a / jid_is_from_pm = self._jid_is_from_pm(jid) - if not jid_is_from_pm: # it's normal jid with resource - jid = jid.split('/', 1)[0] # remove the resource + if not jid_is_from_pm: # it's normal jid with resource + jid = jid.split('/', 1)[0] # remove the resource self.cur.execute('SELECT jid_id FROM jids WHERE jid = ?', (jid,)) jid_id = self.cur.fetchone()[0] return str(jid_id) @@ -337,7 +348,7 @@ class HistoryManager: raise elif row[0] == constants.JID_ROOM_TYPE: return True - else: # normal type + else: # normal type return False def _fill_logs_listview(self, jid): @@ -357,7 +368,7 @@ class HistoryManager: results = self.cur.fetchall() - if self._jid_is_room_type(jid): # is it room? + if self._jid_is_room_type(jid): # is it room? self.nickname_col_for_logs.set_visible(True) self.subject_col_for_logs.set_visible(False) else: @@ -369,10 +380,11 @@ class HistoryManager: # time, message, subject, nickname # but store in liststore # log_line_id, jid_id, time, message, subject, nickname - log_line_id, jid_id, time_, kind, message, subject, nickname, show = row + log_line_id, jid_id, time_, kind, message, subject, nickname, \ + show = row try: - time_ = time.strftime('%x', time.localtime(float(time_))).decode( - locale.getpreferredencoding()) + time_ = time.strftime('%x', time.localtime(float(time_)) + ).decode(locale.getpreferredencoding()) except ValueError: pass else: @@ -380,27 +392,29 @@ class HistoryManager: if kind in (constants.KIND_SINGLE_MSG_RECV, constants.KIND_CHAT_MSG_RECV, constants.KIND_GC_MSG): # it is the other side - color = gajim.config.get('inmsgcolor') # so incoming color + color = gajim.config.get('inmsgcolor') # so incoming color elif kind in (constants.KIND_SINGLE_MSG_SENT, - constants.KIND_CHAT_MSG_SENT): # it is us - color = gajim.config.get('outmsgcolor') # so outgoing color + constants.KIND_CHAT_MSG_SENT): # it is us + color = gajim.config.get('outmsgcolor') # so outgoing color elif kind in (constants.KIND_STATUS, - constants.KIND_GCSTATUS): # is is statuses - color = gajim.config.get('statusmsgcolor') # so status color + constants.KIND_GCSTATUS): # is is statuses + # so status color + color = gajim.config.get('statusmsgcolor') # include status into (status) message if message is None: message = '' else: message = ' : ' + message - message = helpers.get_uf_show(gajim.SHOW_LIST[show]) + message + message = helpers.get_uf_show(gajim.SHOW_LIST[show]) + \ + message message_ = '