[PATCH v2 2/6] IMAP folder: expose the message keywords

Igor Almeida igor.contato at gmail.com
Fri Nov 20 19:09:10 GMT 2015


The keywords are in the flag string, so imaputil can just strip the
usual \Flags.

Signed-off-by: Igor Almeida <igor.contato at gmail.com>
---
 offlineimap/folder/Base.py | 5 +++++
 offlineimap/folder/IMAP.py | 8 +++++++-
 offlineimap/imaputil.py    | 8 ++++++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/offlineimap/folder/Base.py b/offlineimap/folder/Base.py
index d2a0706..5031a40 100644
--- a/offlineimap/folder/Base.py
+++ b/offlineimap/folder/Base.py
@@ -420,6 +420,11 @@ class BaseFolder(object):
 
         raise NotImplementedError
 
+    def getmessagekeywords(self, uid):
+        """Returns the keywords for the specified message."""
+
+        raise NotImplementedError
+
     def savemessageflags(self, uid, flags):
         """Sets the specified message's flags to the given set.
 
diff --git a/offlineimap/folder/IMAP.py b/offlineimap/folder/IMAP.py
index 60b5301..7f0fd6d 100644
--- a/offlineimap/folder/IMAP.py
+++ b/offlineimap/folder/IMAP.py
@@ -251,8 +251,10 @@ class IMAPFolder(BaseFolder):
                 uid = long(options['UID'])
                 self.messagelist[uid] = self.msglist_item_initializer(uid)
                 flags = imaputil.flagsimap2maildir(options['FLAGS'])
+                keywords = imaputil.flagsimap2keywords(options['FLAGS'])
                 rtime = imaplibutil.Internaldate2epoch(messagestr)
-                self.messagelist[uid] = {'uid': uid, 'flags': flags, 'time': rtime}
+                self.messagelist[uid] = {'uid': uid, 'flags': flags, 'time': rtime,
+                    'keywords': keywords}
         self.ui.messagelistloaded(self.repository, self, self.getmessagecount())
 
     def dropmessagelistcache(self):
@@ -309,6 +311,10 @@ class IMAPFolder(BaseFolder):
     def getmessageflags(self, uid):
         return self.messagelist[uid]['flags']
 
+    # Interface from BaseFolder
+    def getmessagekeywords(self, uid):
+        return self.messagelist[uid]['keywords']
+
     def __generate_randomheader(self, content):
         """Returns a unique X-OfflineIMAP header
 
diff --git a/offlineimap/imaputil.py b/offlineimap/imaputil.py
index 6d8b444..6a18732 100644
--- a/offlineimap/imaputil.py
+++ b/offlineimap/imaputil.py
@@ -195,6 +195,14 @@ def flagsimap2maildir(flagstring):
             retval.add(maildirflag)
     return retval
 
+def flagsimap2keywords(flagstring):
+    """Convert string '(\\Draft \\Deleted somekeyword otherkeyword)' into a
+    keyword set (somekeyword otherkeyword)."""
+
+    imapflagset = set(flagstring[1:-1].split())
+    serverflagset = set([flag for (flag, c) in flagmap])
+    return imapflagset - serverflagset
+
 def flagsmaildir2imap(maildirflaglist):
     """Convert set of flags ([DR]) into a string '(\\Deleted \\Draft)'."""
 
-- 
2.5.3





More information about the OfflineIMAP-project mailing list