Assign ContentDisposition to GCS items on save

This commit is contained in:
2016-01-07 20:06:25 +01:00
parent 7037de64b3
commit c6636e4ac7
2 changed files with 38 additions and 5 deletions

View File

@@ -240,6 +240,31 @@ bugsnag.configure(
project_root = "/data/git/pillar/pillar",
)
handle_exceptions(app)
from utils.cdn import hash_file_path
from application.utils.gcs import GoogleCloudStorageBucket
def update_file_name(item):
"""Assign to the CGS blob the same name of the asset node. This way when
downloading an asset we get a human-readable name.
"""
def _update_name(item, file_id):
files_collection = app.data.driver.db['files']
f = files_collection.find_one({'_id': file_id})
if f['backend'] == 'gcs':
storage = GoogleCloudStorageBucket(str(item['project']))
blob = storage.Get(f['file_path'], to_dict=False)
storage.update_name(blob, item['name'])
# Currently we search for 'file' and 'files' keys in the object properties.
# This could become a bit more flexible and realy on a true reference of the
# file object type from the schema.
if 'file' in item['properties']:
_update_name(item, item['properties']['file'])
elif 'files' in item['properties']:
for f in item['properties']['files']:
_update_name(item, f['file'])
def check_permissions(resource, method, append_allowed_methods=False):
@@ -323,6 +348,7 @@ def before_returning_resource_permissions(response):
def before_replacing_node(item, original):
check_permissions(original, 'PUT')
update_file_name(item)
def before_inserting_nodes(items):
"""Before inserting a node in the collection we check if the user is allowed
@@ -400,7 +426,6 @@ app.on_fetched_resource_node_types += before_returning_resource_permissions
app.on_replace_nodes += before_replacing_node
app.on_insert_nodes += before_inserting_nodes
def post_GET_user(request, payload):
json_data = json.loads(payload.data)
# Check if we are querying the users endpoint (instead of the single user)
@@ -423,8 +448,7 @@ def post_POST_files(request, payload):
app.on_post_POST_files += post_POST_files
from utils.cdn import hash_file_path
from application.utils.gcs import GoogleCloudStorageBucket
# 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.
def generate_link(backend, file_path, project_id=None):

View File

@@ -32,14 +32,14 @@ class GoogleCloudStorageBucket(object):
private_key_pem = f.read()
credentials_pem = SignedJwtAssertionCredentials(GCS_CLIENT_EMAIL,
private_key_pem,
'https://www.googleapis.com/auth/devstorage.read_write')
'https://www.googleapis.com/auth/devstorage.full_control')
# Load private key in p12 format (used by the singed urls generator)
with open(GCS_PRIVATE_KEY_P12) as f:
private_key_pkcs12 = f.read()
credentials_p12 = SignedJwtAssertionCredentials(GCS_CLIENT_EMAIL,
private_key_pkcs12,
'https://www.googleapis.com/auth/devstorage.read_write')
'https://www.googleapis.com/auth/devstorage.full_control')
def __init__(self, bucket_name, subdir='_/'):
@@ -141,3 +141,12 @@ class GoogleCloudStorageBucket(object):
return True
except NotFound:
return None
def update_name(self, blob, name):
"""Set the ContentDisposition metadata so that when a file is downloaded
it has a human-readable name.
"""
blob.content_disposition = "attachment; filename={0}".format(name)
blob.patch()