genavatars.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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.models import User
  10. from misago.utils.avatars import resizeimage
  11. class Command(BaseCommand):
  12. help = 'Regenerates avatar images for new dimensions'
  13. def handle(self, *args, **options):
  14. if not has_pil:
  15. raise CommandError('genavatars requires Python Imaging Library to be installed in order to run')
  16. self.scale_user_avatars()
  17. self.scale_gallery_avatars()
  18. self.stdout.write('\n\nAvatar images have been regenerated.\n')
  19. def scale_image(self, image_src, image_dir=None):
  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. resizeimage(image_src, size, image_dir % size + image_name)
  25. def scale_user_avatars(self):
  26. for user in User.objects.filter(avatar_type='upload').iterator():
  27. for image in path(settings.MEDIA_ROOT).joinpath('avatars').files('*_%s' % user.avatar_image):
  28. if not image.isdir():
  29. image.remove()
  30. self.scale_image(settings.MEDIA_ROOT + 'avatars/' + user.avatar_image)
  31. def scale_gallery_avatars(self):
  32. try:
  33. thumb_dir = path(settings.STATICFILES_DIRS[0]).joinpath('avatars').joinpath('_thumbs')
  34. items = [thumb_dir]
  35. for item in thumb_dir.walk():
  36. items.append(item)
  37. for item in reversed(items):
  38. if item.isdir():
  39. item.rmdir()
  40. else:
  41. item.remove()
  42. except Exception:
  43. pass
  44. avatars_dir = path(settings.STATICFILES_DIRS[0]).joinpath('avatars')
  45. avatars_len = len(avatars_dir)
  46. avatars_list = []
  47. for directory in avatars_dir.dirs():
  48. avatars_list += directory.files('*.gif')
  49. avatars_list += directory.files('*.jpg')
  50. avatars_list += directory.files('*.jpeg')
  51. avatars_list += directory.files('*.png')
  52. thumb_dir = path(settings.STATICFILES_DIRS[0]).joinpath('avatars').joinpath('_thumbs')
  53. thumb_dir.mkdir(777)
  54. for size in settings.AVATAR_SIZES[1:]:
  55. thumb_dir.joinpath(str(size)).mkdir(777)
  56. for directory in avatars_dir.dirs():
  57. dirname = path(directory[avatars_len:]).basename()
  58. if dirname != '_thumbs':
  59. for size in settings.AVATAR_SIZES[1:]:
  60. thumb_dir.joinpath(str(size)).joinpath(dirname).mkdir(777)
  61. for avatar in avatars_list:
  62. self.scale_image(avatar,
  63. thumb_dir + '/%s' + avatar.dirname()[avatars_len:] + '/')