genavatars.py 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from django.core.management.base import BaseCommand, CommandError
  2. from django.conf import settings
  3. from path import path
  4. try:
  5. from PIL import Image
  6. has_pil = True
  7. except ImportError:
  8. has_pil = False
  9. from misago.users.models import User
  10. class Command(BaseCommand):
  11. help = 'Regenerates avatar images for new dimensions'
  12. def handle(self, *args, **options):
  13. if not has_pil:
  14. raise CommandError('genavatars requires Python Imaging Library to be installed in order to run')
  15. self.scale_user_avatars()
  16. self.scale_gallery_avatars()
  17. self.stdout.write('\n\nAvatar images have been regenerated.\n')
  18. def scale_image(self, image_src, image_dir=None):
  19. avatar = Image.open(image_src).convert("RGBA")
  20. image_name = path.basename(path(image_src))
  21. if not image_dir:
  22. image_dir = path.dirname(path(image_src)) + '/%s_'
  23. for size in settings.AVATAR_SIZES[1:]:
  24. avatar.thumbnail((size, size), Image.ANTIALIAS)
  25. avatar.save(image_dir % size + image_name)
  26. def scale_user_avatars(self):
  27. for user in User.objects.filter(avatar_type='upload').iterator():
  28. for image in path(settings.MEDIA_ROOT).joinpath('avatars').files('*_%s' % user.avatar_image):
  29. if not image.isdir():
  30. image.remove()
  31. self.scale_image(settings.MEDIA_ROOT + 'avatars/' + user.avatar_image)
  32. def scale_gallery_avatars(self):
  33. try:
  34. thumb_dir = path(settings.STATICFILES_DIRS[0]).joinpath('avatars').joinpath('_thumbs')
  35. items = [thumb_dir]
  36. for item in thumb_dir.walk():
  37. items.append(item)
  38. for item in reversed(items):
  39. if item.isdir():
  40. item.rmdir()
  41. else:
  42. item.remove()
  43. except Exception:
  44. pass
  45. avatars_dir = path(settings.STATICFILES_DIRS[0]).joinpath('avatars')
  46. avatars_len = len(avatars_dir)
  47. avatars_list = []
  48. for directory in avatars_dir.dirs():
  49. avatars_list += directory.files('*.gif')
  50. avatars_list += directory.files('*.jpg')
  51. avatars_list += directory.files('*.jpeg')
  52. avatars_list += directory.files('*.png')
  53. thumb_dir = path(settings.STATICFILES_DIRS[0]).joinpath('avatars').joinpath('_thumbs')
  54. thumb_dir.mkdir(777)
  55. for size in settings.AVATAR_SIZES[1:]:
  56. thumb_dir.joinpath(str(size)).mkdir(777)
  57. for directory in avatars_dir.dirs():
  58. dirname = path(directory[avatars_len:]).basename()
  59. if dirname != '_thumbs':
  60. for size in settings.AVATAR_SIZES[1:]:
  61. thumb_dir.joinpath(str(size)).joinpath(dirname).mkdir(777)
  62. for avatar in avatars_list:
  63. self.scale_image(avatar,
  64. thumb_dir + '/%s' + avatar.dirname()[avatars_len:] + '/')