support messages sending and several minor features

This commit is contained in:
Romain Bignon 2010-10-04 22:28:29 +02:00
commit dfa0d2be82
2 changed files with 290 additions and 117 deletions

View file

@ -16,11 +16,12 @@
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
import time import time
import logging
from PyQt4.QtGui import QWidget, QTreeWidgetItem, QListWidgetItem from PyQt4.QtGui import QWidget, QTreeWidgetItem, QListWidgetItem, QMessageBox
from PyQt4.QtCore import SIGNAL, Qt from PyQt4.QtCore import SIGNAL, Qt
from weboob.capabilities.messages import ICapMessages from weboob.capabilities.messages import ICapMessages, Message
from weboob.tools.application.qt import QtDo from weboob.tools.application.qt import QtDo
from .ui.messages_manager_ui import Ui_MessagesManager from .ui.messages_manager_ui import Ui_MessagesManager
@ -44,11 +45,18 @@ class MessagesManager(QWidget):
self.ui.backendsList.setCurrentRow(0) self.ui.backendsList.setCurrentRow(0)
self.backend = None self.backend = None
self.thread = None
self.message = None
self.ui.replyButton.setEnabled(False)
self.ui.replyWidget.hide()
self.connect(self.ui.backendsList, SIGNAL('itemSelectionChanged()'), self._backendChanged) self.connect(self.ui.backendsList, SIGNAL('itemSelectionChanged()'), self._backendChanged)
self.connect(self.ui.threadsList, SIGNAL('itemSelectionChanged()'), self._threadChanged) self.connect(self.ui.threadsList, SIGNAL('itemSelectionChanged()'), self._threadChanged)
self.connect(self.ui.messagesTree, SIGNAL('itemClicked(QTreeWidgetItem *, int)'), self._messageSelected) self.connect(self.ui.messagesTree, SIGNAL('itemClicked(QTreeWidgetItem *, int)'), self._messageSelected)
self.connect(self.ui.messagesTree, SIGNAL('itemActivated(QTreeWidgetItem *, int)'), self._messageSelected) self.connect(self.ui.messagesTree, SIGNAL('itemActivated(QTreeWidgetItem *, int)'), self._messageSelected)
self.connect(self.ui.replyButton, SIGNAL('clicked()'), self._replyPressed)
self.connect(self.ui.sendButton, SIGNAL('clicked()'), self._sendPressed)
def load(self): def load(self):
self.refreshThreads() self.refreshThreads()
@ -66,12 +74,19 @@ class MessagesManager(QWidget):
self.ui.messagesTree.clear() self.ui.messagesTree.clear()
self.ui.threadsList.clear() self.ui.threadsList.clear()
self.hideReply()
self.ui.replyButton.setEnabled(False)
self.ui.backendsList.setEnabled(False)
self.ui.threadsList.setEnabled(False)
self.process_threads = QtDo(self.weboob, self._gotThread) self.process_threads = QtDo(self.weboob, self._gotThread)
self.process_threads.do('iter_threads', backends=self.backend, caps=ICapMessages) self.process_threads.do('iter_threads', backends=self.backend, caps=ICapMessages)
def _gotThread(self, backend, thread): def _gotThread(self, backend, thread):
if not backend: if not backend:
self.process_threads = None self.process_threads = None
self.ui.backendsList.setEnabled(True)
self.ui.threadsList.setEnabled(True)
return return
item = QListWidgetItem(thread.title) item = QListWidgetItem(thread.title)
@ -85,12 +100,14 @@ class MessagesManager(QWidget):
return return
t = selection[0].data(Qt.UserRole).toPyObject() t = selection[0].data(Qt.UserRole).toPyObject()
print t
self.refreshThreadMessages(*t) self.refreshThreadMessages(*t)
def refreshThreadMessages(self, backend, id): def refreshThreadMessages(self, backend, id):
self.ui.messagesTree.clear()
self.ui.backendsList.setEnabled(False) self.ui.backendsList.setEnabled(False)
self.ui.threadsList.setEnabled(False) self.ui.threadsList.setEnabled(False)
self.ui.replyButton.setEnabled(False)
self.hideReply()
self.process = QtDo(self.weboob, self._gotThreadMessages) self.process = QtDo(self.weboob, self._gotThreadMessages)
self.process.do('get_thread', id, backends=backend) self.process.do('get_thread', id, backends=backend)
@ -102,11 +119,13 @@ class MessagesManager(QWidget):
self.process = None self.process = None
return return
self.thread = thread
self.showMessage(thread.root)
self._insert_message(thread.root, self.ui.messagesTree.invisibleRootItem()) self._insert_message(thread.root, self.ui.messagesTree.invisibleRootItem())
def _insert_message(self, message, top): def _insert_message(self, message, top):
item = QTreeWidgetItem(None, [time.strftime('%Y-%m-%d %H:%M:%S', message.date.timetuple()), item = QTreeWidgetItem(None, [message.title, message.sender,
message.sender, message.title]) time.strftime('%Y-%m-%d %H:%M:%S', message.date.timetuple())])
item.setData(0, Qt.UserRole, message) item.setData(0, Qt.UserRole, message)
top.addChild(item) top.addChild(item)
@ -116,12 +135,101 @@ class MessagesManager(QWidget):
def _messageSelected(self, item, column): def _messageSelected(self, item, column):
message = item.data(0, Qt.UserRole).toPyObject() message = item.data(0, Qt.UserRole).toPyObject()
self.showMessage(message)
def showMessage(self, message):
self.ui.replyButton.setEnabled(True)
self.message = message
if message.title.startswith('Re:'):
self.ui.titleEdit.setText(message.title)
else:
self.ui.titleEdit.setText('Re: %s' % message.title)
if message.flags & message.IS_HTML: if message.flags & message.IS_HTML:
content = message.content content = message.content
else: else:
content = message.content.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;') content = message.content.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;')
extra = u''
if message.flags & message.IS_NOT_ACCUSED:
extra += u'<b>Status</b>: <font color=#ff0000>Unread</font><br />'
elif message.flags & message.IS_ACCUSED:
extra += u'<b>Status</b>: <font color=#00ff00>Read</font><br />'
elif message.flags & message.IS_UNREAD:
extra += u'<b>Status</b>: <font color=#0000ff>New</font><br />'
self.ui.messageBody.setText("<h1>%s</h1>" self.ui.messageBody.setText("<h1>%s</h1>"
"<b>Date</b>: %s<br />" "<b>Date</b>: %s<br />"
"<b>From</b>: %s<br />" "<b>From</b>: %s<br />"
"%s"
"<p>%s</p>" "<p>%s</p>"
% (message.title, str(message.date), message.sender, content)) % (message.title, str(message.date), message.sender, extra, content))
def displayReply(self):
self.ui.replyButton.setText(self.tr('Cancel'))
self.ui.replyWidget.show()
def hideReply(self):
self.ui.replyButton.setText(self.tr('Reply'))
self.ui.replyWidget.hide()
self.ui.replyEdit.clear()
self.ui.titleEdit.clear()
def _replyPressed(self):
if self.ui.replyWidget.isVisible():
self.hideReply()
else:
self.displayReply()
def _sendPressed(self):
if not self.ui.replyWidget.isVisible():
return
text = unicode(self.ui.replyEdit.toPlainText())
title = unicode(self.ui.titleEdit.text())
self.ui.replyButton.setEnabled(False)
self.ui.titleEdit.setEnabled(False)
self.ui.replyEdit.setEnabled(False)
self.ui.sendButton.setEnabled(False)
self.ui.sendButton.setText(self.tr('Sending...'))
m = Message(thread=self.thread,
id=0,
title=title,
sender=None,
receiver=None,
content=text,
parent=self.message)
self.process_reply = QtDo(self.weboob, self._postReply_cb, self._postReply_eb)
self.process_reply.do('post_message', m, backends=self.thread.backend)
def _postReply_cb(self, backend, ignored):
self.ui.replyButton.setEnabled(True)
self.ui.titleEdit.setEnabled(True)
self.ui.titleEdit.clear()
self.ui.replyEdit.setEnabled(True)
self.ui.replyEdit.clear()
self.ui.sendButton.setEnabled(True)
self.ui.sendButton.setText(self.tr('Send'))
self.hideReply()
self.process_reply = None
self.refreshThreadMessages(backend.name, self.thread.id)
def _postReply_eb(self, backend, error, backtrace):
content = unicode(self.tr('Unable to send message:\n%s\n')) % error
if logging.root.level == logging.DEBUG:
content += '\n%s\n' % backtrace
QMessageBox.critical(self, self.tr('Error while posting reply'),
content, QMessageBox.Ok)
self.ui.replyButton.setEnabled(True)
self.ui.titleEdit.setEnabled(True)
self.ui.titleEdit.clear()
self.ui.replyEdit.setEnabled(True)
self.ui.replyEdit.clear()
self.ui.sendButton.setEnabled(True)
self.ui.sendButton.setText(self.tr('Send'))
self.process_reply = None

