From 5231fb4a9dfe0634c4fedad39fed940469028cf9 Mon Sep 17 00:00:00 2001 From: Martin Sivak Date: Wed, 23 Apr 2008 15:48:01 +0200 Subject: Issue reporting and Tasker interrupt --- firstaidkit | 3 ++ frontend/firstaidkit.glade | 1 + frontend/main.py | 86 ++++++++++++++++++++++++++++++++++++++++++++-- pyfirstaidkit/interpret.py | 8 ++++- pyfirstaidkit/reporting.py | 2 +- 5 files changed, 96 insertions(+), 4 deletions(-) diff --git a/firstaidkit b/firstaidkit index d478dd7..603a30c 100755 --- a/firstaidkit +++ b/firstaidkit @@ -79,6 +79,9 @@ class Output(Thread): if self._importance<=message["importance"]: print "TREE %s FROM %s" % (message["title"], message["origin"].name,) pprint.pprint(message["message"]) + elif message["action"]==reporting.ISSUE: + print "ISSUE FROM %s" % (message["origin"].name,) + pprint.pprint(str(message["message"])) else: print "FIXME: Unknown message action %d!!" % (message["action"],) print message diff --git a/frontend/firstaidkit.glade b/frontend/firstaidkit.glade index 80ea720..5195b36 100644 --- a/frontend/firstaidkit.glade +++ b/frontend/firstaidkit.glade @@ -711,6 +711,7 @@ True + False True Stop True diff --git a/frontend/main.py b/frontend/main.py index d200a58..0287fac 100644 --- a/frontend/main.py +++ b/frontend/main.py @@ -42,10 +42,11 @@ class CallbacksMainWindow(object): if not self._running_lock.acquire(0): return - def _o(pages): + def _o(pages, stopbutton): """Always return False -> remove from the idle queue after first execution""" for i in range(pages.get_n_pages()): pages.get_nth_page(i).set_sensitive(True) + stopbutton.set_sensitive(False) return False def worker(*args): @@ -58,7 +59,11 @@ class CallbacksMainWindow(object): self._data.pages.set_current_page(-1) for i in range(self._data.pages.get_n_pages())[:-1]: self._data.pages.get_nth_page(i).set_sensitive(False) - thread.start_new_thread(worker, (self._data.pages,)) + self.on_b_ResetResults_activate(None) + + stopbutton = self._glade.get_widget("b_StopResults") + stopbutton.set_sensitive(True) + thread.start_new_thread(worker, (self._data.pages, stopbutton)) #menu callbacks def on_mainmenu_open_activate(self, widget, *args): @@ -98,6 +103,7 @@ class CallbacksMainWindow(object): self._tasker.end() del self._tasker del self._cfg + del self._data.result_list_iter gtk.main_quit() def on_mainmenu_about_activate(self, widget, *args): @@ -246,10 +252,14 @@ class CallbacksMainWindow(object): #results callbacks def on_b_ResetResults_activate(self, widget, *args): print "on_b_ResetResults_activate" + self._data.result_list_store.clear() + del self._data.result_list_iter + self._data.result_list_iter = dict() return True def on_b_StopResults_activate(self, widget, *args): print "on_b_StopResults_activate" + self._tasker.interrupt() return True class CallbacksFlagList(object): @@ -358,6 +368,7 @@ class MainWindow(object): self.plugin_iter = {} self.flow_list_data = set() + #flow combobox for plname in pluginsystem.list(): p = pluginsystem.getplugin(plname) piter = self.plugin_list_store.append(None, [False, "%s (%s)" % (p.name, p.version), p.description, ""]) @@ -379,12 +390,75 @@ class MainWindow(object): self.flow_list.add_attribute(self.flow_list_rend_text, 'text', 0) self.flow_list.set_active(self.flow_list_store_diagnose) + # results + self.result_list_store = gtk.ListStore(gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_INT) + self.result_list = self._glade.get_widget("tree_Results") + self.result_list.set_model(self.result_list_store) + self.result_list_iter = {} + + def result_rend_text_func(column, cell_renderer, tree_model, iter, user_data): + colors = [ + gtk.gdk.Color(red=50000, green=50000, blue=50000), + gtk.gdk.Color(red=10000, green=50000, blue=10000), + gtk.gdk.Color(red=50000, green=10000, blue=10000), + gtk.gdk.Color(red=10000, green=10000, blue=50000) + ] + state = tree_model.get_value(iter, 3) + + cell_renderer.set_property("cell-background-set", True) + cell_renderer.set_property("cell-background-gdk", colors[state]) + + if user_data==2 and state!=2: + cell_renderer.set_property("foreground-set", True) + cell_renderer.set_property("foreground-gdk", gtk.gdk.Color(red=40000, green=40000, blue=40000)) + else: + cell_renderer.set_property("foreground-set", False) + + cell_renderer.set_property("text", tree_model.get_value(iter, user_data)) + return + + self.result_rend_text = gtk.CellRendererText() + + self.result_list_col_0 = gtk.TreeViewColumn('Name') + self.result_list_col_0.pack_start(self.result_rend_text, True) + self.result_list_col_0.set_cell_data_func(self.result_rend_text, result_rend_text_func, 0) + + self.result_list_col_1 = gtk.TreeViewColumn('Status') + self.result_list_col_1.pack_start(self.result_rend_text, True) + self.result_list_col_1.set_cell_data_func(self.result_rend_text, result_rend_text_func, 1) + + self.result_list_col_2 = gtk.TreeViewColumn('Description') + self.result_list_col_2.pack_start(self.result_rend_text, True) + self.result_list_col_2.set_cell_data_func(self.result_rend_text, result_rend_text_func, 2) + + self.result_list_col_3 = gtk.TreeViewColumn('Status ID') + self.result_list_col_3.pack_start(self.result_rend_text, True) + self.result_list_col_3.add_attribute(self.result_rend_text, 'text', 3) + self.result_list_col_3.set_property("visible", False) + + self.result_list.append_column(self.result_list_col_0) + self.result_list.append_column(self.result_list_col_1) + self.result_list.append_column(self.result_list_col_2) + self.result_list.append_column(self.result_list_col_3) + self.result_list.set_search_column(0) + def update(self, message): def _o(func, *args, **kwargs): """Always return False -> remove from the idle queue after first execution""" func(*args, **kwargs) return False + def issue_state(self): + if self._fixed: + return ("Fixed", 3) + elif self._happened and self._detected: + return ("Detected", 2) + elif self._detected: + return ("No problem", 1) + else: + return ("Waiting for check", 0) + + if self._cfg.operation.verbose == "True": self._importance = logging.DEBUG else: @@ -430,6 +504,14 @@ class MainWindow(object): if self._importance<=message["importance"]: print "TREE %s FROM %s" % (message["title"], message["origin"].name,) pprint.pprint(message["message"]) + elif message["action"]==reporting.ISSUE: + i = message["message"] + t,ids = issue_state(i) + if not self.result_list_iter.has_key(i): + self.result_list_iter[i] = self.result_list_store.append([i.name, t, i.description, ids]) + else: + for idx,val in enumerate([i.name, t, i.description, ids]): + gobject.idle_add(_o, self.result_list_store.set, self.result_list_iter[i], idx, val) else: print "FIXME: Unknown message action %d!!" % (message["action"],) print message diff --git a/pyfirstaidkit/interpret.py b/pyfirstaidkit/interpret.py index d658245..c81cdaf 100644 --- a/pyfirstaidkit/interpret.py +++ b/pyfirstaidkit/interpret.py @@ -33,6 +33,7 @@ class Tasker: def __init__(self, cfg, reporting = None, dependencies = None, backups = None, pluginsystem = None): self._config = cfg + self._running = True if dependencies is None: self._provide = Dependencies() @@ -54,6 +55,10 @@ class Tasker: else: self.pluginSystem = pluginsystem + def interrupt(self): + self._running = False + self._reporting.info("You sent an interrupt signal to Tasker! This is not recommended.", level = TASKER, origin = self, importance = logging.WARNING) + def flags(self): return self._provide @@ -105,7 +110,8 @@ class Tasker: oldlist = set() actlist = set(zip(pluginlist, flows)) - while len(actlist)>0 and oldlist!=actlist: + self._running = True + while self._running and len(actlist)>0 and oldlist!=actlist: oldlist = copy.copy(actlist) for plugin,flow in oldlist: #If plugin does not contain the automated flow or if it ran correctly, remove it from list diff --git a/pyfirstaidkit/reporting.py b/pyfirstaidkit/reporting.py index 934a6ef..8a19a07 100644 --- a/pyfirstaidkit/reporting.py +++ b/pyfirstaidkit/reporting.py @@ -149,7 +149,7 @@ class Reports(object): def issue(self, issue, level, origin, importance = logging.INFO): Logger.debug(origin.name+": issue changed state to "+str(issue)) - return self.put(issue, level, origin, INFO, importance = importance) + return self.put(issue, level, origin, ISSUE, importance = importance) def info(self, message, level, origin, importance = logging.INFO): Logger.info(origin.name+": "+message) -- cgit