summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--service/pixelated/config/app_factory.py7
-rw-r--r--service/pixelated/controllers/__init__.py1
-rw-r--r--service/pixelated/controllers/attachments_controller.py38
-rw-r--r--service/test/support/integration_helper.py3
4 files changed, 46 insertions, 3 deletions
diff --git a/service/pixelated/config/app_factory.py b/service/pixelated/config/app_factory.py
index 735313b4..02e5781b 100644
--- a/service/pixelated/config/app_factory.py
+++ b/service/pixelated/config/app_factory.py
@@ -52,7 +52,7 @@ def update_info_sync_and_index_partial(sync_info_controller, search_engine, mail
return wrapper
-def _setup_routes(app, home_controller, mails_controller, tags_controller, features_controller, sync_info_controller):
+def _setup_routes(app, home_controller, mails_controller, tags_controller, features_controller, sync_info_controller, attachments_controller):
# home
app.add_url_rule('/', methods=['GET'], view_func=home_controller.home)
# mails
@@ -73,6 +73,8 @@ def _setup_routes(app, home_controller, mails_controller, tags_controller, featu
app.add_url_rule('/features', methods=['GET'], view_func=features_controller.features)
# sync info
app.add_url_rule('/sync_info', methods=['GET'], view_func=sync_info_controller.sync_info)
+ # attachments
+ app.add_url_rule('/attachment/<attachment_id>', methods=['GET'], view_func=attachments_controller.attachment)
def init_leap_session(app):
@@ -113,6 +115,7 @@ def create_app(app, debug_enabled):
search_engine=search_engine)
tags_controller = TagsController(search_engine=search_engine)
sync_info_controller = SyncInfoController()
+ attachments_controller = AttachmentsController(soledad_querier)
register(signal=proto.SOLEDAD_SYNC_RECEIVE_STATUS,
callback=update_info_sync_and_index_partial(sync_info_controller=sync_info_controller,
@@ -124,7 +127,7 @@ def create_app(app, debug_enabled):
mail_service=mail_service))
_setup_routes(app, home_controller, mails_controller, tags_controller, features_controller,
- sync_info_controller)
+ sync_info_controller, attachments_controller)
app.run(host=app.config['HOST'], debug=debug_enabled,
port=app.config['PORT'], use_reloader=False)
diff --git a/service/pixelated/controllers/__init__.py b/service/pixelated/controllers/__init__.py
index c454ba55..e0c05afd 100644
--- a/service/pixelated/controllers/__init__.py
+++ b/service/pixelated/controllers/__init__.py
@@ -30,3 +30,4 @@ from mails_controller import MailsController
from tags_controller import TagsController
from features_controller import FeaturesController
from sync_info_controller import SyncInfoController
+from attachments_controller import AttachmentsController
diff --git a/service/pixelated/controllers/attachments_controller.py b/service/pixelated/controllers/attachments_controller.py
new file mode 100644
index 00000000..7435ce33
--- /dev/null
+++ b/service/pixelated/controllers/attachments_controller.py
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2014 ThoughtWorks, Inc.
+#
+# Pixelated is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Pixelated is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with Pixelated. If not, see <http://www.gnu.org/licenses/>.
+
+from flask import send_file
+from flask import request
+
+import io
+import re
+
+
+class AttachmentsController:
+
+ def __init__(self, querier):
+ self.querier = querier
+
+ def attachment(self, attachment_id):
+ encoding = request.args.get('encoding', '')
+ attachment = self.querier.attachment(attachment_id, encoding)
+ response = send_file(io.BytesIO(attachment['content']),
+ mimetype=self._extract_mimetype(attachment['content-type']))
+ return response
+
+ def _extract_mimetype(self, content_type):
+ match = re.compile('([A-Za-z-]+\/[A-Za-z-]+)').search(content_type)
+ return match.group(1)
diff --git a/service/test/support/integration_helper.py b/service/test/support/integration_helper.py
index 4691af2d..3abf53da 100644
--- a/service/test/support/integration_helper.py
+++ b/service/test/support/integration_helper.py
@@ -162,9 +162,10 @@ class SoledadTestBase:
search_engine=self.search_engine)
tags_controller = TagsController(search_engine=self.search_engine)
sync_info_controller = SyncInfoController()
+ attachments_controller = AttachmentsController(self.soledad_querier)
app_factory._setup_routes(self.client.application, home_controller, mails_controller, tags_controller,
- features_controller, sync_info_controller)
+ features_controller, sync_info_controller, attachments_controller)
def get_mails_by_tag(self, tag, page=1, window=100):
response = json.loads(self.client.get("/mails?q=tag:%s&w=%s&p=%s" % (tag, window, page)).data)