summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDuda Dornelles <ddornell@thoughtworks.com>2014-09-22 18:26:27 -0300
committerDuda Dornelles <ddornell@thoughtworks.com>2014-09-22 18:27:45 -0300
commitffc08b7c5b449246cc00ff9d7425c6fecf3a0cfb (patch)
treee40680d63069d87f0c594558c64fb3e8b77847c4
parentd645a4d150c10142f79caee7f60d531df824c334 (diff)
initial implementation for getting all mails
-rw-r--r--service/pixelated/adapter/pixelated_mail.py176
-rw-r--r--service/pixelated/user_agent.py26
2 files changed, 49 insertions, 153 deletions
diff --git a/service/pixelated/adapter/pixelated_mail.py b/service/pixelated/adapter/pixelated_mail.py
index 4ec9a7cd..43b03834 100644
--- a/service/pixelated/adapter/pixelated_mail.py
+++ b/service/pixelated/adapter/pixelated_mail.py
@@ -25,166 +25,48 @@ from email.MIMEText import MIMEText
class PixelatedMail:
- def __init__(self):
- self.body = None
- self.headers = {}
- self.status = []
- self.security_casing = {}
- self.tags = []
- self.mailbox_name = None
- self.uid = None
- self._ident = None
-
- @staticmethod
- def from_leap_mail(leap_mail, tag_service=TagService.get_instance()):
- mail = PixelatedMail()
- mail.tag_service = tag_service
- mail.leap_mail = leap_mail
- mail.mailbox_name = leap_mail._mbox
- mail.uid = leap_mail.getUID()
- mail.body = leap_mail.bdoc.content['raw']
- mail.headers = mail._extract_headers()
- mail.headers['date'] = PixelatedMail._get_date(mail.headers)
- mail.status = set(mail._extract_status())
- mail.security_casing = {}
- mail.tags = mail._extract_tags()
- return mail
+ def __init__(self, fdoc, hdoc, bdoc):
+ self.fdoc = fdoc
+ self.hdoc = hdoc
+ self.bdoc = bdoc
@property
- def is_recent(self):
- return Status('recent') in self.status
+ def body(self):
+ return self.bdoc.content['raw']
@property
- def ident(self):
- if self.uid and self.mailbox_name:
- return gen_pixelated_uid(self.mailbox_name, self.uid)
- if self._ident:
- return self._ident
-
- def set_from(self, _from):
- self.headers['from'] = [_from]
-
- def get_to(self):
- return self.headers['to']
-
- def get_cc(self):
- return self.headers['cc']
-
- def get_bcc(self):
- return self.headers['bcc']
-
- def _extract_status(self):
- return Status.from_flags(self.leap_mail.getFlags())
-
- def _split_recipients(self, header_type, temporary_headers):
- if(temporary_headers.get(header_type) is not None):
- recipients = temporary_headers[header_type].split(',')
- temporary_headers[header_type] = map(lambda x: x.lstrip(), recipients)
-
- def _extract_headers(self):
- temporary_headers = {}
- for header, value in self.leap_mail.hdoc.content['headers'].items():
- temporary_headers[header.lower()] = value
-
- map(lambda x: self._split_recipients(x, temporary_headers), ['to', 'bcc', 'cc'])
-
- return temporary_headers
-
- def _extract_tags(self):
- tags = self.headers.get('x-tags', '[]')
- if type(tags) is list:
- return set(tags)
- return set(json.loads(tags))
-
- def mark_as_deleted(self):
- self.remove_all_tags()
- self.leap_mail.setFlags((Status.PixelatedStatus.DELETED,), 1)
-
- def remove_all_tags(self):
- self.update_tags(set([]))
-
- def update_tags(self, tags):
- old_tags = self.tags
- self.tags = tags
- removed = old_tags.difference(tags)
- added = tags.difference(old_tags)
- self._persist_mail_tags(tags)
- self.tag_service.notify_tags_updated(added, removed, self.ident)
- return self.tags
+ def headers(self):
+ _headers = {}
+ for header in ['From', 'Date', 'Subject', 'Cc', 'Bcc']:
+ _headers[header.lower()] = self.hdoc.content['headers'].get(header)
+ return _headers
- def mark_as_read(self):
- self.leap_mail.setFlags((Status.PixelatedStatus.SEEN,), 1)
- self.status = self._extract_status()
- return self
-
- def mark_as_not_recent(self):
- self.leap_mail.setFlags((Status.PixelatedStatus.RECENT,), -1)
- self.status = self._extract_status()
- return self
+ @property
+ def status(self):
+ return Status.from_flags(self.fdoc.content.get('flags'))
- def _persist_mail_tags(self, current_tags):
- hdoc = self.leap_mail.hdoc
- hdoc.content['headers']['X-Tags'] = json.dumps(list(current_tags))
- self.leap_mail._soledad.put_doc(hdoc)
+ @property
+ def security_casing(self):
+ return {}
- def has_tag(self, tag):
- return tag in self.tags
+ @property
+ def tags(self):
+ mailbox_tag = self.hdoc.content.get('mbox', '').lower()
+ tags = self.hdoc.content['headers'].get('x-tags', '[]')
+ _tags = tags if type(tags) is list else json.loads(tags) # this should go away since they should always be json'ed
+ _tags.append(mailbox_tag)
+ return set(_tags)
- def raw_message(self):
- mime = MIMEMultipart()
- for key, value in self.leap_mail.hdoc.content['headers'].items():
- mime[key] = value
- mime.attach(MIMEText(self.leap_mail.bdoc.content['raw'], 'plain'))
- return mime.as_string()
+ @property
+ def ident(self):
+ return self.fdoc.content.get('chash')
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,
+ 'status': [str(stat) for stat in self.status],
'security_casing': self.security_casing,
'body': self.body
- }
-
- def to_mime_multipart(self):
- mime_multipart = MIMEMultipart()
-
- for header in ['To', 'Cc', 'Bcc']:
- if self.headers[header.lower()]:
- mime_multipart[header] = ", ".join(self.headers[header.lower()])
-
- if self.headers['subject']:
- mime_multipart['Subject'] = self.headers['subject']
-
- mime_multipart['Date'] = self.headers['date']
- mime_multipart.attach(MIMEText(self.body, 'plain'))
- return mime_multipart
-
- def to_smtp_format(self):
- mime_multipart = self.to_mime_multipart()
- mime_multipart['From'] = PixelatedMail.from_email_address
- return mime_multipart.as_string()
-
- @staticmethod
- def from_dict(mail_dict):
- return from_dict(mail_dict)
-
- @classmethod
- def _get_date(cls, headers):
- date = headers.get('date', None)
- if not date:
- date = headers['received'].split(";")[-1].strip()
- return dateparser.parse(date).isoformat()
-
-
-def from_dict(mail_dict):
- mail = PixelatedMail()
- mail.headers = mail_dict.get('header', {})
- mail.headers['date'] = pixelated.support.date.iso_now()
- mail.body = mail_dict.get('body', '')
- mail._ident = mail_dict.get('ident', None)
- mail.tags = set(mail_dict.get('tags', []))
- mail.status = set(mail_dict.get('status', []))
- return mail
+ } \ No newline at end of file
diff --git a/service/pixelated/user_agent.py b/service/pixelated/user_agent.py
index 7adff10b..4c257925 100644
--- a/service/pixelated/user_agent.py
+++ b/service/pixelated/user_agent.py
@@ -78,21 +78,33 @@ def update_draft():
@app.route('/mails')
def mails():
+ # query = search_query.compile(request.args.get("q")) if request.args.get("q") else {'tags': {}}
+ #
+ # mails = mail_service.mails(query)
+ #
+ # if "inbox" in query['tags']:
+ # mails = [mail for mail in mails if not mail.has_tag('trash')]
+
query = search_query.compile(request.args.get("q")) if request.args.get("q") else {'tags': {}}
- mails = mail_service.mails(query)
+ fdocs_chash = [(fdoc, fdoc.content['chash']) for fdoc in soledad.get_from_index('by-type', 'flags')]
+ fdocs_hdocs = [(f[0], soledad.get_from_index('by-type-and-contenthash', 'head', f[1])[0]) for f in fdocs_chash]
+ fdocs_hdocs_phash = [(f[0], f[1], f[1].content.get('body')) for f in fdocs_hdocs]
+ fdocs_hdocs_bdocs = [(f[0], f[1], soledad.get_from_index('by-type-and-payloadhash', 'cnt', f[2])[0]) for f in fdocs_hdocs_phash]
+
+
+ all_mails = [PixelatedMail(*raw_mail) for raw_mail in fdocs_hdocs_bdocs]
- if "inbox" in query['tags']:
- mails = [mail for mail in mails if not mail.has_tag('trash')]
+ filtered_mails = [_mail for _mail in all_mails if set(query['tags']).intersection(_mail.tags)]
response = {
"stats": {
- "total": len(mails),
+ "total": len(filtered_mails),
"read": 0,
"starred": 0,
"replied": 0
},
- "mails": [mail.as_dict() for mail in mails]
+ "mails": [pixelated_mail.as_dict() for pixelated_mail in filtered_mails]
}
return respond_json(response)
@@ -171,7 +183,9 @@ def start_user_agent(debug_enabled):
pixelated_mail_sender = PixelatedMailSender(leap_session.account_email())
global mail_service
- mail_service = MailService(pixelated_mailboxes, pixelated_mail_sender)
+ #mail_service = MailService(pixelated_mailboxes, pixelated_mail_sender)
+ global soledad
+ soledad = leap_session.soledad_session.soledad
app.run(host=app.config['HOST'], debug=debug_enabled,
port=app.config['PORT'], use_reloader=False)