diff --git a/MANIFEST.in b/MANIFEST.in index 6d415ed..57d2bd3 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -4,4 +4,5 @@ include CONTRIBUTORS.txt include avatar/media/avatar/img/default.jpg recursive-include docs * recursive-include avatar/templates *.html *.txt -recursive-include avatar/locale/*/LC_MESSAGES *.mo *.po \ No newline at end of file +recursive-include avatar/locale/*/LC_MESSAGES *.mo *.po +recursive-include avatar/testdata * diff --git a/avatar/models.py b/avatar/models.py index 8e73094..35fc201 100644 --- a/avatar/models.py +++ b/avatar/models.py @@ -31,7 +31,7 @@ from avatar.settings import (AVATAR_STORAGE_DIR, AVATAR_RESIZE_METHOD, AVATAR_MAX_AVATARS_PER_USER, AVATAR_THUMB_FORMAT, AVATAR_HASH_USERDIRNAMES, AVATAR_HASH_FILENAMES, AVATAR_THUMB_QUALITY, AUTO_GENERATE_AVATAR_SIZES, - AVATAR_STORAGE) + AVATAR_STORAGE, AVATAR_CLEANUP_DELETED) avatar_storage = get_storage_class(AVATAR_STORAGE)() @@ -64,6 +64,7 @@ def avatar_file_path(instance=None, filename=None, size=None, ext=None): tmppath.append(os.path.basename(filename)) return os.path.join(*tmppath) + def find_extension(format): format = format.lower() @@ -72,11 +73,14 @@ def find_extension(format): return format + class Avatar(models.Model): user = models.ForeignKey(User) primary = models.BooleanField(default=False) avatar = models.ImageField(max_length=1024, - upload_to=avatar_file_path, storage=avatar_storage, blank=True) + upload_to=avatar_file_path, + storage=avatar_storage, + blank=True) date_uploaded = models.DateTimeField(default=now) def __unicode__(self): @@ -147,5 +151,15 @@ def create_default_thumbnails(sender, instance, created=False, **kwargs): instance.create_thumbnail(size) +def remove_avatar_images(instance=None, **kwargs): + for size in AUTO_GENERATE_AVATAR_SIZES: + if instance.thumbnail_exists(size): + instance.avatar.storage.delete(instance.avatar_name(size)) + instance.avatar.storage.delete(instance.avatar.name) + + signals.post_save.connect(create_default_thumbnails, sender=Avatar) signals.post_delete.connect(invalidate_avatar_cache, sender=Avatar) + +if AVATAR_CLEANUP_DELETED: + signals.post_delete.connect(remove_avatar_images, sender=Avatar) diff --git a/avatar/settings.py b/avatar/settings.py index 642e78a..264ff98 100644 --- a/avatar/settings.py +++ b/avatar/settings.py @@ -10,6 +10,7 @@ AVATAR_DEFAULT_SIZE = getattr(settings, 'AVATAR_DEFAULT_SIZE', 80) AUTO_GENERATE_AVATAR_SIZES = getattr(settings, 'AUTO_GENERATE_AVATAR_SIZES', (AVATAR_DEFAULT_SIZE,)) AVATAR_RESIZE_METHOD = getattr(settings, 'AVATAR_RESIZE_METHOD', Image.ANTIALIAS) AVATAR_STORAGE_DIR = getattr(settings, 'AVATAR_STORAGE_DIR', 'avatars') +AVATAR_GRAVATAR_SSL = getattr(settings, 'AVATAR_GRAVATAR_SSL', False) AVATAR_GRAVATAR_BACKUP = getattr(settings, 'AVATAR_GRAVATAR_BACKUP', True) AVATAR_GRAVATAR_DEFAULT = getattr(settings, 'AVATAR_GRAVATAR_DEFAULT', None) AVATAR_DEFAULT_URL = getattr(settings, 'AVATAR_DEFAULT_URL', 'avatar/img/default.jpg') @@ -23,3 +24,4 @@ AVATAR_HASH_USERDIRNAMES = getattr(settings, 'AVATAR_HASH_USERDIRNAMES', False) AVATAR_ALLOWED_FILE_EXTS = getattr(settings, 'AVATAR_ALLOWED_FILE_EXTS', None) AVATAR_CACHE_TIMEOUT = getattr(settings, 'AVATAR_CACHE_TIMEOUT', 60 * 60) AVATAR_STORAGE = getattr(settings, 'AVATAR_STORAGE', settings.DEFAULT_FILE_STORAGE) +AVATAR_CLEAN_REMOVED = getattr(settings, 'AVATAR_CLEAN_REMOVED', False) diff --git a/avatar/views.py b/avatar/views.py index 1b066be..15f4570 100644 --- a/avatar/views.py +++ b/avatar/views.py @@ -5,6 +5,7 @@ from django.template import RequestContext from django.utils.translation import ugettext as _ from django.views.decorators.csrf import csrf_exempt +from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.contrib import messages diff --git a/setup.py b/setup.py index 55e63a0..ed4b1ba 100644 --- a/setup.py +++ b/setup.py @@ -168,7 +168,8 @@ setup( 'templates/notification/*/*.*', 'templates/avatar/*.html', 'locale/*/LC_MESSAGES/*', - 'media/avatar/img/default.jpg' + 'media/avatar/img/default.jpg', + 'testdata/*', ], }, include_package_data=True,