Couple of changes

This commit is contained in:
Tris 2021-09-17 14:58:07 +10:00
parent 11f8a07887
commit 8496309ad7
3 changed files with 67 additions and 4 deletions

View File

@ -4,3 +4,4 @@ from django.apps import AppConfig
class BYOStorageConfig(AppConfig):
name = 'byostorage'
verbose_name = 'Bring your own storage'
default_auto_field = 'django.db.models.AutoField'

View File

@ -5,11 +5,17 @@ BASE_DIR = Path(__file__).resolve().parent.parent
MEDIA_ROOT = "media"
DEBUG = True
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'byostorage'
'byostorage',
'example'
]
SECRET_KEY = 'shh!'
DATABASES = {

View File

@ -1,9 +1,15 @@
from django.conf import settings
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
import json
import logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
STORAGE_CLASSES = getattr(settings, 'STORAGE_CLASSES', [])
STORAGE_CLASSES.extend([
@ -11,7 +17,7 @@ STORAGE_CLASSES.extend([
])
try:
import storages
import storages.backends
STORAGE_CLASSES.append('storages.backends.s3boto3.S3Boto3Storage')
except ImportError:
pass
@ -24,6 +30,15 @@ def validate_json(value):
except json.JSONDecodeError as e:
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):
""" A user defined storage
"""
@ -76,3 +91,44 @@ class UserStorage(models.Model):
def __str__(self):
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)