summaryrefslogtreecommitdiff
path: root/service/pixelated/resources/mails_resource.py
diff options
context:
space:
mode:
authorDuda Dornelles <dudassdornelles@gmail.com>2015-01-21 18:12:25 -0200
committerPixpoa pairing <pixpoapairing@pixelated-project.org>2015-01-21 18:12:25 -0200
commit8abb94a88e40fde249b562a841a5b0398582717e (patch)
treec2cc4c7a00e80fb85423cd3a0b7a25c076a710c4 /service/pixelated/resources/mails_resource.py
parent8310db57c7f1829497ebadddff65682392a60a27 (diff)
#224 App is working without klein - migration to twisted "complete"
Diffstat (limited to 'service/pixelated/resources/mails_resource.py')
-rw-r--r--service/pixelated/resources/mails_resource.py128
1 files changed, 128 insertions, 0 deletions
diff --git a/service/pixelated/resources/mails_resource.py b/service/pixelated/resources/mails_resource.py
new file mode 100644
index 00000000..75c73349
--- /dev/null
+++ b/service/pixelated/resources/mails_resource.py
@@ -0,0 +1,128 @@
+import json
+from pixelated.adapter.model.mail import InputMail
+from pixelated.resources import respond_json
+from twisted.web.resource import Resource
+
+
+def _format_exception(e):
+ exception_info = map(str, list(e.args))
+ return '\n'.join(exception_info)
+
+
+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 ""
+
+
+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 ""
+
+
+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 __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
+
+ def render_GET(self, request):
+ mail_ids, total = self._search_engine.search(request.args.get('q')[0], request.args.get('w')[0], request.args.get('p')[0])
+ mails = self._mail_service.mails(mail_ids)
+
+ response = {
+ "stats": {
+ "total": total,
+ },
+ "mails": [mail.as_dict() for mail in mails]
+ }
+
+ return json.dumps(response)
+
+ def render_POST(self, request):
+ try:
+ content_dict = json.loads(request.content.read())
+ _mail = InputMail.from_dict(content_dict)
+ draft_id = content_dict.get('ident')
+ if draft_id:
+ self._search_engine.remove_from_index(draft_id)
+ _mail = self._mail_service.send(draft_id, _mail)
+ self._search_engine.index_mail(_mail)
+
+ return respond_json(_mail.as_dict(), request)
+ except Exception as error:
+ return respond_json({'message': _format_exception(error)}, request, status_code=422)
+
+ 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)
+
+
+