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'
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))

2
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

19
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)

15
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,
},
),
]

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.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

11
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 /<uuid_hex>/original/<slugified name>.<extension>
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
)

Loading…
Cancel
Save