1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import os
- from path import Path
- from django.conf import settings
- from django.contrib.auth import get_user_model
- from django.views.decorators.cache import cache_control, never_cache
- from misago.core.fileserver import make_file_response
- from ..avatars import store
- @cache_control(private=True, must_revalidate=True, max_age=5 * 24 * 3600)
- def serve_blank_avatar(request, size):
- size = clean_size(size)
- avatar_dir = store.get_avatars_dir_path()
- avatar_file = get_blank_avatar_file(size)
- avatar_path = os.path.join(avatar_dir, avatar_file)
- return make_file_response(avatar_path, 'image/png')
- @cache_control(private=True, must_revalidate=False)
- def serve_user_avatar(request, pk, hash, size):
- size = clean_size(size)
- if int(pk) > 0:
- avatar_dir = store.get_avatars_dir_path(pk)
- avatar_file = get_user_avatar_file(pk, size)
- avatar_path = os.path.join(avatar_dir, avatar_file)
- if Path(avatar_path).exists():
- avatar_path = os.path.join(avatar_dir, avatar_file)
- return make_file_response(avatar_path, 'image/png')
- else:
- return serve_blank_avatar(request, size)
- else:
- return serve_blank_avatar(request, size)
- @never_cache
- def serve_user_avatar_source(request, pk, secret, hash):
- fallback_avatar = get_blank_avatar_file(min(settings.MISAGO_AVATARS_SIZES))
- User = get_user_model()
- if int(pk) > 0:
- try:
- user = User.objects.get(pk=pk)
- tokens = store.get_user_avatar_tokens(user)
- suffix = tokens.get(secret)
- if suffix:
- avatar_file = get_user_avatar_file(user.pk, suffix)
- else:
- avatar_file = fallback_avatar
- except User.DoesNotExist:
- avatar_file = fallback_avatar
- else:
- avatar_file = fallback_avatar
- if avatar_file == fallback_avatar:
- avatar_dir = store.get_avatars_dir_path()
- else:
- avatar_dir = store.get_avatars_dir_path(pk)
- avatar_path = os.path.join(avatar_dir, avatar_file)
- return make_file_response(avatar_path, 'image/png')
- def clean_size(size):
- size = int(size)
- if size not in settings.MISAGO_AVATARS_SIZES:
- found_size = max(settings.MISAGO_AVATARS_SIZES)
- for valid_size in sorted(settings.MISAGO_AVATARS_SIZES, reverse=True):
- if valid_size > size:
- found_size = valid_size
- return found_size
- return size
- def get_user_avatar_file(pk, size):
- return '%s_%s.png' % (pk, size)
- def get_blank_avatar_file(size):
- return '%s.png' % size
|