Skip to content

Commit cb2432a

Browse files
committed
feat
1 parent 6124e1a commit cb2432a

3 files changed

Lines changed: 24 additions & 17 deletions

File tree

smart_storages/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
from .s3_backend import BaseSpecialS3Storage
2-
__all__ = ["BaseSpecialS3Storage"]
2+
3+
__all__ = ["BaseSpecialS3Storage"]

smart_storages/s3_backend.py

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,26 @@ class BaseSpecialS3Storage(S3Boto3Storage):
99
Uses the bucket defined by a Django setting key.
1010
"""
1111

12-
setting_name = None # subclasses must define this
12+
storage_key = None # e.g. "import_export" or "COURSE_IMPORT_EXPORT_BUCKET"
1313

1414
def __init__(self, **kwargs):
15-
# Explicitly resolve bucket name from Django settings or fallback
16-
if self.setting_name and hasattr(settings, self.setting_name):
17-
bucket_name = getattr(settings, self.setting_name)
18-
else:
19-
bucket_name = getattr(settings, "AWS_STORAGE_BUCKET_NAME", None)
20-
# Merge default options with user-supplied ones
21-
options = {
22-
"bucket_name": bucket_name,
23-
"custom_domain": None,
24-
"querystring_auth": True,
25-
**kwargs, # allow overrides
26-
}
15+
# Start with sane defaults
16+
options = {"querystring_auth": True}
17+
18+
# Load from STORAGES if configured
19+
if hasattr(settings, "STORAGES") and self.storage_key:
20+
storage_conf = settings.STORAGES.get(self.storage_key, {})
21+
options.update(storage_conf.get("OPTIONS", {}))
22+
23+
# Fallback: if bucket not set, look for setting variable
24+
if "bucket_name" not in options:
25+
# Allow storage_key to be either "import_export"
26+
bucket_name = getattr(settings, self.storage_key, None)
27+
if not bucket_name:
28+
bucket_name = getattr(settings, "AWS_STORAGE_BUCKET_NAME", None)
29+
options["bucket_name"] = bucket_name
30+
31+
# Finally, user kwargs override everything
32+
options.update(kwargs)
2733

2834
super().__init__(**options)

tests/test_storages.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66

77
class ImportExportS3Storage(BaseSpecialS3Storage):
8-
setting_name = "COURSE_IMPORT_EXPORT_BUCKET"
8+
storage_key = "COURSE_IMPORT_EXPORT_BUCKET"
99

1010

1111
class AnalyticsS3Storage(BaseSpecialS3Storage):
12-
setting_name = "ANALYTICS_BUCKET"
12+
storage_key = "ANALYTICS_BUCKET"
1313

1414

1515
class TestSpecialStorages(TestCase):
@@ -28,7 +28,7 @@ def test_base_storage_uses_default_bucket(self):
2828
def test_custom_bucket_is_used(self):
2929
"""
3030
The class should pick up its bucket name from the setting defined
31-
in `setting_name`.
31+
in `storage_key`.
3232
"""
3333
storage = ImportExportS3Storage()
3434
self.assertEqual(storage.bucket_name, "import-export-bucket")

0 commit comments

Comments
 (0)