Source code for smart_media.modelfields

from django.core.files.utils import validate_file_name
from django.db import models

from .fields import SmartMediaField as SmartMediaFormField
from .utils.file import uploadto_unique
from .validators import SmartMediaFileExtensionValidator


[docs]class SmartMediaField(models.FileField): """ A model file field with every "smart" features. * Set the ``SmartMediaFileExtensionValidator`` validator; * Use the form field ``SmartMediaField`` to get the proper "smart" clearable file widget; * Generate filename as an unique UUID with ``uploadto_unique`` function; Example: Usage is identical to a ``models.FileField``: :: cover = SmartMediaField( "cover", max_length=255, null=True, blank=True, default=None, upload_to="sample/cover/%y/%m", ) .. Note:: If attribute ``upload_to`` value is a callable then the UUID filename behavior is disabled. .. Note:: Sadly this just won't work on its own in Django admin which makes some internal resolutions between model fields and widgets. So you will need to define a rule to get the right widget for this field, see ``smart_media.admin.SmartModelAdmin``. .. Warning:: Django won't be able to detect change on settings. So you will have to create a custom data migration on your own if you want to clean files with previously allowed extensions but removed from setting. """ default_validators = [ SmartMediaFileExtensionValidator(), ]
[docs] def generate_filename(self, instance, filename): """ Override ``FileField.generate_filename()`` to change original uploaded filename to an UUID. 'upload_to' date pattern is still properly formatted and the UUID behavior is ignored if 'upload_to' is a callable. """ if callable(self.upload_to): filename = self.upload_to(instance, filename) else: filename = uploadto_unique(str(self.upload_to), instance, filename) filename = validate_file_name(filename, allow_relative_path=True) return self.storage.generate_filename(filename)
[docs] def formfield(self, **kwargs): return super().formfield( **{ "form_class": SmartMediaFormField, **kwargs, } )