store.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import os
  2. from hashlib import md5
  3. from io import BytesIO
  4. from PIL import Image
  5. from django.core.files.base import ContentFile
  6. from django.utils.crypto import get_random_string
  7. from misago.conf import settings
  8. def normalize_image(image):
  9. """strip image of animation, convert to RGBA"""
  10. image.seek(0)
  11. return image.copy().convert('RGBA')
  12. def delete_avatar(user):
  13. if user.avatar_tmp:
  14. user.avatar_tmp.delete(False)
  15. if user.avatar_src:
  16. user.avatar_src.delete(False)
  17. for avatar in user.avatar_set.all():
  18. avatar.image.delete(False)
  19. user.avatar_set.all().delete()
  20. def store_avatar(user, image):
  21. from misago.users.models import Avatar
  22. image = normalize_image(image)
  23. avatars = []
  24. for size in sorted(settings.MISAGO_AVATARS_SIZES, reverse=True):
  25. image_stream = BytesIO()
  26. image = image.resize((size, size), Image.ANTIALIAS)
  27. image.save(image_stream, "PNG")
  28. avatars.append(
  29. Avatar.objects.
  30. create(user=user, size=size, image=ContentFile(image_stream.getvalue(), 'avatar'))
  31. )
  32. user.avatars = [{'size': a.size, 'url': a.url} for a in avatars]
  33. user.save(update_fields=['avatars'])
  34. def store_new_avatar(user, image):
  35. delete_avatar(user)
  36. store_avatar(user, image)
  37. def store_temporary_avatar(user, image):
  38. image_stream = BytesIO()
  39. normalize_image(image)
  40. image.save(image_stream, "PNG")
  41. if user.avatar_tmp:
  42. user.avatar_tmp.delete(False)
  43. user.avatar_tmp = ContentFile(image_stream.getvalue(), 'avatar')
  44. user.save(update_fields=['avatar_tmp'])
  45. def store_original_avatar(user):
  46. if user.avatar_src:
  47. user.avatar_src.delete(False)
  48. user.avatar_src = user.avatar_tmp
  49. user.avatar_tmp = None
  50. user.save(update_fields=['avatar_tmp', 'avatar_src'])
  51. def upload_to(instance, filename):
  52. spread_path = md5(get_random_string(64).encode()).hexdigest()
  53. secret = get_random_string(32)
  54. filename_clean = '%s.png' % get_random_string(32)
  55. return os.path.join('avatars', spread_path[:2], spread_path[2:4], secret, filename_clean)