store.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import os
  2. from hashlib import md5
  3. from path import Path
  4. from PIL import Image
  5. from django.utils.encoding import force_bytes
  6. from misago.conf import settings
  7. from .paths import AVATARS_STORE
  8. from .store_ import *
  9. def get_avatar_hash(user, suffix=None):
  10. avatars_dir = get_existing_avatars_dir(user)
  11. avatar_suffix = suffix or max(settings.MISAGO_AVATARS_SIZES)
  12. avatar_file = '%s_%s.png' % (user.pk, avatar_suffix)
  13. avatar_file = Path(os.path.join(avatars_dir, avatar_file))
  14. md5_hash = md5()
  15. with open(avatar_file, 'rb') as f:
  16. while True:
  17. data = f.read(128)
  18. if not data:
  19. break
  20. md5_hash.update(data)
  21. return md5_hash.hexdigest()[:8]
  22. def get_user_avatar_tokens(user):
  23. token_seeds = (user.email, user.avatar_hash, settings.SECRET_KEY)
  24. tokens = {
  25. 'org': md5(force_bytes('org:%s:%s:%s' % token_seeds)).hexdigest()[:8],
  26. 'tmp': md5(force_bytes('tmp:%s:%s:%s' % token_seeds)).hexdigest()[:8],
  27. }
  28. tokens.update({
  29. tokens['org']: 'org',
  30. tokens['tmp']: 'tmp',
  31. })
  32. return tokens
  33. def store_temporary_avatar(user, image):
  34. avatars_dir = get_existing_avatars_dir(user)
  35. avatar_file = '%s_tmp.png' % user.pk
  36. normalize_image(image)
  37. image.save(os.path.join(avatars_dir, avatar_file), "PNG")
  38. def store_original_avatar(user):
  39. org_path = avatar_file_path(user, 'org')
  40. if org_path.exists():
  41. org_path.remove()
  42. avatar_file_path(user, 'tmp').rename(org_path)
  43. def avatar_file_path(user, size):
  44. avatars_dir = get_existing_avatars_dir(user)
  45. avatar_file = '%s_%s.png' % (user.pk, size)
  46. return Path(os.path.join(avatars_dir, avatar_file))
  47. def avatar_file_exists(user, size):
  48. return avatar_file_path(user, size).exists()
  49. def store_new_avatar(user, image):
  50. """
  51. Deletes old image before storing new one
  52. """
  53. delete_avatar(user)
  54. store_avatar(user, image)
  55. def get_avatars_dir_path(user=None):
  56. if user:
  57. try:
  58. user_pk = user.pk
  59. except AttributeError:
  60. user_pk = user
  61. dir_hash = md5(str(user_pk).encode()).hexdigest()
  62. hash_path = [dir_hash[0:1], dir_hash[2:3]]
  63. return Path(os.path.join(AVATARS_STORE, *hash_path))
  64. else:
  65. return Path(os.path.join(AVATARS_STORE, 'blank'))
  66. def get_existing_avatars_dir(user=None):
  67. avatars_dir = get_avatars_dir_path(user)
  68. if not avatars_dir.exists():
  69. avatars_dir.makedirs()
  70. return avatars_dir