store.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from hashlib import md5
  2. import os
  3. from path import Path
  4. from PIL import Image
  5. from misago.conf import settings
  6. from misago.users.avatars.paths import AVATARS_STORE
  7. def normalize_image(image):
  8. """if image is gif, strip it of animation"""
  9. image.seek(0)
  10. return image.copy().convert('RGBA')
  11. def get_avatar_hash(user):
  12. avatars_dir = get_existing_avatars_dir(user)
  13. avatar_file = '%s_%s.png' % (user.pk, max(settings.MISAGO_AVATARS_SIZES))
  14. avatar_file = Path(os.path.join(avatars_dir, avatar_file))
  15. md5_hash = md5()
  16. with open(avatar_file, 'rb') as f:
  17. while True:
  18. data = f.read(128)
  19. if not data:
  20. break
  21. md5_hash.update(data)
  22. return md5_hash.hexdigest()[:8]
  23. def store_avatar(user, image):
  24. avatars_dir = get_existing_avatars_dir(user)
  25. normalize_image(image)
  26. for size in sorted(settings.MISAGO_AVATARS_SIZES, reverse=True):
  27. avatar_file = '%s_%s.png' % (user.pk, size)
  28. avatar_file = Path(os.path.join(avatars_dir, avatar_file))
  29. image = image.resize((size, size), Image.ANTIALIAS)
  30. image.save(avatar_file, "PNG")
  31. def delete_avatar(user):
  32. avatars_dir = get_existing_avatars_dir(user)
  33. suffixes_to_delete = settings.MISAGO_AVATARS_SIZES + ('org', 'tmp')
  34. for size in suffixes_to_delete:
  35. avatar_file = '%s_%s.png' % (user.pk, size)
  36. avatar_file = Path(os.path.join(avatars_dir, avatar_file))
  37. if avatar_file.exists():
  38. avatar_file.remove()
  39. def store_temporary_avatar(user, image):
  40. avatars_dir = get_existing_avatars_dir(user)
  41. avatar_file = '%s_tmp.png' % user.pk
  42. normalize_image(image)
  43. image.save(os.path.join(avatars_dir, avatar_file), "PNG")
  44. def store_original_avatar(user):
  45. org_path = avatar_file_path(user, 'org')
  46. if org_path.exists():
  47. org_path.remove()
  48. avatar_file_path(user, 'tmp').rename(org_path)
  49. def avatar_file_path(user, size):
  50. avatars_dir = get_existing_avatars_dir(user)
  51. avatar_file = '%s_%s.png' % (user.pk, size)
  52. return Path(os.path.join(avatars_dir, avatar_file))
  53. def avatar_file_exists(user, size):
  54. return avatar_file_path(user, size).exists()
  55. def store_new_avatar(user, image):
  56. """
  57. Deletes old image before storing new one
  58. """
  59. delete_avatar(user)
  60. store_avatar(user, image)
  61. def get_avatars_dir_path(user=None):
  62. if user:
  63. try:
  64. user_id = user.pk
  65. except AttributeError:
  66. user_id = user
  67. dir_hash = md5(str(user_id)).hexdigest()
  68. hash_path = [dir_hash[0:1], dir_hash[2:3]]
  69. return Path(os.path.join(AVATARS_STORE, *hash_path))
  70. else:
  71. return Path(os.path.join(AVATARS_STORE, 'blank'))
  72. def get_existing_avatars_dir(user=None):
  73. avatars_dir = get_avatars_dir_path(user)
  74. if not avatars_dir.exists():
  75. avatars_dir.makedirs()
  76. return avatars_dir