Browse Source

Base upload functionality.

master
Erik Stein 9 years ago
parent
commit
0e763fe190
  1. 7
      assetkit/files/storage.py
  2. 2
      example_site/main/medialibrary/admin.py
  3. 19
      example_site/main/medialibrary/fields.py
  4. 15
      example_site/main/medialibrary/migrations/0001_initial.py
  5. 20
      example_site/main/medialibrary/migrations/0002_mediaasset_simple_file.py
  6. 21
      example_site/main/medialibrary/migrations/0003_auto_20160425_0811.py
  7. 8
      example_site/main/medialibrary/models.py
  8. 11
      example_site/main/medialibrary/utils.py

7
assetkit/files/storage.py

@ -32,7 +32,7 @@ ORIGINAL_FILE_PREFIX = 'original'
CACHED_VARIANT_PREFIX = 'cache' CACHED_VARIANT_PREFIX = 'cache'
MANUAL_VARIANT_PREFIX = 'manual' MANUAL_VARIANT_PREFIX = 'manual'
PROTECTED_MEDIA_ROOT = os.path.join(os.path.dirname(settings.MEDIA_ROOT, 'protected')) PROTECTED_MEDIA_ROOT = os.path.join(os.path.dirname(settings.MEDIA_ROOT), 'protected')
PROTECTED_MEDIA_URL = '/protected/' PROTECTED_MEDIA_URL = '/protected/'
@ -50,9 +50,6 @@ class ProtectedMediaAssetStorage(FileSystemStorage):
Standard media assets filesystem storage Standard media assets filesystem storage
""" """
ORIGINAL_FILE_PREFIX = ORIGINAL_FILE_PREFIX
FILENAME_MAX_LENGTH = FILENAME_MAX_LENGTH
def __init__(self, location=None, base_url=None, **kwargs): def __init__(self, location=None, base_url=None, **kwargs):
if location is None: if location is None:
location = getattr(settings, 'PROTECTED_MEDIA_ROOT', PROTECTED_MEDIA_ROOT) location = getattr(settings, 'PROTECTED_MEDIA_ROOT', PROTECTED_MEDIA_ROOT)
@ -71,7 +68,7 @@ class ProtectedMediaAssetStorage(FileSystemStorage):
""" """
`name` must already contain the whole asset filesystem path. `name` must already contain the whole asset filesystem path.
""" """
return safe_join(self.location, self.ORIGINAL_FILE_PREFIX, name) return safe_join(self.location, name)
def size(self, name): def size(self, name):
return os.path.getsize(self.path(name)) return os.path.getsize(self.path(name))

2
example_site/main/medialibrary/admin.py

@ -11,7 +11,7 @@ from .models import MediaAsset
@admin.register(MediaAsset) @admin.register(MediaAsset)
class MediaAssetAdmin(admin.ModelAdmin): class MediaAssetAdmin(admin.ModelAdmin):
list_display = ['name', 'get_original_path'] list_display = ['name', 'get_original_path', 'original_file_name']
def get_original_path(self, obj): def get_original_path(self, obj):
return obj.original_file.name return obj.original_file.name

19
example_site/main/medialibrary/fields.py

@ -6,9 +6,8 @@ from django import forms
from django.contrib.admin.widgets import AdminFileWidget from django.contrib.admin.widgets import AdminFileWidget
from django.db import models from django.db import models
from django.db.models.fields.files import FileDescriptor from django.db.models.fields.files import FileDescriptor
from django.utils.functional import curry
from assetkit.files.storage import ProtectedMediaAssetStorage from assetkit.files.storage import ProtectedMediaAssetStorage, FILENAME_MAX_LENGTH, ORIGINAL_FILE_PREFIX
from .utils import get_upload_path from .utils import get_upload_path
@ -73,20 +72,14 @@ class MediaAssetField(models.FileField):
description_class = MediaAssetFileDescriptor description_class = MediaAssetFileDescriptor
def __init__(self, verbose_name=None, name=None, upload_to='', storage=None, *args, **kwargs): def __init__(self, verbose_name=None, name=None, upload_to='', storage=None, *args, **kwargs):
storage = kwargs.get('storage', MEDIA_ASSET_STORAGE) kwargs['storage'] = kwargs.get('storage', MEDIA_ASSET_STORAGE)
kwargs['storage'] = storage kwargs['upload_to'] = kwargs.get('upload_to', DEFAULT_UPLOAD_TO)
upload_func = kwargs.get('upload_to', DEFAULT_UPLOAD_TO)
if callable(upload_func):
kwargs['upload_to'] = curry(upload_func, storage=storage)
else:
kwargs['upload_to'] = upload_func
# Field max length is the length of the file name plus the # Field max length is the length of the file name plus the
# string ORIGINAL_FILE_PREFIX, two slashes and the uuid. The filename # string ORIGINAL_FILE_PREFIX, two slashes and the uuid. The filename
# is shortened in the get_upload_path function. # is shortened in the get_upload_path function.
field_max_length = storage.FILENAME_MAX_LENGTH + 2 \ field_max_length = FILENAME_MAX_LENGTH + 2 \
+ len(storage.ORIGINAL_FILE_PREFIX) \ + len(ORIGINAL_FILE_PREFIX) \
+ 32 # uuid_hex + 32 # uuid_hex
kwargs['max_length'] = kwargs.get('max_length', field_max_length) kwargs['max_length'] = kwargs.get('max_length', field_max_length)
@ -96,7 +89,7 @@ class MediaAssetField(models.FileField):
defaults = { defaults = {
# 'form_class': MediaAssetFormField, # 'form_class': MediaAssetFormField,
'widget': MediaAssetFileWidget, 'widget': MediaAssetFileWidget,
'max_length': self.storage.FILENAME_MAX_LENGTH, 'max_length': FILENAME_MAX_LENGTH,
} }
kwargs.update(defaults) # Force our values kwargs.update(defaults) # Force our values
return super(MediaAssetField, self).formfield(**kwargs) return super(MediaAssetField, self).formfield(**kwargs)

