avatarserver.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import os
  2. from path import Path
  3. from django.conf import settings
  4. from django.contrib.auth import get_user_model
  5. from django.views.decorators.cache import cache_control, never_cache
  6. from misago.core.fileserver import make_file_response
  7. from ..avatars import store
  8. @cache_control(private=True, must_revalidate=True, max_age=5 * 24 * 3600)
  9. def serve_blank_avatar(request, size):
  10. size = clean_size(size)
  11. avatar_dir = store.get_avatars_dir_path()
  12. avatar_file = get_blank_avatar_file(size)
  13. avatar_path = os.path.join(avatar_dir, avatar_file)
  14. return make_file_response(avatar_path, 'image/png')
  15. @cache_control(private=True, must_revalidate=False)
  16. def serve_user_avatar(request, pk, hash, size):
  17. size = clean_size(size)
  18. if int(pk) > 0:
  19. avatar_dir = store.get_avatars_dir_path(pk)
  20. avatar_file = get_user_avatar_file(pk, size)
  21. avatar_path = os.path.join(avatar_dir, avatar_file)
  22. if Path(avatar_path).exists():
  23. avatar_path = os.path.join(avatar_dir, avatar_file)
  24. return make_file_response(avatar_path, 'image/png')
  25. else:
  26. return serve_blank_avatar(request, size)
  27. else:
  28. return serve_blank_avatar(request, size)
  29. @never_cache
  30. def serve_user_avatar_source(request, pk, secret, hash):
  31. fallback_avatar = get_blank_avatar_file(min(settings.MISAGO_AVATARS_SIZES))
  32. User = get_user_model()
  33. if int(pk) > 0:
  34. try:
  35. user = User.objects.get(pk=pk)
  36. tokens = store.get_user_avatar_tokens(user)
  37. suffix = tokens.get(secret)
  38. if suffix:
  39. avatar_file = get_user_avatar_file(user.pk, suffix)
  40. else:
  41. avatar_file = fallback_avatar
  42. except User.DoesNotExist:
  43. avatar_file = fallback_avatar
  44. else:
  45. avatar_file = fallback_avatar
  46. if avatar_file == fallback_avatar:
  47. avatar_dir = store.get_avatars_dir_path()
  48. else:
  49. avatar_dir = store.get_avatars_dir_path(pk)
  50. avatar_path = os.path.join(avatar_dir, avatar_file)
  51. return make_file_response(avatar_path, 'image/png')
  52. def clean_size(size):
  53. size = int(size)
  54. if size not in settings.MISAGO_AVATARS_SIZES:
  55. found_size = max(settings.MISAGO_AVATARS_SIZES)
  56. for valid_size in sorted(settings.MISAGO_AVATARS_SIZES, reverse=True):
  57. if valid_size > size:
  58. found_size = valid_size
  59. return found_size
  60. return size
  61. def get_user_avatar_file(pk, size):
  62. return '%s_%s.png' % (pk, size)
  63. def get_blank_avatar_file(size):
  64. return '%s.png' % size