Couple of changes
This commit is contained in:
parent
11f8a07887
commit
8496309ad7
@ -4,3 +4,4 @@ from django.apps import AppConfig
|
|||||||
class BYOStorageConfig(AppConfig):
|
class BYOStorageConfig(AppConfig):
|
||||||
name = 'byostorage'
|
name = 'byostorage'
|
||||||
verbose_name = 'Bring your own storage'
|
verbose_name = 'Bring your own storage'
|
||||||
|
default_auto_field = 'django.db.models.AutoField'
|
||||||
|
|||||||
@ -5,11 +5,17 @@ BASE_DIR = Path(__file__).resolve().parent.parent
|
|||||||
|
|
||||||
MEDIA_ROOT = "media"
|
MEDIA_ROOT = "media"
|
||||||
|
|
||||||
|
DEBUG = True
|
||||||
|
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
|
||||||
|
|
||||||
|
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
'django.contrib.auth',
|
'django.contrib.auth',
|
||||||
'django.contrib.contenttypes',
|
'django.contrib.contenttypes',
|
||||||
'byostorage'
|
'byostorage',
|
||||||
|
'example'
|
||||||
]
|
]
|
||||||
|
|
||||||
SECRET_KEY = 'shh!'
|
SECRET_KEY = 'shh!'
|
||||||
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
|
|||||||
@ -1,9 +1,15 @@
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.core.files.storage import get_storage_class, FileSystemStorage
|
from django.db.models.fields.files import FieldFile
|
||||||
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
from django.core.files.storage import Storage, get_storage_class
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
import logging
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
logger.setLevel(logging.DEBUG)
|
||||||
|
|
||||||
STORAGE_CLASSES = getattr(settings, 'STORAGE_CLASSES', [])
|
STORAGE_CLASSES = getattr(settings, 'STORAGE_CLASSES', [])
|
||||||
|
|
||||||
STORAGE_CLASSES.extend([
|
STORAGE_CLASSES.extend([
|
||||||
@ -11,7 +17,7 @@ STORAGE_CLASSES.extend([
|
|||||||
])
|
])
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import storages
|
import storages.backends
|
||||||
STORAGE_CLASSES.append('storages.backends.s3boto3.S3Boto3Storage')
|
STORAGE_CLASSES.append('storages.backends.s3boto3.S3Boto3Storage')
|
||||||
except ImportError:
|
except ImportError:
|
||||||
pass
|
pass
|
||||||
@ -24,6 +30,15 @@ def validate_json(value):
|
|||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
raise ValidationError(e.msg)
|
raise ValidationError(e.msg)
|
||||||
|
|
||||||
|
def resolve_instance(obj, relation):
|
||||||
|
for p in relation.split('__'):
|
||||||
|
obj = getattr(obj, p)
|
||||||
|
|
||||||
|
if callable(obj):
|
||||||
|
obj = obj()
|
||||||
|
|
||||||
|
return obj
|
||||||
|
|
||||||
class UserStorage(models.Model):
|
class UserStorage(models.Model):
|
||||||
""" A user defined storage
|
""" A user defined storage
|
||||||
"""
|
"""
|
||||||
@ -75,4 +90,45 @@ class UserStorage(models.Model):
|
|||||||
super(UserStorage, self).save(*args, **kwargs)
|
super(UserStorage, self).save(*args, **kwargs)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
class BYOFieldFile(FieldFile):
|
||||||
|
|
||||||
|
def __init__(self, instance, field, name):
|
||||||
|
logger.debug("BYOFieldFile(%r, %r, %r)", instance, field, name)
|
||||||
|
super().__init__(instance, field, name)
|
||||||
|
try:
|
||||||
|
self.storage = field.get_storage(instance)
|
||||||
|
logger.debug("Using BYO storage: %r", self.storage)
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
logger.debug("Unable to select BYO storage")
|
||||||
|
self.storage = None # trigger error if try to save etc
|
||||||
|
|
||||||
|
class BYOStorageField(models.FileField):
|
||||||
|
attr_class = BYOFieldFile
|
||||||
|
|
||||||
|
def __init__(self, storage_instance, *args, **kwargs):
|
||||||
|
self.storage_instance = storage_instance
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def deconstruct(self):
|
||||||
|
name, path, args, kwargs = super().deconstruct()
|
||||||
|
args = [self.storage_instance] + args
|
||||||
|
return name, path, args, kwargs
|
||||||
|
|
||||||
|
def get_storage(self, instance):
|
||||||
|
|
||||||
|
if callable(self.storage_instance):
|
||||||
|
storage = self.storage_instance(instance)
|
||||||
|
else:
|
||||||
|
storage = resolve_instance(instance, self.storage_instance)
|
||||||
|
|
||||||
|
if not isinstance(storage, Storage):
|
||||||
|
raise RuntimeError("Not a storage instance")
|
||||||
|
|
||||||
|
return storage
|
||||||
|
|
||||||
|
#def formfield(self, **kwargs):
|
||||||
|
# return BYOStorageFormField(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user