summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Spaeth <sebastian@sspaeth.de>2010-03-19 14:24:40 +0100
committerSebastian Spaeth <sebastian@sspaeth.de>2010-03-19 14:24:40 +0100
commit5186611851f6a38e397287cb94cd7ef502c1c902 (patch)
tree968942f55c2bdc894f7f00b6b8ddf4b7d0ed9542
parente3aa28f05531723aa3b182be5194614372a8ee54 (diff)
Implement Message.get_replies()
-rw-r--r--cnotmuch/database.py43
1 files changed, 41 insertions, 2 deletions
diff --git a/cnotmuch/database.py b/cnotmuch/database.py
index 1f06d43..b759391 100644
--- a/cnotmuch/database.py
+++ b/cnotmuch/database.py
@@ -714,7 +714,13 @@ class Messages(object):
"""len(:class:`Messages`) returns the number of contained messages
.. note:: As this iterates over the messages, we will not be able to
- iterate over them again (as in retrieve them)!
+ iterate over them again! So this will fail::
+
+ #THIS FAILS
+ msgs = Database().create_query('').search_message()
+ if len(msgs) > 0: #this 'exhausts' msgs
+ # next line raises NotmuchError(STATUS.NOT_INITIALIZED)!!!
+ for msg in msgs: print msg
"""
if self._msgs is None:
raise NotmuchError(STATUS.NOT_INITIALIZED)
@@ -754,6 +760,10 @@ class Message(object):
_get_thread_id = nmlib.notmuch_message_get_thread_id
_get_thread_id.restype = c_char_p
+ """notmuch_message_get_replies"""
+ _get_replies = nmlib.notmuch_message_get_replies
+ _get_replies.restype = c_void_p
+
"""notmuch_message_get_tags (notmuch_message_t *message)"""
_get_tags = nmlib.notmuch_message_get_tags
_get_tags.restype = c_void_p
@@ -811,6 +821,33 @@ class Message(object):
return Message._get_thread_id (self._msg);
+ def get_replies(self):
+ """Gets all direct replies to this message as :class:`Messages` iterator
+
+ .. note:: This call only makes sense if 'message' was
+ ultimately obtained from a :class:`Thread` object, (such as
+ by coming directly from the result of calling
+ :meth:`Thread.get_toplevel_messages` or by any number of
+ subsequent calls to :meth:`get_replies`). If this message was
+ obtained through some non-thread means, (such as by a call
+ to :meth:`Query.search_messages`), then this function will
+ return `None`.
+
+ :returns: :class:`Messages` or `None` if there are no replies to
+ this message.
+ :exception: :exc:`NotmuchError` STATUS.NOT_INITIALIZED if the message
+ is not initialized.
+ """
+ if self._msg is None:
+ raise NotmuchError(STATUS.NOT_INITIALIZED)
+
+ msgs_p = Message._get_replies(self._msg);
+
+ if msgs_p is None:
+ return None
+
+ return Messages(msgs_p,self)
+
def get_date(self):
"""Returns time_t of the message date
@@ -1071,7 +1108,9 @@ class Message(object):
msg['from'] = self.get_header('from')
msg['tags'] = str(self.get_tags())
msg['date'] = date.fromtimestamp(self.get_date())
- return "%(from)s (%(date)s) (%(tags)s)" % (msg)
+ replies = self.get_replies()
+ msg['replies'] = len(replies) if replies is not None else -1
+ return "%(from)s (%(date)s) (%(tags)s) (%(replies)d) replies" % (msg)
def format_as_text(self):
"""Output like notmuch show (Not implemented)"""