diff options
| author | Jiri Moskovcak <jmoskovc@redhat.com> | 2010-01-19 16:02:40 +0100 |
|---|---|---|
| committer | Jiri Moskovcak <jmoskovc@redhat.com> | 2010-01-19 16:02:40 +0100 |
| commit | f750288769b23497ad5b57b1c50f683402c509f6 (patch) | |
| tree | b71f2a2c6ed6b5a1f5353c58780b09ef55f2c383 /src | |
| parent | b8ef905c6455ef98cd7fa488de7d602a70bd57dc (diff) | |
| parent | b7e20eb84250ce9feeefde8dad2eab448125dc5d (diff) | |
Merge branch 'master' into rhel6
Diffstat (limited to 'src')
| -rw-r--r-- | src/Applet/Applet.cpp | 1 | ||||
| -rwxr-xr-x | src/Backtrace/abrt-bz-downloader | 5 | ||||
| -rwxr-xr-x | src/Backtrace/abrt-bz-dupchecker | 10 | ||||
| -rw-r--r-- | src/CLI/CLI.cpp | 2 | ||||
| -rw-r--r-- | src/Daemon/CommLayerServerDBus.cpp | 9 | ||||
| -rw-r--r-- | src/Daemon/Daemon.cpp | 1 | ||||
| -rw-r--r-- | src/Daemon/MiddleWare.cpp | 4 | ||||
| -rw-r--r-- | src/Gui/CCDump.py | 34 | ||||
| -rw-r--r-- | src/Gui/CCDumpList.py | 5 | ||||
| -rw-r--r-- | src/Gui/CCMainWindow.py | 7 | ||||
| -rw-r--r-- | src/Gui/CCReport.py | 30 | ||||
| -rw-r--r-- | src/Gui/CCReporterDialog.py | 228 | ||||
| -rw-r--r-- | src/Gui/CC_gui_functions.py | 2 | ||||
| -rw-r--r-- | src/Gui/Makefile.am | 2 | ||||
| -rw-r--r-- | src/Gui/abrt_utils.py | 2 | ||||
| -rw-r--r-- | src/Gui/dialogs.glade | 1 | ||||
| -rw-r--r-- | src/Gui/report.glade | 648 |
17 files changed, 663 insertions, 328 deletions
diff --git a/src/Applet/Applet.cpp b/src/Applet/Applet.cpp index eea3ef7..550e1aa 100644 --- a/src/Applet/Applet.cpp +++ b/src/Applet/Applet.cpp @@ -20,7 +20,6 @@ #include <dbus/dbus-shared.h> #include <dbus/dbus-glib.h> #include <dbus/dbus-glib-lowlevel.h> -#include <limits.h> #if HAVE_CONFIG_H #include <config.h> #endif diff --git a/src/Backtrace/abrt-bz-downloader b/src/Backtrace/abrt-bz-downloader index 81084e7..7f29425 100755 --- a/src/Backtrace/abrt-bz-downloader +++ b/src/Backtrace/abrt-bz-downloader @@ -1,5 +1,10 @@ #!/usr/bin/python # -*- mode:python -*- +# ABRT Bugzilla Backtrace Downloader +# Downloads all backtraces reported by ABRT from Bugzilla. +# +# Please do not run this script unless it's neccessary to do so. +# It forces Bugzilla to send data related to thousands of bug reports. from bugzilla import RHBugzilla from optparse import OptionParser diff --git a/src/Backtrace/abrt-bz-dupchecker b/src/Backtrace/abrt-bz-dupchecker index f9caeed..01cafa0 100755 --- a/src/Backtrace/abrt-bz-dupchecker +++ b/src/Backtrace/abrt-bz-dupchecker @@ -1,5 +1,15 @@ #!/usr/bin/python # -*- mode:python -*- +# ABRT Bugzilla Duplication Checker +# Downloads all backtraces reported by ABRT from Bugzilla, +# and search for duplicates using the newest ABRT duplication +# checker. +# +# Some bugs in Bugzilla were reported by older ABRT +# versions, which had poor duplication detection. +# +# Please do not run this script unless it's neccessary to do so. +# It forces Bugzilla to send data related to thousands of bug reports. from bugzilla import RHBugzilla from optparse import OptionParser diff --git a/src/CLI/CLI.cpp b/src/CLI/CLI.cpp index 1ea3a5d..bc8ddf6 100644 --- a/src/CLI/CLI.cpp +++ b/src/CLI/CLI.cpp @@ -53,7 +53,7 @@ static void print_crash_infos(vector_crash_infos_t& pCrashInfos, int pMode) for (ii = 0; ii < pCrashInfos.size(); ii++) { map_crash_info_t& info = pCrashInfos[ii]; - if (pMode == OPT_GET_LIST_FULL || info.find(CD_REPORTED)->second[CD_CONTENT] != "1") + if (pMode == OPT_GET_LIST_FULL || info[CD_REPORTED][CD_CONTENT] != "1") { const char *timestr = info[CD_TIME][CD_CONTENT].c_str(); long time = strtol(timestr, NULL, 10); diff --git a/src/Daemon/CommLayerServerDBus.cpp b/src/Daemon/CommLayerServerDBus.cpp index db0d2f5..182aa6c 100644 --- a/src/Daemon/CommLayerServerDBus.cpp +++ b/src/Daemon/CommLayerServerDBus.cpp @@ -205,10 +205,8 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply) int r; DBusMessageIter in_iter; dbus_message_iter_init(call, &in_iter); - map_crash_report_t argin1; - const char* comment; - const char* reproduce; + map_crash_report_t argin1; r = load_val(&in_iter, argin1); if (r == ABRT_DBUS_ERROR) { @@ -218,9 +216,8 @@ static int handle_Report(DBusMessage* call, DBusMessage* reply) map_crash_report_t::const_iterator it_comment = argin1.find(CD_COMMENT); map_crash_report_t::const_iterator it_reproduce = argin1.find(CD_REPRODUCE); - comment = (it_comment != argin1.end()) ? it_comment->second[CD_CONTENT].c_str() : ""; - reproduce = (it_reproduce != argin1.end()) ? it_reproduce->second[CD_CONTENT].c_str() : ""; - + const char* comment = (it_comment != argin1.end()) ? it_comment->second[CD_CONTENT].c_str() : ""; + const char* reproduce = (it_reproduce != argin1.end()) ? it_reproduce->second[CD_CONTENT].c_str() : ""; const char* errmsg = NULL; if (strlen(comment) > LIMIT_MESSAGE) { diff --git a/src/Daemon/Daemon.cpp b/src/Daemon/Daemon.cpp index a2970af..dc547af 100644 --- a/src/Daemon/Daemon.cpp +++ b/src/Daemon/Daemon.cpp @@ -21,7 +21,6 @@ #include <pthread.h> #include <resolv.h> /* res_init */ #include <string> -#include <limits.h> #include <sys/inotify.h> #include <xmlrpc-c/base.h> #include <xmlrpc-c/client.h> diff --git a/src/Daemon/MiddleWare.cpp b/src/Daemon/MiddleWare.cpp index 70527eb..c2a122a 100644 --- a/src/Daemon/MiddleWare.cpp +++ b/src/Daemon/MiddleWare.cpp @@ -187,7 +187,7 @@ static void DebugDumpToCrashReport(const char *pDebugDumpDir, map_crash_report_t add_crash_data_to_crash_report( pCrashReport, short_name, - (content.length() < CD_ATT_SIZE ? CD_TXT : CD_ATT), + CD_TXT, CD_ISEDITABLE, content ); @@ -433,6 +433,8 @@ report_status_t Report(const map_crash_report_t& pCrashReport, { report_status_t ret; + /* dbus handler passes pCrashReport from user without checking it */ + if (!CheckReport(pCrashReport)) { throw CABRTException(EXCEP_ERROR, "Report(): Some of mandatory report data are missing."); diff --git a/src/Gui/CCDump.py b/src/Gui/CCDump.py index 212d441..96d036c 100644 --- a/src/Gui/CCDump.py +++ b/src/Gui/CCDump.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- from datetime import datetime -TYPE = 0 -EDITABLE = 1 -CONTENT = 2 +from abrt_utils import _, init_logging, log, log1, log2 + +CD_TYPE = 0 +CD_EDITABLE = 1 +CD_CONTENT = 2 class Dump(): """Class for mapping the debug dump to python object""" @@ -19,40 +21,40 @@ class Dump(): self.Reported = None def getUUID(self): - return self.UUID[CONTENT] + return self.UUID[CD_CONTENT] def getUID(self): - return self.UID[CONTENT] + return self.UID[CD_CONTENT] def getCount(self): - return self.Count[CONTENT] + return self.Count[CD_CONTENT] def getExecutable(self): - return self.Executable[CONTENT] + return self.Executable[CD_CONTENT] def getPackage(self): - return self.Package[CONTENT] + return self.Package[CD_CONTENT] def isReported(self): - return self.Reported[CONTENT] == "1" + return self.Reported[CD_CONTENT] == "1" def getMessage(self): if not self.Message: - return [] - #return self.Message[CONTENT].split('\n') - return self.Message[CONTENT] + return "" #[] + #return self.Message[CD_CONTENT].split('\n') + return self.Message[CD_CONTENT] def getTime(self,format): #print format if format: try: - return datetime.fromtimestamp(int(self.Time[CONTENT])).strftime(format) + return datetime.fromtimestamp(int(self.Time[CD_CONTENT])).strftime(format) except Exception, e: print e - return int(self.Time[CONTENT]) + return int(self.Time[CD_CONTENT]) def getPackageName(self): - return self.Package[CONTENT][:self.Package[CONTENT].find("-")] + return self.Package[CD_CONTENT][:self.Package[CD_CONTENT].find("-")] def getDescription(self): - return self.Description[CONTENT] + return self.Description[CD_CONTENT] diff --git a/src/Gui/CCDumpList.py b/src/Gui/CCDumpList.py index a8657e0..9888b10 100644 --- a/src/Gui/CCDumpList.py +++ b/src/Gui/CCDumpList.py @@ -2,6 +2,8 @@ import CCDBusBackend from CCDump import Dump +from abrt_utils import _, init_logging, log, log1, log2 + class DumpList(list): """Class to store list of debug dumps""" def __init__(self,dbus_manager=None): @@ -16,8 +18,7 @@ class DumpList(list): for row in rows: entry = Dump() for column in row: - #if column == "Reported": - # print "DumpList adding %s:%s" % (column,row[column]) + log2(" DumpList.%s='%s'", column, row[column]) entry.__dict__[column] = row[column] self.append(entry) except Exception, e: diff --git a/src/Gui/CCMainWindow.py b/src/Gui/CCMainWindow.py index dcb71ae..a8101d4 100644 --- a/src/Gui/CCMainWindow.py +++ b/src/Gui/CCMainWindow.py @@ -3,9 +3,12 @@ import sys import os import pwd import getopt + +from abrt_utils import _, init_logging, log, log1, log2 +import gobject +gobject.set_prgname(_("Automatic Bug Reporting Tool")) import pygtk pygtk.require("2.0") -import gobject try: import gtk except RuntimeError,e: @@ -25,10 +28,8 @@ from CCDumpList import getDumpList, DumpList from CCReporterDialog import ReporterDialog from PluginsSettingsDialog import PluginsSettingsDialog from SettingsDialog import SettingsDialog -from CCReport import Report from PluginList import getPluginInfoList import ABRTExceptions -from abrt_utils import _, init_logging, log, log1, log2 class MainWindow(): diff --git a/src/Gui/CCReport.py b/src/Gui/CCReport.py deleted file mode 100644 index 90c8a3b..0000000 --- a/src/Gui/CCReport.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- - -class Report(): - """Class for mapping the report to pyhon object""" - def __init__(self, report): - self.UUID = None - self.Architecture = None - self.Kernel = None - self.Release = None - self.Executable = None - self.CmdLine = None - self.Package = None - self.TextData1 = None - self.TextData2 = None - self.BinaryData1 = None - self.BinaryData2 = None - for item in report: - self.__dict__[item] = report[item] - - def getUUID(self): - return self.UUID - - def getArchitecture(self): - return self.Architecture - - def getExecutable(self): - return self.Executable - - def getPackage(self): - return self.Package diff --git a/src/Gui/CCReporterDialog.py b/src/Gui/CCReporterDialog.py index ab6ad0f..2cba607 100644 --- a/src/Gui/CCReporterDialog.py +++ b/src/Gui/CCReporterDialog.py @@ -6,7 +6,6 @@ import gtk.glade import pango import sys from CC_gui_functions import * -from CCReport import Report import CellRenderers from ABRTPlugin import PluginInfo from PluginSettingsUI import PluginSettingsUI @@ -22,7 +21,6 @@ CD_CONTENT = 2 CD_SYS = "s" CD_BIN = "b" CD_TXT = "t" -CD_ATT = "a" # response REFRESH = -50 @@ -36,10 +34,11 @@ class ReporterDialog(): self.report = report #Set the Glade file # FIXME add to path - self.gladefile = "%s%sreport.glade" % (sys.path[0],"/") - self.wTree = gtk.glade.XML(self.gladefile) + builderfile = "%s%sreport.glade" % (sys.path[0],"/") + self.builder = gtk.Builder() + self.builder.add_from_file(builderfile) #Get the Main Window, and connect the "destroy" event - self.window = self.wTree.get_widget("reporter_dialog") + self.window = self.builder.get_object("reporter_dialog") self.window.set_default_size(640, 480) self.window.connect("response", self.on_response, daemon) if parent: @@ -47,60 +46,89 @@ class ReporterDialog(): self.window.set_modal(True) # comment textview - self.tvComment = self.wTree.get_widget("tvComment") + self.tvComment = self.builder.get_object("tvComment") self.tvComment.connect("focus-in-event", self.on_comment_focus_cb) self.comment_changed = False # "how to reproduce" textview - self.tevHowToReproduce = self.wTree.get_widget("tevHowToReproduce") + self.tevHowToReproduce = self.builder.get_object("tevHowToReproduce") self.how_to_changed = False - self.tvReport = self.wTree.get_widget("tvReport") - - self.reportListStore = gtk.ListStore(str, str, bool, bool, bool) - # set filter - #self.modelfilter = self.reportListStore.filter_new() - #self.modelfilter.set_visible_func(self.filter_reports, None) - self.tvReport.set_model(self.reportListStore) - renderer = gtk.CellRendererText() - column = gtk.TreeViewColumn('Item', renderer, text=0) - self.tvReport.append_column(column) - - renderer = CellRenderers.MultilineCellRenderer() - renderer.props.editable = True - renderer.props.wrap_mode = pango.WRAP_WORD - renderer.props.wrap_width = 800 - - #renderer.props.wrap_mode = pango.WRAP_WORD - #renderer.props.wrap_width = 600 - column = gtk.TreeViewColumn('Value', renderer, text=1, editable=2) - self.tvReport.append_column(column) - renderer.connect('edited',self.column_edited,self.reportListStore) - # toggle - toggle_renderer = gtk.CellRendererToggle() - toggle_renderer.set_property('activatable', True) - toggle_renderer.connect( 'toggled', self.on_send_toggled, self.reportListStore ) - column = gtk.TreeViewColumn('Send', toggle_renderer) - column.add_attribute(toggle_renderer, "active", 3) - column.add_attribute(toggle_renderer, "visible", 4) - self.tvReport.insert_column(column,0) - # connect the signals - self.tvReport.connect_after("size-allocate", self.on_window_resize) - # start with the warning hidden, so it's not visible when there is no rating - self.wTree.get_widget("ebErrors").hide() - self.wTree.get_widget("bLog").connect("clicked", self.show_log_cb, log) + self.builder.get_object("ebErrors").hide() + self.builder.get_object("bLog").connect("clicked", self.show_log_cb, log) + self.builder.get_object("cbSendBacktrace").connect("toggled", self.on_send_backtrace_toggled) + self.allow_send() self.hydrate() - + + def check_backtrace(self): + print "checking backtrace" + + def warn_user(self, warnings): + # FIXME: show in lError + ebErrors = self.builder.get_object("ebErrors") + lErrors = self.builder.get_object("lErrors") + warning_lbl = None + for warning in warnings: + if warning_lbl: + warning_lbl += "\n* %s" % warning + else: + warning_lbl = "* %s" % warning + lErrors.set_label(warning_lbl) + ebErrors.show_all() + + def hide_warning(self): + ebErrors = self.builder.get_object("ebErrors") + lErrors = self.builder.get_object("lErrors") + ebErrors.hide() + + def allow_send(self): + self.hide_warning() + bSend = self.builder.get_object("bSend") + SendBacktrace = self.builder.get_object("cbSendBacktrace").get_active() + send = True + error_msgs = [] + try: + rating = self.report["rating"] + except: + rating = None + # active buttons acording to required fields + # if an backtrace has rating use it + if not SendBacktrace: + send = False + error_msgs.append(_("You must agree with submitting the backtrace.")) + # we have both SendBacktrace and rating + elif rating: + try: + package = self.report["package"][CD_CONTENT] + # if we don't have package for some reason + except: + package = None + # not usable report + if int(self.report["rating"][CD_CONTENT]) < 3: + if package: + error_msgs.append(_("Reporting disabled because the backtrace is unusable.\nPlease try to install debuginfo manually using command: <b>debuginfo-install %s</b> \nthen use Refresh button to regenerate the backtrace." % package[0:package.rfind('-',0,package.rfind('-'))])) + else: + error_msgs.append(_("The backtrace is unusable, you can't report this!")) + # probably usable 3 + elif int(self.report["rating"][CD_CONTENT]) < 4: + error_msgs.append(_("The backtrace is incomplete, please make sure you provide good steps to reproduce.")) + + if error_msgs: + self.warn_user(error_msgs) + bSend.set_sensitive(send) + + def on_send_backtrace_toggled(self, toggle_button): + self.allow_send() + def show_log_cb(self, widget, log): show_log(log, parent=self.window) # this callback is called when user press Cancel or Report button in Report dialog def on_response(self, dialog, response_id, daemon): # the button has been pressed (probably) - # print "response_id", response_id if response_id == gtk.RESPONSE_APPLY: if not (self.check_settings(daemon) and self.check_report()): dialog.stop_emission("response") - self.wTree.get_widget("bSend").stop_emission("clicked") + self.builder.get_object("bSend").stop_emission("clicked") if response_id == SHOW_LOG: # prevent dialog from quitting the run() dialog.stop_emission("response") @@ -113,16 +141,6 @@ class ReporterDialog(): widget.set_buffer(gtk.TextBuffer()) self.comment_changed = True - def on_window_resize(self, treeview, allocation): - # multine support - pass - #print allocation - - def column_edited(self, cell, path, new_text, model): - # 1 means the second cell - model[path][1] = new_text - return - def on_config_plugin_clicked(self, button, plugin, image): ui = PluginSettingsUI(plugin, parent=self.window) ui.hydrate() @@ -154,7 +172,6 @@ class ReporterDialog(): if reporter.Settings.check() == False: wrong_conf_plugs.append(reporter) - #gui_error_message(_("%s is not properly set!\nPlease check the settings and try to report again." % reporter)) if wrong_conf_plugs: gladefile = "%s%ssettings_wizard.glade" % (sys.path[0],"/") builder = gtk.Builder() @@ -187,8 +204,13 @@ class ReporterDialog(): def hydrate(self): self.editable = [] - self.reportListStore.clear() for item in self.report: + if item == "backtrace": + buff = gtk.TextBuffer() + tvBacktrace = self.builder.get_object("tvBacktrace") + buff.set_text(self.report[item][CD_CONTENT]) + tvBacktrace.set_buffer(buff) + continue if item == "Comment": buff = gtk.TextBuffer() comment = _("Brief description how to reproduce this or what you did...") @@ -217,60 +239,36 @@ class ReporterDialog(): self.tevHowToReproduce.set_buffer(buff) continue - # if an backtrace has rating use it - if item == "rating": - try: - package = self.report["package"][CD_CONTENT] - # if we don't have package for some reason - except: - package = None - ebErrors = self.wTree.get_widget("ebErrors") - fReproducer = self.wTree.get_widget("fReproducer") - fComments = self.wTree.get_widget("fComments") - lErrors = self.wTree.get_widget("lErrors") - bSend = self.wTree.get_widget("bSend") - # not usable report - if int(self.report[item][CD_CONTENT]) < 3: - ebErrors.show() - fReproducer.hide() - fComments.hide() - if package: - lErrors.set_markup( - _("Reporting disabled because the backtrace is unusable.\nPlease try to install debuginfo manually using command: <b>debuginfo-install %s</b> \nthen use Refresh button to regenerate the backtrace." % package[0:package.rfind('-',0,package.rfind('-'))])) - else: - lErrors.set_markup(_("The backtrace is unusable, you can't report this!")) - bSend.set_sensitive(False) - # probably usable 3 - elif int(self.report[item][CD_CONTENT]) < 4: - ebErrors.show() - lErrors.set_markup(_("The backtrace is incomplete, please make sure you provide good steps to reproduce.")) - bSend.set_sensitive(True) - else: - ebErrors.hide() - fReproducer.show() - fComments.show() - bSend.set_sensitive(True) if self.report[item][CD_TYPE] != CD_SYS: # item name 0| value 1| editable? 2| toggled? 3| visible?(attachment)4 - if self.report[item][CD_EDITABLE] == 'y': - self.editable.append(item) - self.row_dict[item] = self.reportListStore.append([item, self.report[item][CD_CONTENT], - item in self.editable, True, - self.report[item][CD_TYPE] in [CD_ATT,CD_BIN]]) + # FIXME: handle editable fields + if self.report[item][CD_TYPE] == CD_BIN: + self.builder.get_object("fAttachment").show() + vbAttachments = self.builder.get_object("vbAttachments") + toggle = gtk.CheckButton(self.report[item][CD_CONTENT]) + vbAttachments.pack_start(toggle) + # bind item to checkbox + toggle.item = item + toggle.show() + continue + item_label = self.builder.get_object("l%s" % item) + if item_label: + item_label.set_text(self.report[item][CD_CONTENT]) + else: + # no widget to show this item + # probably some new item need to adjust the GUI! + # FIXME: add some window+button to show all the info + # in raw form (smth like the old report dialog) + pass def dehydrate(self): - attributes = ["item", "content", "editable", "send", "attachment"] - for row in self.reportListStore: - rowe = dict(zip(attributes, row)) - if not rowe["editable"] and not rowe["attachment"]: - self.report[rowe["item"]][CD_CONTENT] = rowe["content"] - elif rowe["editable"] and not rowe["attachment"]: - self.report[rowe["item"]][CD_CONTENT] = rowe["content"] - elif (rowe["attachment"] or (rowe["editable"] and rowe["attachment"])) and rowe["send"]: - self.report[rowe["item"]][CD_CONTENT] = rowe["content"] - else: - del self.report[rowe["item"]] + # handle attachments + vbAttachments = self.builder.get_object("vbAttachments") + for attachment in vbAttachments.get_children(): + #print "%s file %s" % (["not sending","sending"][attachment.get_active()], attachment.get_label()) + del self.report[attachment.item] + # handle comment if self.comment_changed: buff = self.tvComment.get_buffer() @@ -283,22 +281,14 @@ class ReporterDialog(): self.report["How to reproduce"] = [CD_TXT, 'y', buff.get_text(buff.get_start_iter(),buff.get_end_iter())] else: del self.report["How to reproduce"] + #handle backtrace + tev_backtrace = self.builder.get_object("tvBacktrace") + buff = tev_backtrace.get_buffer() + self.report["backtrace"] = [CD_TXT, 'y', buff.get_text(buff.get_start_iter(),buff.get_end_iter())] def check_report(self): - # FIXME: what to do if user press "Not to send BT and then press cancel" - # it uncheck the backtrace and let him to edit it, and then user might - # not noticed, that he is not sending the BT, so should we warn user about this - # or check the BT automatically? - attributes = ["item", "content", "editable", "send", "attachment"] - for row in self.reportListStore: - rowe = dict(zip(attributes, row)) - if (rowe["attachment"] or (rowe["editable"] and rowe["attachment"])) and rowe["send"]: - result = gui_question_dialog(_("<b>WARNING</b>, you're about to send data which might contain sensitive information.\n" - "Do you really want to send <b>%s</b>?\n" % rowe["item"]), self.window) - if result == gtk.RESPONSE_NO: - row[attributes.index("send")] = False - if result in (gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT): - return False + # FIXME: check the report for passwords and some other potentially + # sensitive info self.dehydrate() return True diff --git a/src/Gui/CC_gui_functions.py b/src/Gui/CC_gui_functions.py index 0379f20..a9c47fa 100644 --- a/src/Gui/CC_gui_functions.py +++ b/src/Gui/CC_gui_functions.py @@ -234,5 +234,5 @@ def show_log(log, parent=None): if __name__ == "__main__": window = gtk.Window() - gui_report_dialog("<b>Bugzilla</b>: <span foreground='red'>CReporterBugzilla::Report(): CReporterBugzilla::Login(): RPC response indicates failure. The username or password you entered is not valid.</span>\n<b>Logger</b>: Report was stored into: /var/log/abrt-logger", window) + gui_report_dialog("<b>Bugzilla</b>: <span foreground='red'>CReporterBugzilla::Report(): CReporterBugzilla::Login(): RPC response indicates failure. The username or password you entered is not valid.</span>\n<b>Logger</b>: Report was stored into: /var/log/abrt.log", window) gtk.main() diff --git a/src/Gui/Makefile.am b/src/Gui/Makefile.am index 60a7bfe..3cac1ee 100644 --- a/src/Gui/Makefile.am +++ b/src/Gui/Makefile.am @@ -3,7 +3,7 @@ bin_SCRIPTS = abrt-gui PYTHON_FILES = CCDBusBackend.py CCDumpList.py CCDump.py CC_gui_functions.py \ - CCReporterDialog.py CCReport.py abrt_utils.py \ + CCReporterDialog.py abrt_utils.py \ CCMainWindow.py CellRenderers.py ABRTExceptions.py \ SettingsDialog.py ABRTPlugin.py PluginList.py PluginSettingsUI.py \ PluginsSettingsDialog.py ConfBackend.py diff --git a/src/Gui/abrt_utils.py b/src/Gui/abrt_utils.py index 2fabb54..3b0bb79 100644 --- a/src/Gui/abrt_utils.py +++ b/src/Gui/abrt_utils.py @@ -1,5 +1,4 @@ import sys -import gtk.glade PROGNAME = "abrt" g_verbose = 0 @@ -10,6 +9,7 @@ import gettext _ = lambda x: gettext.lgettext(x) def init_logging(progname, v): + import gtk.glade global PROGNAME, g_verbose PROGNAME = progname g_verbose = v diff --git a/src/Gui/dialogs.glade b/src/Gui/dialogs.glade index 77e78dd..cf33a49 100644 --- a/src/Gui/dialogs.glade +++ b/src/Gui/dialogs.glade @@ -76,6 +76,7 @@ </object> <object class="GtkDialog" id="LogViewer"> <property name="border_width">5</property> + <property name="type">popup</property> <property name="title" translatable="yes">Log</property> <property name="modal">True</property> <property name="default_width">450</property> diff --git a/src/Gui/report.glade b/src/Gui/report.glade index 0eae1f1..d3bf5eb 100644 --- a/src/Gui/report.glade +++ b/src/Gui/report.glade @@ -1,225 +1,580 @@ <?xml version="1.0"?> -<glade-interface> - <!-- interface-requires gtk+ 2.16 --> - <!-- interface-naming-policy toplevel-contextual --> - <widget class="GtkDialog" id="reporter_dialog"> - <property name="border_width">6</property> - <property name="title" translatable="yes">Report</property> - <property name="modal">True</property> - <property name="window_position">center-on-parent</property> - <property name="default_width">400</property> - <property name="default_height">400</property> +<interface> + <requires lib="gtk+" version="2.16"/> + <!-- interface-naming-policy project-wide --> + <object class="GtkDialog" id="reporter_dialog"> + <property name="border_width">5</property> + <property name="title" translatable="yes">Automatic Bug Reporting Tool</property> <property name="type_hint">normal</property> <property name="has_separator">False</property> <child internal-child="vbox"> - <widget class="GtkVBox" id="dialog-vbox4"> + <object class="GtkVBox" id="dialog-vbox1"> <property name="visible">True</property> <property name="orientation">vertical</property> - <property name="spacing">12</property> + <property name="spacing">2</property> <child> - <widget class="GtkVBox" id="vbox1"> + <object class="GtkVBox" id="vbox1"> <property name="visible">True</property> <property name="orientation">vertical</property> - <property name="spacing">12</property> <child> - <widget class="GtkVBox" id="vboxNonError"> + <object class="GtkFrame" id="fSysInfo"> <property name="visible">True</property> - <property name="orientation">vertical</property> - <property name="spacing">12</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> <child> - <widget class="GtkFrame" id="frame1"> + <object class="GtkAlignment" id="alignment1"> <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> + <property name="left_padding">12</property> <child> - <widget class="GtkAlignment" id="alignment3"> + <object class="GtkHBox" id="hbox1"> <property name="visible">True</property> - <property name="left_padding">12</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow5"> + <object class="GtkVBox" id="vbox3"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> - <property name="shadow_type">in</property> + <property name="orientation">vertical</property> <child> - <widget class="GtkTreeView" id="tvReport"> + <object class="GtkLabel" id="l"> <property name="visible">True</property> - <property name="can_focus">True</property> - </widget> + <property name="xalign">0</property> + <property name="label" translatable="yes"><span fgcolor="blue">Package:</span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><span fgcolor="blue">Component:</span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><span fgcolor="blue">Executable:</span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">2</property> + </packing> </child> - </widget> + <child> + <object class="GtkLabel" id="label9"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><span fgcolor="blue">Cmdline:</span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="position">0</property> + </packing> </child> - </widget> - </child> - <child> - <widget class="GtkLabel" id="label3"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>Following items will be sent</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> + <child> + <object class="GtkVBox" id="vbox4"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkLabel" id="lpackage"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">N/A</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lcomponent"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">N/A</property> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lexecutable"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">N/A</property> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lcmdline"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">N/A</property> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox5"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><span fgcolor="blue">Architecture:</span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label10"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><span fgcolor="blue">Kernel:</span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label11"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><span fgcolor="blue">Release:</span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label13"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="label" translatable="yes"><span fgcolor="blue">Reason:</span></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkVBox" id="vbox6"> + <property name="visible">True</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="larchitecture"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">N/A</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lkernel"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">N/A</property> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lrelease"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">N/A</property> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lreason"> + <property name="visible">True</property> + <property name="xalign">0</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">N/A</property> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + </object> + <packing> + <property name="position">3</property> + </packing> + </child> + </object> </child> - </widget> - <packing> - <property name="position">0</property> - </packing> + </object> </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="ypad">5</property> + <property name="label" translatable="yes"><b>General information</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="fBacktrace"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> <child> - <widget class="GtkFrame" id="fReproducer"> + <object class="GtkAlignment" id="alignment2"> <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> + <property name="left_padding">12</property> <child> - <widget class="GtkAlignment" id="alignment1"> + <object class="GtkVBox" id="vbox7"> <property name="visible">True</property> - <property name="left_padding">12</property> + <property name="orientation">vertical</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow3"> + <object class="GtkScrolledWindow" id="scrolledwindow1"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="hscrollbar_policy">automatic</property> <property name="vscrollbar_policy">automatic</property> <child> - <widget class="GtkViewport" id="viewport1"> + <object class="GtkTextView" id="tvBacktrace"> + <property name="height_request">200</property> <property name="visible">True</property> - <property name="resize_mode">queue</property> - <child> - <widget class="GtkTextView" id="tevHowToReproduce"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="wrap_mode">word-char</property> - </widget> - </child> - </widget> + <property name="can_focus">True</property> + </object> </child> - </widget> + </object> + <packing> + <property name="position">0</property> + </packing> </child> - </widget> - </child> - <child> - <widget class="GtkLabel" id="label1"> - <property name="visible">True</property> - <property name="label" translatable="yes"><b>How to reproduce (in a few simple steps)</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> + <child> + <object class="GtkCheckButton" id="cbSendBacktrace"> + <property name="label" translatable="yes">I agree to submit this backtrace, which could contain sensitive data</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> + </object> </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> + </object> </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="ypad">5</property> + <property name="label" translatable="yes"><b>Backtrace</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> <child> - <widget class="GtkFrame" id="fComments"> + <object class="GtkAlignment" id="alignment3"> <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="shadow_type">none</property> + <property name="left_padding">12</property> <child> - <widget class="GtkAlignment" id="alignment2"> + <object class="GtkVBox" id="vbox2"> <property name="visible">True</property> - <property name="left_padding">12</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow2"> + <object class="GtkVBox" id="vboxNonError"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="hscrollbar_policy">automatic</property> - <property name="vscrollbar_policy">automatic</property> + <property name="orientation">vertical</property> + <property name="spacing">12</property> + <child> + <object class="GtkFrame" id="fReproducer"> + <property name="visible">True</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment5"> + <property name="visible">True</property> + <property name="left_padding">12</property> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <object class="GtkViewport" id="viewport1"> + <property name="visible">True</property> + <property name="resize_mode">queue</property> + <child> + <object class="GtkTextView" id="tevHowToReproduce"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="wrap_mode">word-char</property> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>How to reproduce (in a few simple steps)</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> <child> - <widget class="GtkViewport" id="viewport2"> + <object class="GtkFrame" id="fComments"> <property name="visible">True</property> - <property name="resize_mode">queue</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> <child> - <widget class="GtkTextView" id="tvComment"> + <object class="GtkAlignment" id="alignment6"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="wrap_mode">word-char</property> - </widget> + <property name="left_padding">12</property> + <child> + <object class="GtkScrolledWindow" id="scrolledwindow2"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="hscrollbar_policy">automatic</property> + <property name="vscrollbar_policy">automatic</property> + <child> + <object class="GtkViewport" id="viewport2"> + <property name="visible">True</property> + <property name="resize_mode">queue</property> + <child> + <object class="GtkTextView" id="tvComment"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="wrap_mode">word-char</property> + </object> + </child> + </object> + </child> + </object> + </child> + </object> </child> - </widget> + <child type="label"> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Comment</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> </child> - </widget> + </object> + <packing> + <property name="position">0</property> + </packing> </child> - </widget> + </object> </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="ypad">5</property> + <property name="label" translatable="yes"><b>User information</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="fAttachment"> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment4"> + <property name="visible">True</property> + <property name="left_padding">12</property> <child> - <widget class="GtkLabel" id="label2"> + <object class="GtkVBox" id="vbAttachments"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>Comment</b></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="type">label_item</property> - </packing> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + </object> </child> - </widget> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="fAttachments"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Attachments</b></property> + <property name="use_markup">True</property> + </object> </child> - </widget> + </object> <packing> - <property name="position">0</property> + <property name="position">3</property> </packing> </child> <child> - <widget class="GtkHBox" id="ebErrors"> + <object class="GtkHBox" id="ebErrors"> <property name="visible">True</property> - <property name="spacing">12</property> <child> - <widget class="GtkImage" id="image1"> + <object class="GtkAlignment" id="alignment7"> + <property name="visible">True</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkImage" id="image1"> <property name="visible">True</property> <property name="stock">gtk-dialog-warning</property> <property name="icon-size">6</property> - </widget> + </object> <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">0</property> + <property name="position">1</property> </packing> </child> <child> - <widget class="GtkLabel" id="lErrors"> + <object class="GtkVBox" id="vbox8"> <property name="visible">True</property> - <property name="label" translatable="yes"> </property> - <property name="use_markup">True</property> - </widget> + <property name="orientation">vertical</property> + <child> + <object class="GtkLabel" id="label12"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Please fix the following problems</b></property> + <property name="use_markup">True</property> + </object> + <packing> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="lErrors"> + <property name="visible">True</property> + <property name="label" translatable="yes"> </property> + <property name="use_markup">True</property> + <property name="selectable">True</property> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + </object> <packing> - <property name="position">1</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkAlignment" id="alignment8"> + <property name="visible">True</property> + <child> + <placeholder/> + </child> + </object> + <packing> + <property name="position">3</property> </packing> </child> - </widget> + </object> <packing> <property name="expand">False</property> <property name="fill">False</property> - <property name="position">1</property> + <property name="position">4</property> </packing> </child> - </widget> + </object> <packing> - <property name="position">0</property> + <property name="position">1</property> </packing> </child> <child internal-child="action_area"> - <widget class="GtkHButtonBox" id="dialog-action_area4"> + <object class="GtkHButtonBox" id="dialog-action_area1"> <property name="visible">True</property> <property name="layout_style">end</property> <child> - <widget class="GtkButton" id="bLog"> + <object class="GtkButton" id="bLog"> <property name="label" translatable="yes">Log</property> - <property name="response_id">-60</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - </widget> + </object> <packing> <property name="expand">False</property> <property name="fill">False</property> @@ -227,14 +582,13 @@ </packing> </child> <child> - <widget class="GtkButton" id="bCancel"> + <object class="GtkButton" id="bCancel"> <property name="label">gtk-cancel</property> - <property name="response_id">-6</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> - </widget> + </object> <packing> <property name="expand">False</property> <property name="fill">False</property> @@ -242,14 +596,13 @@ </packing> </child> <child> - <widget class="GtkButton" id="bRefresh"> + <object class="GtkButton" id="bRefresh"> <property name="label">gtk-refresh</property> - <property name="response_id">-50</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> <property name="use_stock">True</property> - </widget> + </object> <packing> <property name="expand">False</property> <property name="fill">False</property> @@ -257,27 +610,32 @@ </packing> </child> <child> - <widget class="GtkButton" id="bSend"> + <object class="GtkButton" id="bSend"> <property name="label" translatable="yes">Send</property> - <property name="response_id">-10</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="receives_default">True</property> - </widget> + </object> <packing> <property name="expand">False</property> <property name="fill">False</property> <property name="position">3</property> </packing> </child> - </widget> + </object> <packing> <property name="expand">False</property> <property name="pack_type">end</property> - <property name="position">1</property> + <property name="position">0</property> </packing> </child> - </widget> + </object> </child> - </widget> -</glade-interface> + <action-widgets> + <action-widget response="-60">bLog</action-widget> + <action-widget response="-6">bCancel</action-widget> + <action-widget response="-50">bRefresh</action-widget> + <action-widget response="-10">bSend</action-widget> + </action-widgets> + </object> +</interface> |
