]> git.notmuchmail.org Git - notmuch/blobdiff - cnotmuch/message.py
database.py: also need to import Message
[notmuch] / cnotmuch / message.py
index 7274c6da62de68d3854d93199afd63aadd9481b0..0e5057f42751310094626e8bd63171f9ff64dce7 100644 (file)
@@ -16,7 +16,7 @@
 #    (C) Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>
 #                       Jesse Rosenthal <jrosenthal@jhu.edu>
         
 #    (C) Copyright 2010 Sebastian Spaeth <Sebastian@SSpaeth.de>
 #                       Jesse Rosenthal <jrosenthal@jhu.edu>
         
-from ctypes import c_char_p, c_void_p, c_long, c_bool
+from ctypes import c_char_p, c_void_p, c_long, c_uint
 from datetime import date
 from cnotmuch.globals import nmlib, STATUS, NotmuchError, Enum
 from cnotmuch.tag import Tags
 from datetime import date
 from cnotmuch.globals import nmlib, STATUS, NotmuchError, Enum
 from cnotmuch.tag import Tags
@@ -221,10 +221,8 @@ class Messages(object):
                     raise NotmuchError
                 next_indent = indent + 1
 
                     raise NotmuchError
                 next_indent = indent + 1
 
-
+            # get replies and print them also out (if there are any)
             replies = msg.get_replies()
             replies = msg.get_replies()
-            # if isinstance(replies, types.NoneType):
-            #     break
             if not replies is None:
                 sys.stdout.write(set_sep)
                 replies.print_messages(format, next_indent, entire_thread)
             if not replies is None:
                 sys.stdout.write(set_sep)
                 replies.print_messages(format, next_indent, entire_thread)
@@ -245,7 +243,7 @@ class Message(object):
 
     """notmuch_message_get_flag"""
     _get_flag = nmlib.notmuch_message_get_flag
 
     """notmuch_message_get_flag"""
     _get_flag = nmlib.notmuch_message_get_flag
-    _get_flag.restype = c_bool
+    _get_flag.restype = c_uint
 
     """notmuch_message_get_message_id (notmuch_message_t *message)"""
     _get_message_id = nmlib.notmuch_message_get_message_id
 
     """notmuch_message_get_message_id (notmuch_message_t *message)"""
     _get_message_id = nmlib.notmuch_message_get_message_id
@@ -408,7 +406,7 @@ class Message(object):
 
         :param flag: One of the :attr:`Message.FLAG` values (currently only 
                      *Message.FLAG.MATCH*
 
         :param flag: One of the :attr:`Message.FLAG` values (currently only 
                      *Message.FLAG.MATCH*
-        :returns: A bool, indicating whether the flag is set.
+        :returns: An unsigned int (0/1), indicating whether the flag is set.
         :exception: :exc:`NotmuchError` STATUS.NOT_INITIALIZED if the message 
               is not initialized.
         """
         :exception: :exc:`NotmuchError` STATUS.NOT_INITIALIZED if the message 
               is not initialized.
         """
@@ -651,17 +649,20 @@ class Message(object):
         email_msg = email.message_from_file(fp)
         fp.close()
 
         email_msg = email.message_from_file(fp)
         fp.close()
 
-        # A subfunction to recursively unpack the message parts into a
-        # list.
-        def msg_unpacker_gen(msg):
+        out = []
+        for msg in email_msg.walk():
             if not msg.is_multipart():
             if not msg.is_multipart():
-                yield msg
-            else:
-                for part in msg.get_payload():
-                    for subpart in msg_unpacker_gen(part):
-                        yield subpart
+                out.append(msg)
+        return out
 
 
-        return list(msg_unpacker_gen(email_msg))
+    def get_part(self, num):
+        """Returns the nth message body part"""
+        parts = self.get_message_parts()
+        if (num <= 0 or num > len(parts)):
+            return ""
+        else:
+            out_part = parts[(num - 1)]
+            return out_part.get_payload(decode=True)
 
     def format_message_internal(self):
         """Create an internal representation of the message parts,
 
     def format_message_internal(self):
         """Create an internal representation of the message parts,
@@ -675,7 +676,7 @@ class Message(object):
         output["tags"] = list(self.get_tags())
 
         headers = {}
         output["tags"] = list(self.get_tags())
 
         headers = {}
-        for h in ["subject", "from", "to", "cc", "bcc", "date"]:
+        for h in ["Subject", "From", "To", "Cc", "Bcc", "Date"]:
             headers[h] = self.get_header(h)
         output["headers"] = headers
 
             headers[h] = self.get_header(h)
         output["headers"] = headers
 
@@ -687,7 +688,7 @@ class Message(object):
             part_dict["id"] = i + 1
             # We'll be using this is a lot, so let's just get it once.
             cont_type = msg.get_content_type()
             part_dict["id"] = i + 1
             # We'll be using this is a lot, so let's just get it once.
             cont_type = msg.get_content_type()
-            part_dict["content_type"] = cont_type
+            part_dict["content-type"] = cont_type
             # NOTE:
             # Now we emulate the current behaviour, where it ignores
             # the html if there's a text representation. 
             # NOTE:
             # Now we emulate the current behaviour, where it ignores
             # the html if there's a text representation. 
@@ -696,9 +697,8 @@ class Message(object):
             # here in the future than to end up with another
             # incompatible solution.
             disposition = msg["Content-Disposition"]
             # here in the future than to end up with another
             # incompatible solution.
             disposition = msg["Content-Disposition"]
-            if disposition:
-                if disposition.lower().startswith("attachment"):
-                    part_dict["filename"] = msg.get_filename()
+            if disposition and disposition.lower().startswith("attachment"):
+                part_dict["filename"] = msg.get_filename()
             else:
                 if cont_type.lower() == "text/plain":
                     part_dict["content"] = msg.get_payload()
             else:
                 if cont_type.lower() == "text/plain":
                     part_dict["content"] = msg.get_payload()
@@ -706,6 +706,7 @@ class Message(object):
                       i == 0):
                     part_dict["content"] = msg.get_payload()
             body.append(part_dict)
                       i == 0):
                     part_dict["content"] = msg.get_payload()
             body.append(part_dict)