View file

@ -13,29 +13,29 @@
<property name="windowTitle"> <property name="windowTitle">
<string/> <string/>
</property> </property>
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QSplitter" name="splitter_3"> <widget class="QSplitter" name="splitter_4">
<property name="orientation"> <property name="orientation">
<enum>Qt::Horizontal</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<widget class="QListWidget" name="backendsList"> <widget class="QListWidget" name="backendsList">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Maximum" vsizetype="Maximum"> <sizepolicy hsizetype="Fixed" vsizetype="Maximum">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
</widget> <property name="maximumSize">
<widget class="QSplitter" name="splitter_2"> <size>
<property name="sizePolicy"> <width>150</width>
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <height>16777215</height>
<horstretch>10</horstretch> </size>
<verstretch>0</verstretch>
</sizepolicy>
</property> </property>
</widget>
<widget class="QSplitter" name="splitter_3">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<widget class="QSplitter" name="splitter"> <widget class="QSplitter" name="splitter">
<property name="orientation"> <property name="orientation">
@ -49,71 +49,14 @@
</sizepolicy> </sizepolicy>
</property> </property>
</widget> </widget>
<widget class="QTreeWidget" name="messagesTree"> <widget class="QWidget" name="widget" native="true">
<property name="editTriggers"> <layout class="QVBoxLayout" name="verticalLayout_3">
<set>QAbstractItemView::NoEditTriggers</set> <property name="spacing">
<number>5</number>
</property> </property>
<property name="tabKeyNavigation"> <property name="margin">
<bool>true</bool> <number>0</number>
</property> </property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="animated">
<bool>true</bool>
</property>
<property name="headerHidden">
<bool>false</bool>
</property>
<attribute name="headerDefaultSectionSize">
<number>100</number>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>true</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>true</bool>
</attribute>
<attribute name="headerDefaultSectionSize">
<number>100</number>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>true</bool>
</attribute>
<attribute name="headerStretchLastSection">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string>Date</string>
</property>
<property name="textAlignment">
<set>AlignLeft|AlignVCenter</set>
</property>
</column>
<column>
<property name="text">
<string>From</string>
</property>
</column>
<column>
<property name="text">
<string>Title</string>
</property>
</column>
</widget>
</widget>
<widget class="QTextEdit" name="messageBody">
<property name="readOnly">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property>
</widget>
</widget>
</widget>
</item>
<item> <item>
<widget class="QFrame" name="frame"> <widget class="QFrame" name="frame">
<property name="frameShape"> <property name="frameShape">
@ -122,7 +65,19 @@
<property name="frameShadow"> <property name="frameShadow">
<enum>QFrame::Raised</enum> <enum>QFrame::Raised</enum>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<property name="leftMargin">
<number>9</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>9</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item> <item>
<widget class="QToolButton" name="expandButton"> <widget class="QToolButton" name="expandButton">
<property name="sizePolicy"> <property name="sizePolicy">
@ -150,14 +105,14 @@
</widget> </widget>
</item> </item>
<item> <item>
<spacer name="verticalSpacer"> <spacer name="horizontalSpacer">
<property name="orientation"> <property name="orientation">
<enum>Qt::Vertical</enum> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="sizeHint" stdset="0">
<size> <size>
<width>20</width> <width>40</width>
<height>40</height> <height>20</height>
</size> </size>
</property> </property>
</spacer> </spacer>
@ -165,6 +120,116 @@
</layout> </layout>
</widget> </widget>
</item> </item>
<item>
<widget class="QTreeWidget" name="messagesTree">
<property name="editTriggers">
<set>QAbstractItemView::NoEditTriggers</set>
</property>
<property name="tabKeyNavigation">
<bool>true</bool>
</property>
<property name="sortingEnabled">
<bool>true</bool>
</property>
<property name="animated">
<bool>true</bool>
</property>
<property name="allColumnsShowFocus">
<bool>true</bool>
</property>
<attribute name="headerDefaultSectionSize">
<number>150</number>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>true</bool>
</attribute>
<attribute name="headerDefaultSectionSize">
<number>150</number>
</attribute>
<attribute name="headerShowSortIndicator" stdset="0">
<bool>true</bool>
</attribute>
<column>
<property name="text">
<string>Title</string>
</property>
</column>
<column>
<property name="text">
<string>From</string>
</property>
</column>
<column>
<property name="text">
<string>Date</string>
</property>
</column>
</widget>
</item>
</layout>
</widget>
</widget>
<widget class="QSplitter" name="splitter_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<widget class="QTextEdit" name="messageBody">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Minimum">
<horstretch>0</horstretch>
<verstretch>5</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
</property>
</widget>
<widget class="QFrame" name="frame_2">
<property name="frameShape">
<enum>QFrame::StyledPanel</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="replyButton">
<property name="text">
<string>Reply</string>
</property>
</widget>
</item>
<item>
<widget class="QWidget" name="replyWidget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_5">
<property name="margin">
<number>0</number>
</property>
<item>
<widget class="QLineEdit" name="titleEdit"/>
</item>
<item>
<widget class="QTextEdit" name="replyEdit"/>
</item>
<item>
<widget class="QPushButton" name="sendButton">
<property name="text">
<string>Send</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
</widget>
</widget>
</widget>
</item>
</layout> </layout>
</widget> </widget>
<resources/> <resources/>