diff options
Diffstat (limited to 'service/pixelated/adapter/services/mail_service.py')
-rw-r--r-- | service/pixelated/adapter/services/mail_service.py | 99 |
1 files changed, 62 insertions, 37 deletions
diff --git a/service/pixelated/adapter/services/mail_service.py b/service/pixelated/adapter/services/mail_service.py index 233d4d4a..44c4c145 100644 --- a/service/pixelated/adapter/services/mail_service.py +++ b/service/pixelated/adapter/services/mail_service.py @@ -13,37 +13,50 @@ # # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see <http://www.gnu.org/licenses/>. +from twisted.internet import defer from pixelated.adapter.model.mail import InputMail +from pixelated.adapter.model.status import Status from pixelated.adapter.services.tag_service import extract_reserved_tags +from email import message_from_file +import os class MailService(object): - def __init__(self, mailboxes, mail_sender, soledad_querier, search_engine): - self.mailboxes = mailboxes - self.querier = soledad_querier + def __init__(self, mail_sender, mail_store, search_engine): + self.mail_store = mail_store self.search_engine = search_engine self.mail_sender = mail_sender + @defer.inlineCallbacks def all_mails(self): - return self.querier.all_mails() + mails = yield self.mail_store.all_mails() + defer.returnValue(mails) + @defer.inlineCallbacks def mails(self, query, window_size, page): mail_ids, total = self.search_engine.search(query, window_size, page) - return self.querier.mails(mail_ids), total + try: + mails = yield self.mail_store.get_mails(mail_ids) + defer.returnValue((mails, total)) + except Exception, e: + import traceback + traceback.print_exc() + raise + @defer.inlineCallbacks def update_tags(self, mail_id, new_tags): new_tags = self._filter_white_space_tags(new_tags) reserved_words = extract_reserved_tags(new_tags) if len(reserved_words): raise ValueError('None of the following words can be used as tags: ' + ' '.join(reserved_words)) new_tags = self._favor_existing_tags_casing(new_tags) - mail = self.mail(mail_id) - mail.update_tags(set(new_tags)) - self.search_engine.index_mail(mail) + mail = yield self.mail(mail_id) + mail.tags = set(new_tags) + yield self.mail_store.update_mail(mail) - return mail + defer.returnValue(mail) def _filter_white_space_tags(self, tags): return [tag.strip() for tag in tags if not tag.isspace()] @@ -58,53 +71,65 @@ class MailService(object): return [_use_current_casing(new_tag.lower()) if new_tag.lower() in current_tags_lower else new_tag for new_tag in new_tags] def mail(self, mail_id): - return self.querier.mail(mail_id) + return self.mail_store.get_mail(mail_id, include_body=True) - def attachment(self, attachment_id, encoding): - return self.querier.attachment(attachment_id, encoding) + def attachment(self, attachment_id): + return self.mail_store.get_mail_attachment(attachment_id) + @defer.inlineCallbacks def mail_exists(self, mail_id): - return not(not(self.querier.get_header_by_chash(mail_id))) + try: + mail = yield self.mail_store.get_mail(mail_id, include_body=False) + defer.returnValue(mail is not None) + except Exception, e: + defer.returnValue(False) + @defer.inlineCallbacks def send_mail(self, content_dict): mail = InputMail.from_dict(content_dict) draft_id = content_dict.get('ident') - def move_to_sent(_): - return self.move_to_sent(draft_id, mail) - - deferred = self.mail_sender.sendmail(mail) - deferred.addCallback(move_to_sent) - return deferred + yield self.mail_sender.sendmail(mail) + sent_mail = yield self.move_to_sent(draft_id, mail) + defer.returnValue(sent_mail) + @defer.inlineCallbacks def move_to_sent(self, last_draft_ident, mail): if last_draft_ident: - self.mailboxes.drafts.remove(last_draft_ident) - return self.mailboxes.sent.add(mail) + try: + yield self.mail_store.delete_mail(last_draft_ident) + except Exception as error: + pass + + sent_mail = yield self.mail_store.add_mail('SENT', mail.raw) + sent_mail.flags.add(Status.SEEN) + yield self.mail_store.update_mail(sent_mail) + defer.returnValue(sent_mail) + @defer.inlineCallbacks def mark_as_read(self, mail_id): - mail = self.mail(mail_id) - mail.mark_as_read() - self.search_engine.index_mail(mail) + mail = yield self.mail(mail_id) + mail.flags.add(Status.SEEN) + yield self.mail_store.update_mail(mail) + @defer.inlineCallbacks def mark_as_unread(self, mail_id): - mail = self.mail(mail_id) - mail.mark_as_unread() - self.search_engine.index_mail(mail) + mail = yield self.mail(mail_id) + mail.flags.remove(Status.SEEN) + yield self.mail_store.update_mail(mail) + @defer.inlineCallbacks def delete_mail(self, mail_id): - mail = self.mail(mail_id) - if mail.mailbox_name == 'TRASH': - self.delete_permanent(mail_id) + mail = yield self.mail(mail_id) + if mail.mailbox_name.upper() == u'TRASH': + yield self.mail_store.delete_mail(mail_id) else: - trashed_mail = self.mailboxes.move_to_trash(mail_id) - self.search_engine.index_mail(trashed_mail) + yield self.mail_store.move_mail_to_mailbox(mail_id, 'TRASH') + @defer.inlineCallbacks def recover_mail(self, mail_id): - recovered_mail = self.mailboxes.move_to_inbox(mail_id) - self.search_engine.index_mail(recovered_mail) + yield self.mail_store.move_mail_to_mailbox(mail_id, 'INBOX') + @defer.inlineCallbacks def delete_permanent(self, mail_id): - mail = self.mail(mail_id) - self.search_engine.remove_from_index(mail_id) - self.querier.remove_mail(mail) + yield self.mail_store.delete_mail(mail_id) |