15
example_site/main/medialibrary/migrations/0001_initial.py

@ -1,10 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2016-03-24 12:34 # Generated by Django 1.9.4 on 2016-06-11 06:25
from __future__ import unicode_literals from __future__ import unicode_literals
import assetkit.files.storage
from django.db import migrations, models from django.db import migrations, models
import main.medialibrary.models import main.medialibrary.fields
import main.storages import main.medialibrary.utils
class Migration(migrations.Migration): class Migration(migrations.Migration):
@ -20,8 +21,12 @@ class Migration(migrations.Migration):
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('uuid_hex', models.CharField(editable=False, max_length=32)), ('uuid_hex', models.CharField(editable=False, max_length=32)),
('original_file', models.FileField(storage=main.storages.ProtectedMediaAssetStorage(), upload_to=main.medialibrary.fields.get_upload_path)), ('name', models.CharField(max_length=500, verbose_name='name')),
('name', models.CharField(max_length=50, verbose_name='name')), ('original_file', main.medialibrary.fields.MediaAssetField(max_length=297, storage=assetkit.files.storage.ProtectedMediaAssetStorage(), upload_to=main.medialibrary.utils.get_upload_path, verbose_name='original file')),
('original_file_name', models.CharField(editable=False, max_length=1000, verbose_name='original file name')),
], ],
options={
'abstract': False,
},
), ),
] ]

20
example_site/main/medialibrary/migrations/0002_mediaasset_simple_file.py

@ -1,20 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2016-04-24 10:33
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('medialibrary', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='mediaasset',
name='simple_file',
field=models.FileField(blank=True, null=True, upload_to=b''),
),
]

21
example_site/main/medialibrary/migrations/0003_auto_20160425_0811.py

@ -1,21 +0,0 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2016-04-25 08:11
from __future__ import unicode_literals
from django.db import migrations
import main.medialibrary.fields
class Migration(migrations.Migration):
dependencies = [
('medialibrary', '0002_mediaasset_simple_file'),
]
operations = [
migrations.AlterField(
model_name='mediaasset',
name='original_file',
field=main.medialibrary.fields.MediaAssetField(upload_to=b'', verbose_name='original file'),
),
]

8
example_site/main/medialibrary/models.py

@ -5,17 +5,17 @@ from django.db import models
from django.utils.encoding import python_2_unicode_compatible from django.utils.encoding import python_2_unicode_compatible
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from ..medialibrary.fields import MediaAssetField, MEDIA_ASSET_STORAGE from ..medialibrary.fields import MediaAssetField
from .utils import UUIDMixin from .utils import UUIDMixin
@python_2_unicode_compatible @python_2_unicode_compatible
class MediaAsset(UUIDMixin, models.Model): class MediaAsset(UUIDMixin, models.Model):
name = models.CharField(_('name'), max_length=50) name = models.CharField(_('name'), max_length=500)
# TODO Add slug = SlugField # TODO Add slug = SlugField
storage = MEDIA_ASSET_STORAGE original_file = MediaAssetField(_("original file"))
original_file = MediaAssetField(_("original file"), storage=MEDIA_ASSET_STORAGE) original_file_name = models.CharField(_('original file name'), max_length=1000, editable=False)
# TODO Add thumbnail = Thumbnail # TODO Add thumbnail = Thumbnail
# TODO Add preview = ImageSpec # TODO Add preview = ImageSpec

11
example_site/main/medialibrary/utils.py

@ -9,6 +9,8 @@ from django.db import models
# TODO Use improved slugify # TODO Use improved slugify
from django.utils.text import slugify from django.utils.text import slugify
from assetkit.files.storage import FILENAME_MAX_LENGTH, ORIGINAL_FILE_PREFIX
class UUIDMixin(models.Model): class UUIDMixin(models.Model):
uuid_hex = models.CharField(max_length=32, null=False, editable=False) uuid_hex = models.CharField(max_length=32, null=False, editable=False)
@ -23,7 +25,7 @@ class UUIDMixin(models.Model):
return str(uuid.UUID(self.uuid_hex)) return str(uuid.UUID(self.uuid_hex))
def get_upload_path(instance, filename, storage): def get_upload_path(instance, filename):
""" """
Returns /<uuid_hex>/original/<slugified name>.<extension> Returns /<uuid_hex>/original/<slugified name>.<extension>
where where
@ -32,12 +34,13 @@ def get_upload_path(instance, filename, storage):
- extension is preserved from original filename - extension is preserved from original filename
""" """
name, ext = os.path.splitext(filename) name, ext = os.path.splitext(filename)
name = slugify(name) instance.original_file_name = filename
name = name[:(storage.FILENAME_MAX_LENGTH - len(ext))] name = slugify(instance.name or name)
name = name[:(FILENAME_MAX_LENGTH - len(ext))]
filename = "%s%s" % (name, ext) filename = "%s%s" % (name, ext)
return os.path.join( return os.path.join(
instance.get_uuid(), instance.get_uuid(),
instance.storage.ORIGINAL_FILE_PREFIX, ORIGINAL_FILE_PREFIX,
filename filename
) )

Loading…
Cancel
Save