Moved some file-specific code from app/__init__ to file_storage module.

This commit is contained in:
Sybren A. Stüvel 2016-03-25 11:38:54 +01:00
parent 84723eb8d3
commit 1769f20620
2 changed files with 38 additions and 31 deletions

View File

@ -148,11 +148,7 @@ from utils.algolia import algolia_index_node_save
from utils.activities import activity_subscribe from utils.activities import activity_subscribe
from utils.activities import activity_object_add from utils.activities import activity_object_add
from utils.activities import notification_parse from utils.activities import notification_parse
from modules.file_storage import process_file from modules import file_storage
from modules.file_storage import delete_file
from modules.file_storage import generate_link
from modules.file_storage import before_returning_file
from modules.file_storage import before_returning_files
from modules.projects import before_inserting_projects from modules.projects import before_inserting_projects
from modules.projects import after_inserting_projects from modules.projects import after_inserting_projects
@ -270,7 +266,8 @@ def item_parse_attachments(response):
# Get the correc variation from the file # Get the correc variation from the file
thumbnail = next((item for item in f['variations'] if thumbnail = next((item for item in f['variations'] if
item['size'] == size), None) item['size'] == size), None)
l = generate_link(f['backend'], thumbnail['file_path'], str(f['project'])) l = file_storage.generate_link(f['backend'], thumbnail['file_path'],
str(f['project']))
# Build Markdown img string # Build Markdown img string
l = '![{0}]({1} "{2}")'.format(slug, l, f['name']) l = '![{0}]({1} "{2}")'.format(slug, l, f['name'])
# Parse the content of the file and replace the attachment # Parse the content of the file and replace the attachment
@ -358,31 +355,8 @@ def after_replacing_user(item, original):
app.on_post_GET_users += post_GET_user app.on_post_GET_users += post_GET_user
app.on_replace_users += after_replacing_user app.on_replace_users += after_replacing_user
file_storage.setup_app(app, url_prefix='/storage')
def post_POST_files(request, payload):
"""After an file object has been created, we do the necessary processing
and further update it.
"""
process_file(request.get_json())
app.on_post_POST_files += post_POST_files
app.on_fetched_item_files += before_returning_file
app.on_fetched_resource_files += before_returning_files
def before_deleting_file(item):
delete_file(item)
app.on_delete_item_files += before_deleting_file
# The file_storage module needs app to be defined
from modules.file_storage import file_storage
# from modules.file_storage.serve import *
app.register_blueprint(file_storage, url_prefix='/storage')
# The encoding module (receive notification and report progress) # The encoding module (receive notification and report progress)
from modules.encoding import encoding from modules.encoding import encoding

View File

@ -4,6 +4,7 @@ import os
from multiprocessing import Process from multiprocessing import Process
import bson.tz_util import bson.tz_util
import eve.utils
from bson import ObjectId from bson import ObjectId
from eve.methods.patch import patch_internal from eve.methods.patch import patch_internal
from eve.methods.put import put_internal from eve.methods.put import put_internal
@ -13,7 +14,6 @@ from flask import request
from flask import send_from_directory from flask import send_from_directory
from flask import url_for, helpers from flask import url_for, helpers
from application import app
from application.utils import remove_private_keys from application.utils import remove_private_keys
from application.utils.cdn import hash_file_path from application.utils.cdn import hash_file_path
from application.utils.encoding import Encoder from application.utils.encoding import Encoder
@ -62,6 +62,9 @@ def build_thumbnails(file_path=None, file_id=None):
Return a list of dictionaries containing the various image properties and Return a list of dictionaries containing the various image properties and
variation properties. variation properties.
""" """
from application import app
files_collection = app.data.driver.db['files'] files_collection = app.data.driver.db['files']
if file_path: if file_path:
# Search file with backend "pillar" and path=file_path # Search file with backend "pillar" and path=file_path
@ -113,6 +116,8 @@ def build_thumbnails(file_path=None, file_id=None):
@file_storage.route('/file', methods=['POST']) @file_storage.route('/file', methods=['POST'])
@file_storage.route('/file/<path:file_name>', methods=['GET', 'POST']) @file_storage.route('/file/<path:file_name>', methods=['GET', 'POST'])
def index(file_name=None): def index(file_name=None):
from application import app
# GET file -> read it # GET file -> read it
if request.method == 'GET': if request.method == 'GET':
return send_from_directory(app.config['STORAGE_DIR'], file_name) return send_from_directory(app.config['STORAGE_DIR'], file_name)
@ -145,6 +150,8 @@ def index(file_name=None):
def process_file(src_file): def process_file(src_file):
"""Process the file """Process the file
""" """
from application import app
file_id = src_file['_id'] file_id = src_file['_id']
# Remove properties that do not belong in the collection # Remove properties that do not belong in the collection
internal_fields = ['_id', '_etag', '_updated', '_created', '_status'] internal_fields = ['_id', '_etag', '_updated', '_created', '_status']
@ -274,6 +281,8 @@ def delete_file(file_item):
else: else:
pass pass
from application import app
files_collection = app.data.driver.db['files'] files_collection = app.data.driver.db['files']
# Collect children (variations) of the original file # Collect children (variations) of the original file
children = files_collection.find({'parent': file_item['_id']}) children = files_collection.find({'parent': file_item['_id']})
@ -287,6 +296,8 @@ def generate_link(backend, file_path, project_id=None, is_public=False):
"""Hook to check the backend of a file resource, to build an appropriate link """Hook to check the backend of a file resource, to build an appropriate link
that can be used by the client to retrieve the actual file. that can be used by the client to retrieve the actual file.
""" """
from application import app
if backend == 'gcs': if backend == 'gcs':
storage = GoogleCloudStorageBucket(project_id) storage = GoogleCloudStorageBucket(project_id)
blob = storage.Get(file_path) blob = storage.Get(file_path)
@ -353,3 +364,25 @@ def ensure_valid_link(response):
response['_updated'] = now response['_updated'] = now
else: else:
response['_updated'] = patch_resp['_updated'] response['_updated'] = patch_resp['_updated']
def post_POST_files(request, payload):
"""After an file object has been created, we do the necessary processing
and further update it.
"""
process_file(request.get_json())
def before_deleting_file(item):
delete_file(item)
def setup_app(app, url_prefix):
app.on_post_POST_files += post_POST_files
app.on_fetched_item_files += before_returning_file
app.on_fetched_resource_files += before_returning_files
app.on_delete_item_files += before_deleting_file
app.register_blueprint(file_storage, url_prefix='/storage')