avatarserver.py 2.4 KB

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