Skip to content
Snippets Groups Projects
storage_backends.py 1.77 KiB
from urllib import parse

from django.conf import settings
from django.urls import reverse
from django.utils.encoding import filepath_to_uri
from storages.backends.s3boto3 import S3Boto3Storage


class PublicMediaStorage(S3Boto3Storage):
    if hasattr(settings, 'AWS_PUBLIC_BUCKET_NAME'):
        bucket_name = settings.AWS_PUBLIC_BUCKET_NAME

    if hasattr(settings, 'AWS_PUBLIC_CUSTOM_DOMAIN'):
        custom_domain = settings.AWS_PUBLIC_CUSTOM_DOMAIN

    file_overwrite = False
    querystring_auth = False
    url_protocol = 'https:'


class PrivateMediaStorage(S3Boto3Storage):
    if hasattr(settings, 'AWS_PRIVATE_BUCKET_NAME'):
        bucket_name = settings.AWS_PRIVATE_BUCKET_NAME

    bucket_acl = 'private'
    custom_domain = False
    default_acl = 'private'
    encryption = True
    file_overwrite = False
    querystring_auth = True
    url_protocol = 'https:'
    is_submission = False

    def url(self, name, parameters=None, expire=None):
        if self.is_submission:
            try:
                name_parts = name.split('/')
                return reverse(
                    'apply:submissions:serve_private_media', kwargs={
                        'submission_id': name_parts[1], 'field_id': name_parts[2],
                        'file_name': name_parts[3]
                    }
                )
            except IndexError:
                pass

        url = super().url(name, parameters, expire)

        if hasattr(settings, 'AWS_PRIVATE_CUSTOM_DOMAIN'):
            # Django storage doesn't handle custom domains with auth strings
            custom_domain = settings.AWS_PRIVATE_CUSTOM_DOMAIN
            parts = list(parse.urlsplit(url))
            parts[1:3] = custom_domain, filepath_to_uri(name)
            return parse.urlunsplit(parts)

        return url