# extra py - The Custom FileFiled
from django.db.models import FileField
from django.forms import forms
class CustomCheckFileField(FileField):
def __init__(self, custom_check=None, error_message=None, **kwargs):
self.error_message=error_message
if callable(custom_check):
self.custom_check = custom_check
super(CustomCheckFileField, self).__init__(**kwargs)
def clean(self, *args, **kwargs):
data = super(CustomCheckFileField, self).clean(*args, **kwargs)
file = data.file
#args[1] is the model instance
if not self.custom_check(args[1], self.generate_filename(args[1], file.name)):
raise forms.ValidationError(self.error_message)
return data
def custom_check(self, filename):
return True
#custom FileSystemStorage which return same name for existing file (also deletes existing files on save
#some_other.py
from django.core.files.storage import FileSystemStorage
class OverwriteStorage(FileSystemStorage):
def _save(self, name, content):
if self.exists(name):
self.delete(name)
return super(OverwriteStorage, self)._save(name, content)
def get_available_name(self, name):
return name
#usage
#models.py
def _custom_media_file_unique(instance, filename):
existing = CustomMedia.objects.filter(file=filename)
if existing and existing.count() > 1:
return False
else:
if existing:
return existing[0].id == instance.id
return True
class CustomMedia(models.Model):
file = CustomCheckFileField(upload_to=_get_media_upload_to, custom_check=_custom_media_file_unique,error_message="File Already Exists",storage=OverwriteStorage())
Comments