diff options
author | Duda Dornelles <ddornell@thoughtworks.com> | 2014-09-22 18:26:27 -0300 |
---|---|---|
committer | Duda Dornelles <ddornell@thoughtworks.com> | 2014-09-22 18:27:45 -0300 |
commit | ffc08b7c5b449246cc00ff9d7425c6fecf3a0cfb (patch) | |
tree | e40680d63069d87f0c594558c64fb3e8b77847c4 | |
parent | d645a4d150c10142f79caee7f60d531df824c334 (diff) |
initial implementation for getting all mails
-rw-r--r-- | service/pixelated/adapter/pixelated_mail.py | 176 | ||||
-rw-r--r-- | service/pixelated/user_agent.py | 26 |
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) |