summaryrefslogtreecommitdiff
path: root/service/pixelated/adapter/pixelated_mail.py
diff options
context:
space:
mode:
authorDuda Dornelles <ddornell@thoughtworks.com>2014-09-25 15:10:03 -0300
committerDuda Dornelles <ddornell@thoughtworks.com>2014-09-25 15:10:03 -0300
commit8be21f61e8f2c3f68de91497ce284cbda20043e6 (patch)
tree6679c16cbfb05eb91dde190fb3885f3a06c40ba2 /service/pixelated/adapter/pixelated_mail.py
parent99e3cdd9bf7c8f32254b4adbaa0abec97cbabf5e (diff)
Creating mail right on soledad
Diffstat (limited to 'service/pixelated/adapter/pixelated_mail.py')
-rw-r--r--service/pixelated/adapter/pixelated_mail.py47
1 files changed, 33 insertions, 14 deletions
diff --git a/service/pixelated/adapter/pixelated_mail.py b/service/pixelated/adapter/pixelated_mail.py
index 421ab736..ae6af52f 100644
--- a/service/pixelated/adapter/pixelated_mail.py
+++ b/service/pixelated/adapter/pixelated_mail.py
@@ -16,6 +16,7 @@
import json
from leap.mail.imap.fields import fields
from leap.mail.walk import get_parts
+import leap.mail.walk as walk
import dateutil.parser as dateparser
from pixelated.adapter.status import Status
from pixelated.adapter.tag_service import TagService
@@ -23,6 +24,7 @@ import pixelated.support.date
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from pycryptopp.hash import sha256
+from pixelated.support.functional import flatten
class InputMail:
@@ -34,13 +36,24 @@ class InputMail:
self._bd = None
self._mime = None
+ def as_dict(self):
+ statuses = [status.name for status in self.status]
+ return {
+ 'header': self.headers,
+ 'ident': self.ident,
+ 'tags': list(self.tags),
+ 'status': statuses,
+ 'security_casing': {},
+ 'body': self.body
+ }
+
+
@staticmethod
def from_dict(mail_dict):
input_mail = InputMail()
input_mail.headers = mail_dict['header']
input_mail.headers['date'] = pixelated.support.date.iso_now()
input_mail.body = mail_dict['body']
- input_mail.ident = mail_dict.get('ident', None)
input_mail.tags = set(mail_dict.get('tags', []))
input_mail.status = set(mail_dict.get('status', []))
return input_mail
@@ -51,11 +64,15 @@ class InputMail:
return self._mime
mime = MIMEMultipart()
for key, value in self.headers.items():
- mime[key] = value
+ mime[str(key)] = str(value)
mime.attach(MIMEText(self.body, 'plain'))
self._mime = mime
return mime
+ @property
+ def ident(self):
+ return self._get_chash()
+
def _raw(self):
if self._raw_message:
return self._raw_message
@@ -66,7 +83,9 @@ class InputMail:
return sha256.SHA256(self._raw()).hexdigest()
def _get_for_save(self, next_uid):
- return (self._fdoc(next_uid), self._hdoc(), self._bdoc())
+ docs = [self._fdoc(next_uid), self._hdoc()]
+ docs.extend([m for m in self._cdocs()])
+ return docs
def _fdoc(self, next_uid):
if self._fd:
@@ -82,6 +101,9 @@ class InputMail:
self._fd = fd
return fd
+ def _get_body_phash(self):
+ return walk.get_body_phash_multi(walk.get_payloads(self._mime_multipart))
+
def _hdoc(self):
if self._hd:
return self._hd
@@ -94,21 +116,14 @@ class InputMail:
hd[fields.MULTIPART_KEY] = True
hd[fields.SUBJECT_KEY] = self.headers.get('subject')
hd[fields.TYPE_KEY] = fields.TYPE_HEADERS_VAL
- hd[fields.BODY_KEY] = sha256.SHA256.hexdigest(self._mime_multipart.get_payload())
-
- parts_array = get_parts(self._mime_multipart)
- parts = {}
- for index, part in enumerate(parts_array):
- part[fields.PAYLOAD_HASH_KEY] = hd[fields.BODY_KEY]
- parts[index] = part
- hd[fields.PARTS_MAP_KEY] = parts
+ hd[fields.BODY_KEY] = self._get_body_phash()
+ hd[fields.PARTS_MAP_KEY] = walk.walk_msg_tree(walk.get_parts(self._mime_multipart), body_phash=self._get_body_phash())
self._hd = hd
return hd
- def _bdoc(self):
-
- pass
+ def _cdocs(self):
+ return walk.get_raw_docs(self._mime_multipart, self._mime_multipart.walk())
def to_mime_multipart(self):
mime_multipart = MIMEMultipart()
@@ -181,6 +196,10 @@ class PixelatedMail:
def is_recent(self):
return Status('recent') in self.status
+ @property
+ def uid(self):
+ return self.fdoc.content['uid']
+
def save(self):
return self.querier.save_mail(self)