From b105a2a9e9068463eaad97b402209e3b944b6501 Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Sun, 22 Jun 2008 21:18:29 +0200 Subject: First mail window draft --- portato/gui/exception_handling.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'portato/gui/exception_handling.py') diff --git a/portato/gui/exception_handling.py b/portato/gui/exception_handling.py index 29cd4e6..5d5eb17 100644 --- a/portato/gui/exception_handling.py +++ b/portato/gui/exception_handling.py @@ -21,6 +21,7 @@ from StringIO import StringIO from ..helper import debug, error from .dialogs import file_chooser_dialog, io_ex_dialog +from .windows.mailinfo import MailInfoWindow # for the i18n from ..constants import LOCALE_DIR, APP @@ -53,6 +54,7 @@ class UncaughtExceptionDialog(gtk.MessageDialog): self.format_secondary_text(_("It probably isn't fatal, but should be reported to the developers nonetheless.")) self.add_button(_("Show Details"), 1) + self.add_button(_("Send..."), 3) self.add_button(gtk.STOCK_SAVE_AS, 2) self.add_button(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE) @@ -103,6 +105,9 @@ class UncaughtExceptionDialog(gtk.MessageDialog): else: debug("Nothing to save") + elif resp == 3: + debug("Send bug per mail") + MailInfoWindow(self, self.text) else: break self.destroy() -- cgit v1.2.3-54-g00ecf From fcd88477de3b0fddb695693f3580c9a243d02296 Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Sun, 22 Jun 2008 23:40:10 +0200 Subject: Implemented the mail sending --- portato/gui/exception_handling.py | 7 +++-- portato/gui/windows/mailinfo.py | 59 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 63 insertions(+), 3 deletions(-) (limited to 'portato/gui/exception_handling.py') diff --git a/portato/gui/exception_handling.py b/portato/gui/exception_handling.py index 5d5eb17..9a593c1 100644 --- a/portato/gui/exception_handling.py +++ b/portato/gui/exception_handling.py @@ -21,7 +21,6 @@ from StringIO import StringIO from ..helper import debug, error from .dialogs import file_chooser_dialog, io_ex_dialog -from .windows.mailinfo import MailInfoWindow # for the i18n from ..constants import LOCALE_DIR, APP @@ -44,6 +43,8 @@ class GtkThread (Thread): finally: del type, val, tb +from .windows.mailinfo import MailInfoWindow + class UncaughtExceptionDialog(gtk.MessageDialog): """Original idea by Gustavo Carneiro - original code: http://www.daa.com.au/pipermail/pygtk/attachments/20030828/2d304204/gtkexcepthook.py.""" @@ -107,7 +108,9 @@ class UncaughtExceptionDialog(gtk.MessageDialog): debug("Nothing to save") elif resp == 3: debug("Send bug per mail") - MailInfoWindow(self, self.text) + self.destroy() + MailInfoWindow(None, self.text) + return else: break self.destroy() diff --git a/portato/gui/windows/mailinfo.py b/portato/gui/windows/mailinfo.py index 45b4273..ebecf35 100644 --- a/portato/gui/windows/mailinfo.py +++ b/portato/gui/windows/mailinfo.py @@ -13,18 +13,75 @@ from __future__ import absolute_import import gtk +import smtplib +import time from .basic import AbstractDialog +from ..exception_handling import GtkThread from ...helper import debug +from ...constants import VERSION class MailInfoWindow (AbstractDialog): + TO = "bugs@portato.necoro.net" def __init__ (self, parent, tb): AbstractDialog.__init__(self, parent) + + self.tb = tb self.window.show_all() - def cb_cancel_clicked (self): + def set_data (self): + name = self.tree.get_widget("nameEntry").get_text() + addr = self.tree.get_widget("mailEntry").get_text() + if not addr: + addr = self.TO + + if name: + fro = "%s <%s>" % (name, addr) + else: + fro = addr + + commentBuffer = self.tree.get_widget("commentEntry").get_buffer() + text = commentBuffer.get_text(*commentBuffer.get_bounds()) + + if text: + text += "\n\n===========\n" + + text += self.tb + + message = """From: %s +To: %s +Subject: %s +%s""" % ( fro, self.TO, ("[Bug Report] Bug in Portato %s" % VERSION), text) + + self.addr = addr + self.message = message + + def send (self): + debug("Connecting to server") + server = smtplib.SMTP("mail.necoro.eu") + debug("Sending mail") + try: + try: + server.sendmail(self.addr, self.TO, self.message) + except smtplib.SMTPRecipientsRefused, e: + info(_("An error occurred while sending. I think we where greylisted. The error: %s") % e) + info(_("Wait 60 seconds and try again.")) + time.sleep(60) + server.sendmail(self.addr, self.TO, self.message) + debug("Sent") + finally: + server.quit() + + def cb_cancel_clicked (self, *args): + + self.close() + return True + + def cb_send_clicked (self, *args): + self.set_data() + GtkThread(target = self.send, name = "Mail Send Thread").start() self.close() return True -- cgit v1.2.3-54-g00ecf From e021fff1ef2be1327b3edc2bb43332753a1fff16 Mon Sep 17 00:00:00 2001 From: René 'Necoro' Neumann Date: Mon, 23 Jun 2008 22:02:44 +0200 Subject: Moved GtkThread to gui.utils --- portato/gui/exception_handling.py | 24 +----------------------- portato/gui/utils.py | 23 +++++++++++++++++++++-- portato/gui/windows/mailinfo.py | 2 +- portato/gui/windows/main.py | 3 +-- portato/plugins/new_version.py | 2 +- 5 files changed, 25 insertions(+), 29 deletions(-) (limited to 'portato/gui/exception_handling.py') diff --git a/portato/gui/exception_handling.py b/portato/gui/exception_handling.py index 9a593c1..eadf124 100644 --- a/portato/gui/exception_handling.py +++ b/portato/gui/exception_handling.py @@ -16,34 +16,12 @@ from __future__ import absolute_import, with_statement import gtk, pango, gobject import sys, traceback -from threading import Thread from StringIO import StringIO from ..helper import debug, error from .dialogs import file_chooser_dialog, io_ex_dialog - -# for the i18n -from ..constants import LOCALE_DIR, APP -import gettext - -class GtkThread (Thread): - def run(self): - # for some reason, I have to install this for each thread ... - gettext.install(APP, LOCALE_DIR, unicode = True) - try: - Thread.run(self) - except SystemExit: - raise # let normal thread handle it - except: - type, val, tb = sys.exc_info() - try: - sys.excepthook(type, val, tb, thread = self.getName()) - except TypeError: - raise type, val, tb # let normal thread handle it - finally: - del type, val, tb - from .windows.mailinfo import MailInfoWindow +from .utils import GtkThread class UncaughtExceptionDialog(gtk.MessageDialog): """Original idea by Gustavo Carneiro - original code: http://www.daa.com.au/pipermail/pygtk/attachments/20030828/2d304204/gtkexcepthook.py.""" diff --git a/portato/gui/utils.py b/portato/gui/utils.py index 0a2930b..6e04814 100644 --- a/portato/gui/utils.py +++ b/portato/gui/utils.py @@ -14,19 +14,38 @@ from __future__ import absolute_import, with_statement # some stuff needed import re +import sys import logging +import gettext from collections import defaultdict -from threading import RLock +from threading import Thread, RLock from functools import wraps # some backend things from ..backend import flags, system, set_system from ..helper import debug, info, set_log_level -from ..constants import USE_CATAPULT +from ..constants import USE_CATAPULT, APP, LOCALE_DIR # parser from ..config_parser import ConfigParser +class GtkThread (Thread): + def run(self): + # for some reason, I have to install this for each thread ... + gettext.install(APP, LOCALE_DIR, unicode = True) + try: + Thread.run(self) + except SystemExit: + raise # let normal thread handle it + except: + type, val, tb = sys.exc_info() + try: + sys.excepthook(type, val, tb, thread = self.getName()) + except TypeError: + raise type, val, tb # let normal thread handle it + finally: + del type, val, tb + class Config (ConfigParser): def __init__ (self, cfgFile): diff --git a/portato/gui/windows/mailinfo.py b/portato/gui/windows/mailinfo.py index ebecf35..93d2be4 100644 --- a/portato/gui/windows/mailinfo.py +++ b/portato/gui/windows/mailinfo.py @@ -17,7 +17,7 @@ import smtplib import time from .basic import AbstractDialog -from ..exception_handling import GtkThread +from ..utils import GtkThread from ...helper import debug from ...constants import VERSION diff --git a/portato/gui/windows/main.py b/portato/gui/windows/main.py index b675d17..8e5eafb 100644 --- a/portato/gui/windows/main.py +++ b/portato/gui/windows/main.py @@ -30,11 +30,10 @@ from ...constants import CONFIG_LOCATION, VERSION, APP_ICON, ICON_DIR from ...backend.exceptions import PackageNotFoundException, BlockedException # more GUI stuff -from ..utils import Database, Config +from ..utils import Database, Config, GtkThread from ..queue import EmergeQueue from ..session import SESSION_VERSION, SessionException, OldSessionException, NewSessionException from ..wrapper import GtkTree, GtkConsole -from ..exception_handling import GtkThread from ..views import LogView, HighlightView, InstalledOnlyView from ..dialogs import (blocked_dialog, changed_flags_dialog, io_ex_dialog, nothing_found_dialog, queue_not_empty_dialog, remove_deps_dialog, diff --git a/portato/plugins/new_version.py b/portato/plugins/new_version.py index 462d67c..fe69292 100644 --- a/portato/plugins/new_version.py +++ b/portato/plugins/new_version.py @@ -7,7 +7,7 @@ import gobject from portato.helper import debug, warning from portato import get_listener from portato.constants import VERSION, APP_ICON, APP -from portato.gui.exception_handling import GtkThread +from portato.gui.utils import GtkThread def find_version (rev): try: -- cgit v1.2.3-54-g00ecf