From 9ab17e2bbf61062ce8399ef1c51d2069a0cced31 Mon Sep 17 00:00:00 2001 From: Duda Dornelles Date: Fri, 31 Oct 2014 12:17:26 +0100 Subject: moving to twisted --- service/pixelated/controllers/__init__.py | 9 ++-- .../controllers/attachments_controller.py | 4 +- .../pixelated/controllers/features_controller.py | 4 +- service/pixelated/controllers/home_controller.py | 24 +++++++-- service/pixelated/controllers/mails_controller.py | 63 ++++++++++++---------- .../pixelated/controllers/sync_info_controller.py | 4 +- service/pixelated/controllers/tags_controller.py | 6 +-- 7 files changed, 67 insertions(+), 47 deletions(-) (limited to 'service/pixelated/controllers') diff --git a/service/pixelated/controllers/__init__.py b/service/pixelated/controllers/__init__.py index e0c05afd..9e447d4d 100644 --- a/service/pixelated/controllers/__init__.py +++ b/service/pixelated/controllers/__init__.py @@ -15,16 +15,15 @@ # along with Pixelated. If not, see . -def respond_json(entity, status_code=200): +def respond_json(entity, request, status_code=200): json_response = json.dumps(entity) - response = Response(response=json_response, mimetype="application/json") - response.status_code = status_code - return response + request.responseHeaders.addRawHeader(b"content-type", b"application/json") + request.code = status_code + return json_response import json -from flask import Response from home_controller import HomeController from mails_controller import MailsController from tags_controller import TagsController diff --git a/service/pixelated/controllers/attachments_controller.py b/service/pixelated/controllers/attachments_controller.py index 7435ce33..68e73bd6 100644 --- a/service/pixelated/controllers/attachments_controller.py +++ b/service/pixelated/controllers/attachments_controller.py @@ -26,8 +26,8 @@ class AttachmentsController: def __init__(self, querier): self.querier = querier - def attachment(self, attachment_id): - encoding = request.args.get('encoding', '') + def attachment(self, request, attachment_id): + encoding = request.args.get('encoding', [''])[0] attachment = self.querier.attachment(attachment_id, encoding) response = send_file(io.BytesIO(attachment['content']), mimetype=self._extract_mimetype(attachment['content-type'])) diff --git a/service/pixelated/controllers/features_controller.py b/service/pixelated/controllers/features_controller.py index 49fc875f..4d375683 100644 --- a/service/pixelated/controllers/features_controller.py +++ b/service/pixelated/controllers/features_controller.py @@ -24,9 +24,9 @@ class FeaturesController: def __init__(self): pass - def features(self): + def features(self, request): try: disabled_features = {'logout': os.environ['DISPATCHER_LOGOUT_URL']} except KeyError: disabled_features = {} - return respond_json({'disabled_features': self.DISABLED_FEATURES, 'dispatcher_features': disabled_features}) + return respond_json({'disabled_features': self.DISABLED_FEATURES, 'dispatcher_features': disabled_features}, request) diff --git a/service/pixelated/controllers/home_controller.py b/service/pixelated/controllers/home_controller.py index 69ecd52f..ccdad197 100644 --- a/service/pixelated/controllers/home_controller.py +++ b/service/pixelated/controllers/home_controller.py @@ -13,14 +13,30 @@ # # You should have received a copy of the GNU Affero General Public License # along with Pixelated. If not, see . +import os -from flask import current_app +from twisted.web.static import File class HomeController: - def __init__(self): + self.static_folder = self._get_static_folder() pass - def home(self): - return current_app.send_static_file('index.html') + def _get_static_folder(self): + + static_folder = os.path.abspath(os.path.join(os.path.abspath(__file__), "..", "..", "..", "web-ui", "app")) + # this is a workaround for packaging + if not os.path.exists(static_folder): + static_folder = os.path.abspath( + os.path.join(os.path.abspath(__file__), "..", "..", "..", "..", "web-ui", "app")) + if not os.path.exists(static_folder): + static_folder = os.path.join('/', 'usr', 'share', 'pixelated-user-agent') + return static_folder + + def home(self, request): + request_type = request.requestHeaders.getRawHeaders('accept')[0].split(',')[0] + response_type = request_type if request_type else "text/html" + + request.setHeader('Content-Type', response_type) + return File('%s/' % self.static_folder, defaultType=response_type) diff --git a/service/pixelated/controllers/mails_controller.py b/service/pixelated/controllers/mails_controller.py index ebef4af1..3a2e0d3b 100644 --- a/service/pixelated/controllers/mails_controller.py +++ b/service/pixelated/controllers/mails_controller.py @@ -17,7 +17,6 @@ import json from pixelated.adapter.mail import InputMail from pixelated.controllers import respond_json -from flask import request class MailsController: @@ -27,8 +26,8 @@ class MailsController: self._draft_service = draft_service self._search_engine = search_engine - def mails(self, _request=request): - mail_ids, total = self._search_engine.search(_request.args.get('q'), _request.args.get('w'), _request.args.get('p')) + def mails(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 = { @@ -38,77 +37,83 @@ class MailsController: "mails": [mail.as_dict() for mail in mails] } - return respond_json(response) + return json.dumps(response) - def mail(self, mail_id): + def mail(self, request, mail_id): mail = self._mail_service.mail(mail_id) - return respond_json(mail.as_dict()) + return respond_json(mail.as_dict(), request) - def mark_mail_as_read(self, mail_id): + def mark_mail_as_read(self, request, mail_id): mail = self._mail_service.mark_as_read(mail_id) self._search_engine.index_mail(mail) return "" - def mark_mail_as_unread(self, mail_id): + def mark_mail_as_unread(self, request, mail_id): mail = self._mail_service.mark_as_unread(mail_id) self._search_engine.index_mail(mail) return "" - def mark_many_mail_unread(self): - idents = json.loads(request.form['idents']) + def mark_many_mail_unread(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 "" - def mark_many_mail_read(self): - idents = json.loads(request.form['idents']) + def mark_many_mail_read(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 "" - def delete_mail(self, mail_id): + def delete_mail(self, request, mail_id): mail = self._mail_service.mail(mail_id) if mail.mailbox_name == 'TRASH': self._mail_service.delete_permanent(mail_id) else: trashed_mail = self._mail_service.delete_mail(mail_id) self._search_engine.index_mail(trashed_mail) - return respond_json(None) + return respond_json(None, request) - def delete_mails(self): + def delete_mails(self, request): idents = json.loads(request.form['idents']) for ident in idents: self.delete_mail(ident) - return respond_json(None) + return respond_json(None, request) - def send_mail(self, _request=request): + def send_mail(self, request): try: - _mail = InputMail.from_dict(_request.json) - draft_id = _request.json.get('ident') + 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()) + return respond_json(_mail.as_dict(), request) except Exception as error: - return respond_json({'message': self._format_exception(error)}, status_code=422) + return respond_json({'message': self._format_exception(error)}, request, status_code=422) - def mail_tags(self, mail_id): - new_tags = map(lambda tag: tag.lower(), request.get_json()['newtags']) + def mail_tags(self, request, mail_id): + content_dict = json.loads(request.content.read()) + new_tags = map(lambda tag: tag.lower(), content_dict['newtags']) try: self._mail_service.update_tags(mail_id, new_tags) mail = self._mail_service.mail(mail_id) self._search_engine.index_mail(mail) except ValueError as ve: - return respond_json(ve.message, 403) - return respond_json(mail.as_dict()) + return respond_json(ve.message, request, 403) + return respond_json(mail.as_dict(), request) + + def update_draft(self, request): + content_dict = json.loads(request.content.read()) - def update_draft(self): - _mail = InputMail.from_dict(request.json) - draft_id = request.json.get('ident') + _mail = InputMail.from_dict(content_dict) + draft_id = content_dict.get('ident') if draft_id: ident = self._draft_service.update_draft(draft_id, _mail).ident self._search_engine.remove_from_index(draft_id) @@ -116,7 +121,7 @@ class MailsController: ident = self._draft_service.create_draft(_mail).ident self._search_engine.index_mail(self._mail_service.mail(ident)) - return respond_json({'ident': ident}) + return respond_json({'ident': ident}, request) def _format_exception(self, exception): exception_info = map(str, list(exception.args)) diff --git a/service/pixelated/controllers/sync_info_controller.py b/service/pixelated/controllers/sync_info_controller.py index 3a8e1a16..50e53852 100644 --- a/service/pixelated/controllers/sync_info_controller.py +++ b/service/pixelated/controllers/sync_info_controller.py @@ -29,7 +29,7 @@ class SyncInfoController: def set_sync_info(self, soledad_sync_status): self.current, self.total = map(int, soledad_sync_status.content.split('/')) - def sync_info(self): + def sync_info(self, request): _sync_info = { 'is_syncing': self.current != self.total, 'count': { @@ -38,4 +38,4 @@ class SyncInfoController: 'progress': self._get_progress() } } - return respond_json(_sync_info) + return respond_json(_sync_info, request) diff --git a/service/pixelated/controllers/tags_controller.py b/service/pixelated/controllers/tags_controller.py index 52ed762a..0b9a94ac 100644 --- a/service/pixelated/controllers/tags_controller.py +++ b/service/pixelated/controllers/tags_controller.py @@ -23,8 +23,8 @@ class TagsController: def __init__(self, search_engine): self._search_engine = search_engine - def tags(self): - query = request.args.get('q') + def tags(self, request): + query = request.args.get('q', [''])[0] skip_default_tags = request.args.get('skipDefaultTags') tags = self._search_engine.tags(query=query, skip_default_tags=skip_default_tags) - return respond_json(tags) + return respond_json(tags, request) -- cgit v1.2.3