Skip to content

Commit

Permalink
Merge fe915ac into a679f36
Browse files Browse the repository at this point in the history
  • Loading branch information
matllubos committed Oct 11, 2019
2 parents a679f36 + fe915ac commit fe71990
Showing 1 changed file with 32 additions and 25 deletions.
57 changes: 32 additions & 25 deletions chamber/storages/boto3.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@


__all__ = (
'S3Storage',
'BaseS3Storage',
'BasePrivateS3Storage',
'BasePrivateS3DataStorage',
'force_bytes_content',
'get_storage_instance',
's3_presigned_download_url',
)


Expand All @@ -30,36 +31,42 @@ def force_bytes_content(content, blocksize=1024):
return content, False


def s3_presigned_download_url(url=None, file=None, expiration=3600):
if not url and not file:
raise ValueError('You must provide either a "url" or "file".')
def get_storage_class(s3_storage_class, default_storage_class=DefaultStorage):
return s3_storage_class if settings.AWS_S3_ON else default_storage_class

if url:
return url
if not settings.AWS_S3_ON:
return file.url

s3 = boto3.client('s3', config=Config(region_name=settings.AWS_REGION, signature_version='s3v4'))
url = s3.generate_presigned_url(
'get_object',
Params={
'Bucket': file.storage.bucket_name,
'Key': file.storage.get_full_relative_path(file.name),
},
ExpiresIn=expiration,
)
return url
def get_storage_instance(s3_storage_class, default_storage_class=DefaultStorage):
return s3_storage_class() if settings.AWS_S3_ON else default_storage_class()


def get_storage_instance(storage_class, default_storage_class=DefaultStorage):
return storage_class() if settings.AWS_S3_ON else default_storage_class()
class BaseS3Storage(S3Boto3Storage):

def save(self, name, content, max_length=None):
content, _ = force_bytes_content(content)
return super().save(name, content, max_length)

class S3Storage(S3Boto3Storage):

class BasePrivateS3Storage(BaseS3Storage):

expiration = 3600

def get_full_relative_path(self, filename):
return '{}/{}'.format(self.location, filename) if self.location else filename

def save(self, name, content, max_length=None):
content, _ = force_bytes_content(content)
return super().save(name, content, max_length)
def url(self, name):
s3 = boto3.client('s3', config=Config(region_name=settings.AWS_REGION, signature_version='s3v4'))
url = s3.generate_presigned_url(
'get_object',
Params={
'Bucket': self.bucket_name,
'Key': self.get_full_relative_path(name),
},
ExpiresIn=self.expiration,
)
return url


class BasePrivateS3DataStorage(S3Boto3Storage):

def url(self, name):
raise RuntimeError('You cannot generate data storage URL')

0 comments on commit fe71990

Please sign in to comment.