Use SEEN and FLAGGED to manage mail states (processing, processed)

This commit is contained in:
Mathieu Agopian
2013-03-26 16:52:26 +01:00
parent 6a961f72ef
commit 82d1d31690
4 changed files with 35 additions and 26 deletions

View File

@@ -149,10 +149,12 @@ triggered.
Mails are flagged according to their state, in the ``process_messages`` method:
* unprocessed: MailBot hasn't started looking at this mail, it doesn't have the
``PROCESSING`` nor the ``PROCESSED`` flags
* ``PROCESSING``: MailBot is checking callbacks, and triggering them if needed
* ``PROCESSED``: MailBot is done with this mail, and won't process it anymore
* unread (unseen): mail to be processed by MailBot
* read (seen):
- starred (flagged): MailBot is checking callbacks, and triggering them if
needed, the mail is being processed
- not starred (unflagged): MailBot is done with this mail, and won't process
it anymore
Specifying rules

View File

@@ -32,6 +32,13 @@ class MailReceivedTest(MailBotTestCase):
def _delete_folder(self):
"""Delete an IMAP folder, if it exists."""
if self.mb.client.folder_exists(self.home_folder):
self.mb.client.select_folder(self.home_folder)
messages = self.mb.client.search('ALL')
if messages:
self.mb.client.remove_flags(messages,
['\\Seen', '\\Flagged'])
self.mb.client.delete_messages(messages)
self.mb.client.expunge()
self.mb.client.delete_folder(self.home_folder)
def test_get_message_ids(self):
@@ -58,38 +65,39 @@ class MailReceivedTest(MailBotTestCase):
message_from_string('').as_string())
self.assertEqual(
self.mb.get_messages(),
{1: {'SEQ': 1, 'RFC822': '\r\n'},
2: {'FLAGS': ('\\Seen',), 'SEQ': 2, 'RFC822': '\r\n'}})
{2: {'FLAGS': ('\\Seen',), 'SEQ': 2, 'RFC822': '\r\n'}})
def test_mark_processing(self):
self.mb.client.append(self.home_folder,
message_from_string('').as_string())
ids = self.mb.client.search(['NOT KEYWORD PROCESSING'])
ids = self.mb.client.search(['Unseen'])
self.assertEqual(ids, [1])
self.mb.mark_processing(1)
self.assertEquals(self.mb.client.get_flags([1]), {1: ('PROCESSING',)})
ids = self.mb.client.search(['KEYWORD PROCESSING'])
self.assertEquals(self.mb.client.get_flags([1]),
{1: ('\\Flagged', '\\Seen')})
ids = self.mb.client.search(['Flagged', 'Seen'])
self.assertEqual(ids, [1])
ids = self.mb.client.search(['NOT KEYWORD PROCESSING'])
ids = self.mb.client.search(['Unseen'])
self.assertEqual(ids, [])
ids = self.mb.client.search(['Unflagged'])
self.assertEqual(ids, [])
def test_mark_processed(self):
self.mb.client.append(self.home_folder,
message_from_string('').as_string())
ids = self.mb.client.search(['NOT KEYWORD PROCESSED'])
ids = self.mb.client.search(['Unseen'])
self.assertEqual(ids, [1])
self.mb.mark_processing(1)
self.mb.mark_processed(1)
self.assertEquals(self.mb.client.get_flags([1]), {1: ('PROCESSED',)})
ids = self.mb.client.search(['KEYWORD PROCESSED'])
self.assertEquals(self.mb.client.get_flags([1]), {1: ('\\Seen',)})
ids = self.mb.client.search(['Seen'])
self.assertEqual(ids, [1])
ids = self.mb.client.search(['NOT KEYWORD PROCESSED'])
ids = self.mb.client.search(['Flagged'])
self.assertEqual(ids, [])
def test_process_messages(self):

View File

@@ -25,8 +25,7 @@ class MailBot(object):
def get_message_ids(self):
"""Return the list of IDs of messages to process."""
return self.client.search(['NOT KEYWORD PROCESSED',
'NOT KEYWORD PROCESSING'])
return self.client.search(['Unseen', 'Unflagged'])
def get_messages(self):
"""Return the list of messages to process."""
@@ -52,10 +51,10 @@ class MailBot(object):
self.mark_processed(uid)
def mark_processing(self, uid):
"""Mark the message corresponding to uid as processed."""
self.client.add_flags([uid], ['PROCESSING'])
"""Mark the message corresponding to uid as being processed."""
self.client.add_flags([uid], ['\\Flagged', '\\Seen'])
def mark_processed(self, uid):
"""Mark the message corresponding to uid as processed."""
self.client.remove_flags([uid], ['PROCESSING'])
self.client.add_flags([uid], ['PROCESSED'])
self.client.remove_flags([uid], ['\\Flagged'])
self.client.add_flags([uid], ['\\Seen'])

View File

@@ -42,7 +42,7 @@ class MailBotTest(MailBotClientTest):
res = self.bot.get_message_ids()
self.bot.client.search.assert_called_once_with(
['NOT KEYWORD PROCESSED', 'NOT KEYWORD PROCESSING'])
['Unseen', 'Unflagged'])
self.assertEqual(res, sentinel.id_list)
def test_get_messages(self):
@@ -106,12 +106,12 @@ class MailBotTest(MailBotClientTest):
def test_mark_processing(self):
self.bot.mark_processing(sentinel.id)
self.bot.client.add_flags.assert_called_once_with([sentinel.id],
['PROCESSING'])
self.bot.client.add_flags.assert_called_once_with(
[sentinel.id], ['\\Flagged', '\\Seen'])
def test_mark_processed(self):
self.bot.mark_processed(sentinel.id)
self.bot.client.remove_flags.assert_called_once_with([sentinel.id],
['PROCESSING'])
['\\Flagged'])
self.bot.client.add_flags.assert_called_once_with([sentinel.id],
['PROCESSED'])
['\\Seen'])