From 31289cb156540a95dfe51737d9fd4e1a7393f2f2 Mon Sep 17 00:00:00 2001 From: Bruno Wagner Goncalves Date: Wed, 20 Aug 2014 15:43:50 -0300 Subject: Added setup.py and changed app to pixelated because it will be a package --- service/pixelated/adapter/__init__.py | 0 service/pixelated/adapter/mail_service.py | 98 +++++++++++++++++++++++++++++ service/pixelated/adapter/pixelated_mail.py | 82 ++++++++++++++++++++++++ 3 files changed, 180 insertions(+) create mode 100644 service/pixelated/adapter/__init__.py create mode 100644 service/pixelated/adapter/mail_service.py create mode 100644 service/pixelated/adapter/pixelated_mail.py (limited to 'service/pixelated/adapter') diff --git a/service/pixelated/adapter/__init__.py b/service/pixelated/adapter/__init__.py new file mode 100644 index 00000000..e69de29b 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 + } -- cgit v1.2.3