summaryrefslogtreecommitdiff
path: root/service/pixelated/adapter
diff options
context:
space:
mode:
authorPatrick Maia <pmaia@thoughtworks.com>2014-09-15 11:39:25 -0300
committerPatrick Maia <pmaia@thoughtworks.com>2014-09-15 11:48:47 -0300
commit4eeca4b0e3ba10ad08a937d08546384f1c67351c (patch)
treecb6fee2a42121ab658dc35c9fbee19b01954d4e8 /service/pixelated/adapter
parentfa6806de54873dca3823a9a95b3c40c1c97934cc (diff)
#74 - Moving message to trash mailbox
Diffstat (limited to 'service/pixelated/adapter')
-rw-r--r--service/pixelated/adapter/mail_service.py5
-rw-r--r--service/pixelated/adapter/pixelated_mail.py36
-rw-r--r--service/pixelated/adapter/pixelated_mailbox.py8
-rw-r--r--service/pixelated/adapter/pixelated_mailboxes.py8
-rw-r--r--service/pixelated/adapter/status.py1
5 files changed, 50 insertions, 8 deletions
diff --git a/service/pixelated/adapter/mail_service.py b/service/pixelated/adapter/mail_service.py
index 52c1abc7..debdc9b7 100644
--- a/service/pixelated/adapter/mail_service.py
+++ b/service/pixelated/adapter/mail_service.py
@@ -66,7 +66,10 @@ class MailService:
raise NotImplementedError()
def delete_mail(self, mail_id):
- raise NotImplementedError()
+ mail = self.mailboxes.mail(mail_id)
+ new_mailbox_tag, old_mailbox_tag = mail.move_to(self.mailboxes.trash())
+ self.tag_service.notify_tags_updated([], [old_mailbox_tag], mail_id)
+ self.tag_service.notify_tags_updated([new_mailbox_tag], [], None)
def save_draft(self, draft):
raise NotImplementedError()
diff --git a/service/pixelated/adapter/pixelated_mail.py b/service/pixelated/adapter/pixelated_mail.py
index fd03ea48..2aead409 100644
--- a/service/pixelated/adapter/pixelated_mail.py
+++ b/service/pixelated/adapter/pixelated_mail.py
@@ -15,6 +15,7 @@
# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
from pixelated.adapter.status import Status
from pixelated.support.id_gen import gen_pixelated_uid
+import json
import pixelated.support.date
import dateutil.parser as dateparser
from email.MIMEMultipart import MIMEMultipart
@@ -27,19 +28,22 @@ class PixelatedMail:
pass
@staticmethod
- def from_leap_mail(leap_mail, leap_mail_collection=None):
+ def from_leap_mail(leap_mail, leap_mailbox=None):
mail = PixelatedMail()
mail.leap_mail = leap_mail
- mail.leap_mail._collection = leap_mail_collection # Work around until they fix the issue of mails not having the collection set on a LeapMailbox
+ mail.leap_mailbox = leap_mailbox
mail.body = leap_mail.bdoc.content['raw']
mail.headers = mail._extract_headers()
mail.date = PixelatedMail._get_date(mail.headers)
- mail.ident = gen_pixelated_uid(leap_mail._mbox, leap_mail.getUID())
mail.status = set(mail._extract_status())
mail.security_casing = {}
mail.tags = mail._extract_tags()
return mail
+ @property
+ def ident(self):
+ return gen_pixelated_uid(self.leap_mailbox.mbox, self.leap_mail.getUID())
+
def set_from(self, _from):
self.headers['from'] = [_from]
@@ -70,7 +74,7 @@ class PixelatedMail:
return temporary_headers
def _extract_tags(self):
- return set(self.headers.get('x-tags', []))
+ return set(json.loads(self.headers.get('x-tags', '[]')))
def update_tags(self, tags):
old_tags = self.tags
@@ -87,12 +91,34 @@ class PixelatedMail:
def _persist_mail_tags(self, current_tags):
hdoc = self.leap_mail.hdoc
- hdoc.content['headers']['X-Tags'] = list(current_tags)
+ hdoc.content['headers']['X-Tags'] = json.dumps(list(current_tags))
self.leap_mail._soledad.put_doc(hdoc)
def has_tag(self, tag):
return tag in self.tags
+ def move_to(self, destiny_mailbox):
+ new_leap_mail = destiny_mailbox.add_mail(self)
+ self._delete_from_leap_mailbox()
+ old_mailbox_tag = self.leap_mailbox.mbox.lower()
+ self._update_leap_references(destiny_mailbox.leap_mailbox, new_leap_mail)
+
+ return destiny_mailbox.mailbox_tag, old_mailbox_tag
+
+ def _delete_from_leap_mailbox(self):
+ self.leap_mail.setFlags((Status.PixelatedStatus.DELETED,), 1)
+ self.leap_mailbox.expunge()
+
+ def _update_leap_references(self, new_leap_mailbox, new_leap_mail):
+ self.leap_mailbox = new_leap_mailbox
+ self.leap_mail = new_leap_mail
+
+ def raw_message(self):
+ raw_message = ''.join("%s: %s\n" % (key, value) for key, value in self.leap_mail.hdoc.content['headers'].items())
+ raw_message += '\n\n'
+ raw_message += self.leap_mail.bdoc.content['raw']
+ return raw_message
+
def as_dict(self):
statuses = [status.name for status in self.status]
_headers = self.headers.copy()
diff --git a/service/pixelated/adapter/pixelated_mailbox.py b/service/pixelated/adapter/pixelated_mailbox.py
index 4d4d8faa..cc44ede7 100644
--- a/service/pixelated/adapter/pixelated_mailbox.py
+++ b/service/pixelated/adapter/pixelated_mailbox.py
@@ -16,7 +16,6 @@
from pixelated.adapter.pixelated_mail import PixelatedMail
from pixelated.adapter.tag_service import TagService
-from pixelated.support.id_gen import gen_pixelated_uid
class PixelatedMailbox:
@@ -39,7 +38,8 @@ class PixelatedMailbox:
mails = self.leap_mailbox.messages or []
result = []
for mail in mails:
- pixelated_mail = PixelatedMail.from_leap_mail(mail, mails)
+ mail._collection = mails
+ pixelated_mail = PixelatedMail.from_leap_mail(mail, self.leap_mailbox)
self.add_mailbox_tag_if_not_there(pixelated_mail)
result.append(pixelated_mail)
return result
@@ -54,6 +54,10 @@ class PixelatedMailbox:
if message.ident == mail_id:
return message
+ def add_mail(self, mail):
+ original_flags = mail.leap_mail.getFlags()
+ self.leap_mailbox.addMessage(mail.raw_message(), original_flags)
+
@classmethod
def create(cls, account, mailbox_name='INBOX'):
return PixelatedMailbox(account.getMailbox(mailbox_name))
diff --git a/service/pixelated/adapter/pixelated_mailboxes.py b/service/pixelated/adapter/pixelated_mailboxes.py
index 411e8ac0..c003f3fd 100644
--- a/service/pixelated/adapter/pixelated_mailboxes.py
+++ b/service/pixelated/adapter/pixelated_mailboxes.py
@@ -22,3 +22,11 @@ class PixelatedMailBoxes():
mail = mailbox.mail(mail_id)
if mail:
return mail
+
+ def mailbox_exists(self, name):
+ return name.upper() in map(lambda x: x.upper(), self.account.mailboxes)
+
+ def trash(self):
+ if not self.mailbox_exists('TRASH'):
+ self.account.addMailbox('TRASH')
+ return PixelatedMailbox.create(self.account, 'TRASH')
diff --git a/service/pixelated/adapter/status.py b/service/pixelated/adapter/status.py
index 96257414..0917b748 100644
--- a/service/pixelated/adapter/status.py
+++ b/service/pixelated/adapter/status.py
@@ -20,6 +20,7 @@ class Status:
class PixelatedStatus:
SEEN = u'\\Seen'
ANSWERED = u'\\Answered'
+ DELETED = u'\\Deleted'
LEAP_FLAGS_STATUSES = {
PixelatedStatus.SEEN: 'read',