import json from pixelated.adapter.model.mail import InputMail from pixelated.resources import respond_json from twisted.web.resource import Resource from leap.common.events import ( register, events_pb2 as proto ) class MailsUnreadResource(Resource): isLeaf = True def __init__(self, mail_service, search_engine): Resource.__init__(self) self._search_engine = search_engine self._mail_service = mail_service def render_POST(self, request): content_dict = json.load(request.content) idents = content_dict.get('idents') for ident in idents: mail = self._mail_service.mark_as_unread(ident) self._search_engine.index_mail(mail) return respond_json(None, request) class MailsReadResource(Resource): isLeaf = True def __init__(self, mail_service, search_engine): Resource.__init__(self) self._search_engine = search_engine self._mail_service = mail_service def render_POST(self, request): content_dict = json.load(request.content) idents = content_dict.get('idents') for ident in idents: mail = self._mail_service.mark_as_read(ident) self._search_engine.index_mail(mail) return respond_json(None, request) class MailsDeleteResource(Resource): isLeaf = True def __init__(self, mail_service, search_engine): Resource.__init__(self) self._mail_service = mail_service self._search_engine = search_engine def render_POST(self, request): idents = json.loads(request.content.read())['idents'] for ident in idents: self._delete_mail(ident) return respond_json(None, request) def _delete_mail(self, mail_id): mail = self._mail_service.mail(mail_id) if mail.mailbox_name == 'TRASH': self._mail_service.delete_permanent(mail_id) self._search_engine.remove_from_index(mail_id) else: trashed_mail = self._mail_service.delete_mail(mail_id) self._search_engine.index_mail(trashed_mail) class MailsResource(Resource): def _register_smtp_error_handler(self): def on_error(event): delivery_error_mail = InputMail.delivery_error_template(delivery_address=event.content) delivery_error_mail = self._mail_service.mailboxes.inbox().add(delivery_error_mail) self._search_engine.index_mail(delivery_error_mail) register(signal=proto.SMTP_SEND_MESSAGE_ERROR, callback=on_error) def __init__(self, search_engine, mail_service, draft_service): Resource.__init__(self) self.putChild('delete', MailsDeleteResource(mail_service, search_engine)) self.putChild('read', MailsReadResource(mail_service, search_engine)) self.putChild('unread', MailsUnreadResource(mail_service, search_engine)) self._draft_service = draft_service self._mail_service = mail_service self._search_engine = search_engine self._register_smtp_error_handler() def render_GET(self, request): query, window_size, page = request.args.get('q')[0], request.args.get('w')[0], request.args.get('p')[0] mails, total = self._mail_service.mails(query, window_size, page) response = { "stats": { "total": total, }, "mails": [mail.as_dict() for mail in mails] } return respond_json(response, request) def render_POST(self, request): content_dict = json.loads(request.content.read()) sent_mail = self._mail_service.send_mail(content_dict) return respond_json(sent_mail.as_dict(), request) def render_PUT(self, request): content_dict = json.loads(request.content.read()) _mail = InputMail.from_dict(content_dict) draft_id = content_dict.get('ident') if draft_id: if not self._mail_service.mail_exists(draft_id): return respond_json("", request, status_code=422) pixelated_mail = self._draft_service.update_draft(draft_id, _mail) self._search_engine.remove_from_index(draft_id) else: pixelated_mail = self._draft_service.create_draft(_mail) self._search_engine.index_mail(pixelated_mail) return respond_json({'ident': pixelated_mail.ident}, request)