summaryrefslogtreecommitdiff
path: root/service/pixelated/adapter
diff options
context:
space:
mode:
authorBruno Wagner Goncalves <bwagner@thoughtworks.com>2014-08-20 15:43:50 -0300
committerBruno Wagner Goncalves <bwagner@thoughtworks.com>2014-08-20 18:27:01 -0300
commit31289cb156540a95dfe51737d9fd4e1a7393f2f2 (patch)
tree238480ca562c9c65e1aeaaeaebe063549b3718f4 /service/pixelated/adapter
parent02df978f9faa4a00b07d2c70d3bd47a25287d0e1 (diff)
Added setup.py and changed app to pixelated because it will be a package
Diffstat (limited to 'service/pixelated/adapter')
-rw-r--r--service/pixelated/adapter/__init__.py0
-rw-r--r--service/pixelated/adapter/mail_service.py98
-rw-r--r--service/pixelated/adapter/pixelated_mail.py82
3 files changed, 180 insertions, 0 deletions
diff --git a/service/pixelated/adapter/__init__.py b/service/pixelated/adapter/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/service/pixelated/adapter/__init__.py
diff --git a/service/pixelated/adapter/mail_service.py b/service/pixelated/adapter/mail_service.py
new file mode 100644
index 00000000..6498a2e7
--- /dev/null
+++ b/service/pixelated/adapter/mail_service.py
@@ -0,0 +1,98 @@
+import traceback
+import sys
+import os
+from twisted.internet import defer
+from pixelated.bitmask_libraries.config import LeapConfig
+from pixelated.bitmask_libraries.provider import LeapProvider
+from pixelated.bitmask_libraries.session import LeapSessionFactory
+from pixelated.bitmask_libraries.auth import LeapCredentials
+from pixelated.adapter.pixelated_mail import PixelatedMail
+from pixelated.tags import Tags
+
+
+class MailService:
+
+ def __init__(self):
+ try:
+ self.username = 'testuser_a003'
+ self.password = 'testpassword'
+ self.server_name = 'example.wazokazi.is'
+ self.mailbox_name = 'INBOX'
+ self.certs_home = os.path.join(os.path.abspath("."), "leap")
+ self.tags = Tags()
+ self._open_leap_session()
+ except:
+ traceback.print_exc(file=sys.stdout)
+ raise
+
+ def _open_leap_session(self):
+ self.leap_config = LeapConfig(certs_home=self.certs_home)
+ self.provider = LeapProvider(self.server_name, self.leap_config)
+ self.leap_session = LeapSessionFactory(self.provider).create(LeapCredentials(self.username, self.password))
+ self.account = self.leap_session.account
+ self.mailbox = self.account.getMailbox(self.mailbox_name)
+
+ def mails(self, query):
+ mails = self.mailbox.messages or []
+ mails = [PixelatedMail(mail) for mail in mails]
+ return mails
+
+ def update_tags(self, mail_id, new_tags):
+ mail = self.mail(mail_id)
+ new_tags = mail.update_tags(new_tags)
+ self._update_flags(new_tags, mail_id)
+ self._update_tag_list(new_tags)
+ return new_tags
+
+ def _update_tag_list(self, tags):
+ for tag in tags:
+ self.tags.add(tag)
+
+ def _update_flags(self, new_tags, mail_id):
+ new_tags_flag_name = ['tag_' + tag.name for tag in new_tags]
+ self.set_flags(mail_id, new_tags_flag_name)
+
+ def set_flags(self, mail_id, new_tags_flag_name):
+ observer = defer.Deferred()
+ self.mailbox.messages.set_flags(self.mailbox, [mail_id], tuple(new_tags_flag_name), 1, observer)
+
+ def mail(self, mail_id):
+ for message in self.mailbox.messages:
+ if message.getUID() == int(mail_id):
+ return PixelatedMail(message)
+
+ def all_tags(self):
+ return self.tags
+
+ def thread(self, thread_id):
+ raise NotImplementedError()
+
+ def mark_as_read(self, mail_id):
+ raise NotImplementedError()
+
+ def tags_for_thread(self, thread):
+ raise NotImplementedError()
+
+ def add_tag_to_thread(self, thread_id, tag):
+ raise NotImplementedError()
+
+ def remove_tag_from_thread(self, thread_id, tag):
+ raise NotImplementedError()
+
+ def delete_mail(self, mail_id):
+ raise NotImplementedError()
+
+ def save_draft(self, draft):
+ raise NotImplementedError()
+
+ def send_draft(self, draft):
+ raise NotImplementedError()
+
+ def draft_reply_for(self, mail_id):
+ raise NotImplementedError()
+
+ def all_contacts(self, query):
+ raise NotImplementedError()
+
+ def drafts(self):
+ raise NotImplementedError()
diff --git a/service/pixelated/adapter/pixelated_mail.py b/service/pixelated/adapter/pixelated_mail.py
new file mode 100644
index 00000000..49a045f2
--- /dev/null
+++ b/service/pixelated/adapter/pixelated_mail.py
@@ -0,0 +1,82 @@
+from pixelated.tags import Tag
+from pixelated.tags import Tags
+import dateutil.parser as dateparser
+
+
+class PixelatedMail:
+
+ LEAP_FLAGS = ['\\Seen',
+ '\\Answered',
+ '\\Flagged',
+ '\\Deleted',
+ '\\Draft',
+ '\\Recent',
+ 'List']
+
+ LEAP_FLAGS_STATUSES = {
+ '\\Seen': 'read',
+ '\\Answered': 'replied'
+ }
+
+ LEAP_FLAGS_TAGS = {
+ '\\Deleted': 'trash',
+ '\\Draft': 'drafts',
+ '\\Recent': 'inbox'
+ }
+
+ def __init__(self, leap_mail):
+ self.leap_mail = leap_mail
+ self.body = leap_mail.bdoc.content['raw']
+ self.headers = self.extract_headers()
+ self.date = dateparser.parse(self.headers['date'])
+ self.ident = leap_mail.getUID()
+ self.status = self.extract_status()
+ self.security_casing = {}
+ self.tags = self.extract_tags()
+
+ def extract_status(self):
+ flags = self.leap_mail.getFlags()
+ return [converted for flag, converted in self.LEAP_FLAGS_STATUSES.items() if flag in flags]
+
+ def extract_headers(self):
+ temporary_headers = {}
+ for header, value in self.leap_mail.hdoc.content['headers'].items():
+ temporary_headers[header.lower()] = value
+ if(temporary_headers.get('to') is not None):
+ temporary_headers['to'] = [temporary_headers['to']]
+ return temporary_headers
+
+ def extract_tags(self):
+ flags = self.leap_mail.getFlags()
+ tag_names = self._converted_tags(flags) + self._custom_tags(flags)
+ tags = []
+ for tag in tag_names:
+ tags.append(Tag(tag))
+ return tags
+
+ def _converted_tags(self, flags):
+ return [converted for flag, converted in self.LEAP_FLAGS_TAGS.items() if flag in flags]
+
+ def _custom_tags(self, flags):
+ return [self._remove_prefix(flag) for flag in self.leap_mail.getFlags() if flag.startswith('tag_')]
+
+ def _remove_prefix(self, flag_name):
+ return flag_name.replace('tag_', '', 1)
+
+ def update_tags(self, tags):
+ self.tags = [Tag(tag) for tag in tags]
+ return self.tags
+
+ def has_tag(self, tag):
+ return Tag(tag) in self.tags
+
+ def as_dict(self):
+ tags = [tag.name for tag in self.tags]
+ return {
+ 'header': self.headers,
+ 'ident': self.ident,
+ 'tags': tags,
+ 'status': self.status,
+ 'security_casing': self.security_casing,
+ 'body': self.body
+ }