+
         output["body"] = body
 
         return output
         output["body"] = body
 
         return output
@@ -721,25 +722,25 @@ class Message(object):
         easy to change to a new format when the format changes."""
 
         format = self.format_message_internal()
         easy to change to a new format when the format changes."""
 
         format = self.format_message_internal()
-        output = "\n\fmessage{ id:%s depth:%d match:%d filename:%s" \
+        output = "\fmessage{ id:%s depth:%d match:%d filename:%s" \
                  % (format['id'], indent, format['match'], format['filename'])
         output += "\n\fheader{"
 
         #Todo: this date is supposed to be prettified, as in the index.
                  % (format['id'], indent, format['match'], format['filename'])
         output += "\n\fheader{"
 
         #Todo: this date is supposed to be prettified, as in the index.
-        output += "\n%s (%s) (" % (format["headers"]["from"],
-                                   format["headers"]["date"])
+        output += "\n%s (%s) (" % (format["headers"]["From"],
+                                   format["headers"]["Date"])
         output += ", ".join(format["tags"])
         output += ", ".join(format["tags"])
-        output += ")\n"
-
-        output += "\nSubject: %s" % format["headers"]["subject"]
-        output += "\nFrom: %s" % format["headers"]["from"]
-        output += "\nTo: %s" % format["headers"]["to"]
-        if format["headers"]["cc"]:
-            output += "\nCc: %s" % format["headers"]["cc"]
-        if format["headers"]["bcc"]:
-            output += "\nBcc: %s" % format["headers"]["bcc"]
-        output += "\nDate: %s" % format["headers"]["date"]
-        output += "\nheader}\f"
+        output += ")"
+
+        output += "\nSubject: %s" % format["headers"]["Subject"]
+        output += "\nFrom: %s" % format["headers"]["From"]
+        output += "\nTo: %s" % format["headers"]["To"]
+        if format["headers"]["Cc"]:
+            output += "\nCc: %s" % format["headers"]["Cc"]
+        if format["headers"]["Bcc"]:
+            output += "\nBcc: %s" % format["headers"]["Bcc"]
+        output += "\nDate: %s" % format["headers"]["Date"]
+        output += "\n\fheader}"
 
         output += "\n\fbody{"
 
 
         output += "\n\fbody{"
 
@@ -748,22 +749,22 @@ class Message(object):
         for p in parts:
             if not p.has_key("filename"):
                 output += "\n\fpart{ "
         for p in parts:
             if not p.has_key("filename"):
                 output += "\n\fpart{ "
-                output += "ID: %d, Content-type:%s\n" % (p["id"], 
-                                                         p["content_type"])
+                output += "ID: %d, Content-type: %s\n" % (p["id"], 
+                                                         p["content-type"])
                 if p.has_key("content"):
                     output += "\n%s\n" % p["content"]
                 else:
                 if p.has_key("content"):
                     output += "\n%s\n" % p["content"]
                 else:
-                    output += "Non-text part: %s\n" % p["content_type"]
+                    output += "Non-text part: %s\n" % p["content-type"]
                     output += "\n\fpart}"                    
             else:
                 output += "\n\fattachment{ "
                 output += "ID: %d, Content-type:%s\n" % (p["id"], 
                     output += "\n\fpart}"                    
             else:
                 output += "\n\fattachment{ "
                 output += "ID: %d, Content-type:%s\n" % (p["id"], 
-                                                         p["content_type"])
+                                                         p["content-type"])
                 output += "Attachment: %s\n" % p["filename"]
                 output += "\n\fattachment}\n"
 
         output += "\n\fbody}\n"
                 output += "Attachment: %s\n" % p["filename"]
                 output += "\n\fattachment}\n"
 
         output += "\n\fbody}\n"
-        output += "\n\fmessage}\n"
+        output += "\n\fmessage}"
 
         return output
 
 
         return output