avatarserver.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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 misago.users.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, hash, user_id, size):
  17. size = clean_size(size)
  18. if int(user_id) > 0:
  19. avatar_dir = store.get_avatars_dir_path(user_id)
  20. avatar_file = get_user_avatar_file(user_id, 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, user_id, token, suffix):
  31. fallback_avatar = get_blank_avatar_file(min(settings.MISAGO_AVATARS_SIZES))
  32. User = get_user_model()
  33. if user_id > 0:
  34. try:
  35. user = User.objects.get(id=user_id)
  36. if token == store.get_avatar_hash(user, suffix):
  37. avatar_file = get_user_avatar_file(user.pk, suffix)
  38. else:
  39. avatar_file = fallback_avatar
  40. except User.DoesNotExist:
  41. avatar_file = fallback_avatar
  42. else:
  43. avatar_file = fallback_avatar
  44. if avatar_file == fallback_avatar:
  45. avatar_dir = store.get_avatars_dir_path()
  46. else:
  47. avatar_dir = store.get_avatars_dir_path(user_id)
  48. avatar_path = os.path.join(avatar_dir, avatar_file)
  49. return make_file_response(avatar_path, 'image/png')
  50. def clean_size(size):
  51. size = int(size)
  52. if size not in settings.MISAGO_AVATARS_SIZES:
  53. found_size = max(settings.MISAGO_AVATARS_SIZES)
  54. for valid_size in sorted(settings.MISAGO_AVATARS_SIZES, reverse=True):
  55. if valid_size > size:
  56. found_size = valid_size
  57. return found_size
  58. return size
  59. def get_user_avatar_file(user_id, size):
  60. return '%s_%s.png' % (user_id, size)
  61. def get_blank_avatar_file(size):
  62. return '%s.png' % size