From 0e763fe1904f5198fc654169bec2a72baa003641 Mon Sep 17 00:00:00 2001 From: Erik Stein Date: Sat, 11 Jun 2016 08:25:31 +0200 Subject: [PATCH] Base upload functionality. --- assetkit/files/storage.py | 7 ++----- example_site/main/medialibrary/admin.py | 2 +- example_site/main/medialibrary/fields.py | 19 ++++++----------- .../medialibrary/migrations/0001_initial.py | 15 ++++++++----- .../migrations/0002_mediaasset_simple_file.py | 20 ------------------ .../migrations/0003_auto_20160425_0811.py | 21 ------------------- example_site/main/medialibrary/models.py | 8 +++---- example_site/main/medialibrary/utils.py | 11 ++++++---- 8 files changed, 30 insertions(+), 73 deletions(-) delete mode 100644 example_site/main/medialibrary/migrations/0002_mediaasset_simple_file.py delete mode 100644 example_site/main/medialibrary/migrations/0003_auto_20160425_0811.py diff --git a/assetkit/files/storage.py b/assetkit/files/storage.py index 68589f3..4a60fb9 100644 --- a/assetkit/files/storage.py +++ b/assetkit/files/storage.py @@ -32,7 +32,7 @@ ORIGINAL_FILE_PREFIX = 'original' CACHED_VARIANT_PREFIX = 'cache' 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/' @@ -50,9 +50,6 @@ class ProtectedMediaAssetStorage(FileSystemStorage): 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): if location is None: 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. """ - return safe_join(self.location, self.ORIGINAL_FILE_PREFIX, name) + return safe_join(self.location, name) def size(self, name): return os.path.getsize(self.path(name)) diff --git a/example_site/main/medialibrary/admin.py b/example_site/main/medialibrary/admin.py index aa9a000..6983a08 100644 --- a/example_site/main/medialibrary/admin.py +++ b/example_site/main/medialibrary/admin.py @@ -11,7 +11,7 @@ from .models import MediaAsset @admin.register(MediaAsset) 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): return obj.original_file.name diff --git a/example_site/main/medialibrary/fields.py b/example_site/main/medialibrary/fields.py index 898079e..62ce642 100644 --- a/example_site/main/medialibrary/fields.py +++ b/example_site/main/medialibrary/fields.py @@ -6,9 +6,8 @@ from django import forms from django.contrib.admin.widgets import AdminFileWidget from django.db import models 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 @@ -73,20 +72,14 @@ class MediaAssetField(models.FileField): description_class = MediaAssetFileDescriptor def __init__(self, verbose_name=None, name=None, upload_to='', storage=None, *args, **kwargs): - storage = kwargs.get('storage', MEDIA_ASSET_STORAGE) - kwargs['storage'] = storage - - 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 + kwargs['storage'] = kwargs.get('storage', MEDIA_ASSET_STORAGE) + kwargs['upload_to'] = kwargs.get('upload_to', DEFAULT_UPLOAD_TO) # Field max length is the length of the file name plus the # string ORIGINAL_FILE_PREFIX, two slashes and the uuid. The filename # is shortened in the get_upload_path function. - field_max_length = storage.FILENAME_MAX_LENGTH + 2 \ - + len(storage.ORIGINAL_FILE_PREFIX) \ + field_max_length = FILENAME_MAX_LENGTH + 2 \ + + len(ORIGINAL_FILE_PREFIX) \ + 32 # uuid_hex kwargs['max_length'] = kwargs.get('max_length', field_max_length) @@ -96,7 +89,7 @@ class MediaAssetField(models.FileField): defaults = { # 'form_class': MediaAssetFormField, 'widget': MediaAssetFileWidget, - 'max_length': self.storage.FILENAME_MAX_LENGTH, + 'max_length': FILENAME_MAX_LENGTH, } kwargs.update(defaults) # Force our values return super(MediaAssetField, self).formfield(**kwargs) diff --git a/example_site/main/medialibrary/migrations/0001_initial.py b/example_site/main/medialibrary/migrations/0001_initial.py index 365eaf2..d406779 100644 --- a/example_site/main/medialibrary/migrations/0001_initial.py +++ b/example_site/main/medialibrary/migrations/0001_initial.py @@ -1,10 +1,11 @@ # -*- 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 +import assetkit.files.storage from django.db import migrations, models -import main.medialibrary.models -import main.storages +import main.medialibrary.fields +import main.medialibrary.utils class Migration(migrations.Migration): @@ -20,8 +21,12 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('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=50, verbose_name='name')), + ('name', models.CharField(max_length=500, 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, + }, ), ] diff --git a/example_site/main/medialibrary/migrations/0002_mediaasset_simple_file.py b/example_site/main/medialibrary/migrations/0002_mediaasset_simple_file.py deleted file mode 100644 index 33c2210..0000000 --- a/example_site/main/medialibrary/migrations/0002_mediaasset_simple_file.py +++ /dev/null @@ -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''), - ), - ] diff --git a/example_site/main/medialibrary/migrations/0003_auto_20160425_0811.py b/example_site/main/medialibrary/migrations/0003_auto_20160425_0811.py deleted file mode 100644 index 9c49112..0000000 --- a/example_site/main/medialibrary/migrations/0003_auto_20160425_0811.py +++ /dev/null @@ -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'), - ), - ] diff --git a/example_site/main/medialibrary/models.py b/example_site/main/medialibrary/models.py index 2802ce9..5caaab5 100644 --- a/example_site/main/medialibrary/models.py +++ b/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.translation import ugettext_lazy as _ -from ..medialibrary.fields import MediaAssetField, MEDIA_ASSET_STORAGE +from ..medialibrary.fields import MediaAssetField from .utils import UUIDMixin @python_2_unicode_compatible class MediaAsset(UUIDMixin, models.Model): - name = models.CharField(_('name'), max_length=50) + name = models.CharField(_('name'), max_length=500) # TODO Add slug = SlugField - storage = MEDIA_ASSET_STORAGE - original_file = MediaAssetField(_("original file"), storage=MEDIA_ASSET_STORAGE) + original_file = MediaAssetField(_("original file")) + original_file_name = models.CharField(_('original file name'), max_length=1000, editable=False) # TODO Add thumbnail = Thumbnail # TODO Add preview = ImageSpec diff --git a/example_site/main/medialibrary/utils.py b/example_site/main/medialibrary/utils.py index 0fbe2ce..956704f 100644 --- a/example_site/main/medialibrary/utils.py +++ b/example_site/main/medialibrary/utils.py @@ -9,6 +9,8 @@ from django.db import models # TODO Use improved slugify from django.utils.text import slugify +from assetkit.files.storage import FILENAME_MAX_LENGTH, ORIGINAL_FILE_PREFIX + class UUIDMixin(models.Model): 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)) -def get_upload_path(instance, filename, storage): +def get_upload_path(instance, filename): """ Returns //original/. where @@ -32,12 +34,13 @@ def get_upload_path(instance, filename, storage): - extension is preserved from original filename """ name, ext = os.path.splitext(filename) - name = slugify(name) - name = name[:(storage.FILENAME_MAX_LENGTH - len(ext))] + instance.original_file_name = filename + name = slugify(instance.name or name) + name = name[:(FILENAME_MAX_LENGTH - len(ext))] filename = "%s%s" % (name, ext) return os.path.join( instance.get_uuid(), - instance.storage.ORIGINAL_FILE_PREFIX, + ORIGINAL_FILE_PREFIX, filename )