store.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 store_avatar(user, image):
  12. avatars_dir = get_existing_avatars_dir(user)
  13. normalize_image(image)
  14. for size in sorted(settings.MISAGO_AVATARS_SIZES, reverse=True):
  15. avatar_file = '%s_%s.png' % (user.pk, size)
  16. avatar_file = path(os.path.join(avatars_dir, avatar_file))
  17. image = image.resize((size, size), Image.ANTIALIAS)
  18. image.save(avatar_file, "PNG")
  19. def delete_avatar(user):
  20. avatars_dir = get_existing_avatars_dir(user)
  21. suffixes_to_delete = settings.MISAGO_AVATARS_SIZES + ('org', 'tmp')
  22. for size in suffixes_to_delete:
  23. avatar_file = '%s_%s.png' % (user.pk, size)
  24. avatar_file = path(os.path.join(avatars_dir, avatar_file))
  25. if avatar_file.exists():
  26. avatar_file.remove()
  27. def store_temporary_avatar(user, image):
  28. avatars_dir = get_existing_avatars_dir(user)
  29. avatar_file = '%s_tmp.png' % user.pk
  30. normalize_image(image)
  31. image.save(os.path.join(avatars_dir, avatar_file), "PNG")
  32. def store_original_avatar(user):
  33. org_path = avatar_file_path(user, 'org')
  34. if org_path.exists():
  35. org_path.remove()
  36. avatar_file_path(user, 'tmp').rename(org_path)
  37. def avatar_file_path(user, size):
  38. avatars_dir = get_existing_avatars_dir(user)
  39. avatar_file = '%s_%s.png' % (user.pk, size)
  40. return path(os.path.join(avatars_dir, avatar_file))
  41. def avatar_file_exists(user, size):
  42. return avatar_file_path(user, size).exists()
  43. def store_new_avatar(user, image):
  44. """
  45. Deletes old image before storing new one
  46. """
  47. delete_avatar(user)
  48. store_avatar(user, image)
  49. def get_avatars_dir_path(user=None):
  50. if user:
  51. try:
  52. user_id = user.pk
  53. except AttributeError:
  54. user_id = user
  55. dir_hash = md5(str(user_id)).hexdigest()
  56. hash_path = [dir_hash[0], dir_hash[1], dir_hash[2:10]]
  57. return path(os.path.join(AVATARS_STORE, *hash_path))
  58. else:
  59. return path(os.path.join(AVATARS_STORE, 'blank'))
  60. def get_existing_avatars_dir(user=None):
  61. avatars_dir = get_avatars_dir_path(user)
  62. if not avatars_dir.exists():
  63. avatars_dir.makedirs()
  64. return avatars_dir