avatarserver.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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. from misago.users.avatars.uploaded import avatar_source_token
  9. @cache_control(private=True, must_revalidate=True, max_age=5 * 24 * 3600)
  10. def serve_blank_avatar(request, size):
  11. size = clean_size(size)
  12. avatar_dir = store.get_avatars_dir_path()
  13. avatar_file = get_blank_avatar_file(size)
  14. avatar_path = os.path.join(avatar_dir, avatar_file)
  15. return make_file_response(avatar_path, 'image/png')
  16. @cache_control(private=True, must_revalidate=False)
  17. def serve_user_avatar(request, hash, user_id, size):
  18. size = clean_size(size)
  19. if int(user_id) > 0:
  20. avatar_dir = store.get_avatars_dir_path(user_id)
  21. avatar_file = get_user_avatar_file(user_id, size)
  22. avatar_path = os.path.join(avatar_dir, avatar_file)
  23. if Path(avatar_path).exists():
  24. avatar_path = os.path.join(avatar_dir, avatar_file)
  25. return make_file_response(avatar_path, 'image/png')
  26. else:
  27. return serve_blank_avatar(request, size)
  28. else:
  29. return serve_blank_avatar(request, size)
  30. @never_cache
  31. def serve_user_avatar_source(request, user_id, token, type):
  32. fallback_avatar = get_blank_avatar_file(min(settings.MISAGO_AVATARS_SIZES))
  33. User = get_user_model()
  34. if user_id > 0:
  35. try:
  36. user = User.objects.get(id=user_id)
  37. if token == avatar_source_token(user, type):
  38. avatar_file = get_user_avatar_file(user.pk, type)
  39. else:
  40. avatar_file = fallback_avatar
  41. except User.DoesNotExist:
  42. avatar_file = fallback_avatar
  43. else:
  44. avatar_file = fallback_avatar
  45. if avatar_file == fallback_avatar:
  46. avatar_dir = store.get_avatars_dir_path()
  47. else:
  48. avatar_dir = store.get_avatars_dir_path(user_id)
  49. avatar_path = os.path.join(avatar_dir, avatar_file)
  50. return make_file_response(avatar_path, 'image/png')
  51. def clean_size(size):
  52. size = int(size)
  53. if size not in settings.MISAGO_AVATARS_SIZES:
  54. found_size = max(settings.MISAGO_AVATARS_SIZES)
  55. for valid_size in sorted(settings.MISAGO_AVATARS_SIZES, reverse=True):
  56. if valid_size > size:
  57. found_size = valid_size
  58. return found_size
  59. return size
  60. def get_user_avatar_file(user_id, size):
  61. return '%s_%s.png' % (user_id, size)
  62. def get_blank_avatar_file(size):
  63. return '%s.png' % size