12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- from django.core.management.base import BaseCommand, CommandError
- from django.conf import settings
- from path import path
- try:
- from PIL import Image
- has_pil = True
- except ImportError:
- has_pil = False
- from misago.models import User
- from misago.utils.avatars import resizeimage
- class Command(BaseCommand):
- help = 'Regenerates avatar images for new dimensions'
- def handle(self, *args, **options):
- if not has_pil:
- raise CommandError('genavatars requires Python Imaging Library to be installed in order to run')
- self.scale_user_avatars()
- self.scale_gallery_avatars()
- self.stdout.write('\n\nAvatar images have been regenerated.\n')
- def scale_image(self, image_src, image_dir=None):
- image_name = path.basename(path(image_src))
- if not image_dir:
- image_dir = path.dirname(path(image_src)) + '/%s_'
- for size in settings.AVATAR_SIZES[1:]:
- resizeimage(image_src, size, image_dir % size + image_name)
- def scale_user_avatars(self):
- for user in User.objects.filter(avatar_type='upload').iterator():
- for image in path(settings.MEDIA_ROOT).joinpath('avatars').files('*_%s' % user.avatar_image):
- if not image.isdir():
- image.remove()
- self.scale_image(settings.MEDIA_ROOT + 'avatars/' + user.avatar_image)
- def scale_gallery_avatars(self):
- try:
- thumb_dir = path(settings.STATICFILES_DIRS[0]).joinpath('avatars').joinpath('_thumbs')
- items = [thumb_dir]
- for item in thumb_dir.walk():
- items.append(item)
- for item in reversed(items):
- if item.isdir():
- item.rmdir()
- else:
- item.remove()
- except Exception:
- pass
- avatars_dir = path(settings.STATICFILES_DIRS[0]).joinpath('avatars')
- avatars_len = len(avatars_dir)
- avatars_list = []
- for directory in avatars_dir.dirs():
- avatars_list += directory.files('*.gif')
- avatars_list += directory.files('*.jpg')
- avatars_list += directory.files('*.jpeg')
- avatars_list += directory.files('*.png')
- thumb_dir = path(settings.STATICFILES_DIRS[0]).joinpath('avatars').joinpath('_thumbs')
- thumb_dir.mkdir(777)
- for size in settings.AVATAR_SIZES[1:]:
- thumb_dir.joinpath(str(size)).mkdir(777)
- for directory in avatars_dir.dirs():
- dirname = path(directory[avatars_len:]).basename()
- if dirname != '_thumbs':
- for size in settings.AVATAR_SIZES[1:]:
- thumb_dir.joinpath(str(size)).joinpath(dirname).mkdir(777)
- for avatar in avatars_list:
- self.scale_image(avatar,
- thumb_dir + '/%s' + avatar.dirname()[avatars_len:] + '/')
|