Source code for invenio_s3.ext
# -*- coding: utf-8 -*-
#
# Copyright (C) 2018, 2019 Esteban J. G. Gabancho.
#
# Invenio-S3 is free software; you can redistribute it and/or modify it
# under the terms of the MIT License; see LICENSE file for more details.
"""S3 file storage support for Invenio."""
from __future__ import absolute_import, print_function
import warnings
import boto3
from flask import current_app
from werkzeug.utils import cached_property
from . import config
[docs]class InvenioS3(object):
"""Invenio-S3 extension."""
def __init__(self, app=None):
"""Extension initialization."""
if app:
self.init_app(app)
[docs] @cached_property
def init_s3fs_info(self):
"""Gather all the information needed to start the S3FSFileSystem."""
if 'S3_ACCCESS_KEY_ID' in current_app.config:
current_app.config['S3_ACCESS_KEY_ID'] = current_app.config[
'S3_ACCCESS_KEY_ID']
warnings.warn(
'Key S3_ACCCESS_KEY_ID contained a typo and has been '
'corrected to S3_ACCESS_KEY_ID, support for the '
'flawed version will be removed.',
DeprecationWarning
)
if 'S3_SECRECT_ACCESS_KEY' in current_app.config:
current_app.config['S3_SECRET_ACCESS_KEY'] = current_app.config[
'S3_SECRECT_ACCESS_KEY']
warnings.warn(
'Key S3_SECRECT_ACCESS_KEY contained a typo and has been '
'corrected to S3_SECRET_ACCESS_KEY, support for the '
'flawed version will be removed.',
DeprecationWarning
)
info = dict(
key=current_app.config.get('S3_ACCESS_KEY_ID', ''),
secret=current_app.config.get('S3_SECRET_ACCESS_KEY', ''),
client_kwargs={},
config_kwargs={
's3': {
'addressing_style': 'path',
},
'signature_version': current_app.config.get(
'S3_SIGNATURE_VERSION', 's3v4'
),
},
)
s3_endpoint = current_app.config.get('S3_ENDPOINT_URL', None)
if s3_endpoint:
info['client_kwargs']['endpoint_url'] = s3_endpoint
region_name = current_app.config.get('S3_REGION_NAME', None)
if region_name:
info['client_kwargs']['region_name'] = region_name
return info
[docs] def init_app(self, app):
"""Flask application initialization."""
self.init_config(app)
app.extensions['invenio-s3'] = self
[docs] def init_config(self, app):
"""Initialize configuration."""
for k in dir(config):
if k.startswith('S3_'):
app.config.setdefault(k, getattr(config, k))