Adding big avatar image and change avatar endpoint

remotes/origin/enhancement/email-actions
Jesús Espino 2014-07-30 13:52:43 +02:00
parent 2ca0039852
commit 57659d72df
5 changed files with 40 additions and 2 deletions

View File

@ -311,12 +311,14 @@ SOUTH_MIGRATION_MODULES = {
} }
DEFAULT_AVATAR_SIZE = 80 # 80x80 pixels DEFAULT_AVATAR_SIZE = 80 # 80x80 pixels
DEFAULT_BIG_AVATAR_SIZE = 300 # 300x300 pixels
DEFAULT_AVATAR_URL = '' DEFAULT_AVATAR_URL = ''
THUMBNAIL_ALIASES = { THUMBNAIL_ALIASES = {
'': { '': {
'avatar': {'size': (DEFAULT_AVATAR_SIZE, DEFAULT_AVATAR_SIZE), 'crop': True}, 'avatar': {'size': (DEFAULT_AVATAR_SIZE, DEFAULT_AVATAR_SIZE), 'crop': True},
'big-avatar': {'size': (DEFAULT_BIG_AVATAR_SIZE, DEFAULT_BIG_AVATAR_SIZE), 'crop': True},
}, },
} }

View File

@ -153,6 +153,23 @@ class UsersViewSet(ModelCrudViewSet):
request.user.save(update_fields=["password"]) request.user.save(update_fields=["password"])
return Response(status=status.HTTP_204_NO_CONTENT) return Response(status=status.HTTP_204_NO_CONTENT)
@list_route(methods=["POST"])
def change_avatar(self, request):
"""
Change avatar to current logged user.
"""
self.check_permissions(request, "change_avatar", None)
avatar = request.FILES['avatar']
if not avatar:
raise exc.WrongArguments(_("Incomplete arguments"))
request.user.photo = avatar
request.user.save(update_fields=["photo"])
user_data = serializers.UserSerializer(request.user).data
return Response(user_data, status=status.HTTP_200_OK)
@detail_route(methods=["GET"]) @detail_route(methods=["GET"])
def starred(self, request, pk=None): def starred(self, request, pk=None):
user = self.get_object() user = self.get_object()

View File

@ -35,4 +35,5 @@ class UserPermission(ResourcePermission):
password_recovery_perms = AllowAny() password_recovery_perms = AllowAny()
change_password_from_recovery_perms = AllowAny() change_password_from_recovery_perms = AllowAny()
change_password_perms = IsAuthenticated() change_password_perms = IsAuthenticated()
change_avatar_perms = IsAuthenticated()
starred_perms = AllowAny() starred_perms = AllowAny()

View File

@ -19,18 +19,19 @@ from django.utils.translation import ugettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from .models import User from .models import User
from .services import get_photo_or_gravatar_url from .services import get_photo_or_gravatar_url, get_big_photo_or_gravatar_url
class UserSerializer(serializers.ModelSerializer): class UserSerializer(serializers.ModelSerializer):
full_name_display = serializers.SerializerMethodField("get_full_name_display") full_name_display = serializers.SerializerMethodField("get_full_name_display")
photo = serializers.SerializerMethodField("get_photo") photo = serializers.SerializerMethodField("get_photo")
big_photo = serializers.SerializerMethodField("get_big_photo")
class Meta: class Meta:
model = User model = User
fields = ('id', 'username', 'full_name', 'full_name_display', 'email', 'github_id', fields = ('id', 'username', 'full_name', 'full_name_display', 'email', 'github_id',
'color', 'bio', 'default_language', 'default_timezone', 'color', 'bio', 'default_language', 'default_timezone',
'is_active', 'photo') 'is_active', 'photo', 'big_photo')
def get_full_name_display(self, obj): def get_full_name_display(self, obj):
return obj.get_full_name() if obj else "" return obj.get_full_name() if obj else ""
@ -38,6 +39,9 @@ class UserSerializer(serializers.ModelSerializer):
def get_photo(self, user): def get_photo(self, user):
return get_photo_or_gravatar_url(user) return get_photo_or_gravatar_url(user)
def get_big_photo(self, user):
return get_big_photo_or_gravatar_url(user)
class RecoverySerializer(serializers.Serializer): class RecoverySerializer(serializers.Serializer):
token = serializers.CharField(max_length=200) token = serializers.CharField(max_length=200)

View File

@ -20,6 +20,7 @@ This model contains a domain logic for users application.
from django.db.models.loading import get_model from django.db.models.loading import get_model
from django.db.models import Q from django.db.models import Q
from django.conf import settings
from easy_thumbnails.files import get_thumbnailer from easy_thumbnails.files import get_thumbnailer
@ -62,3 +63,16 @@ def get_photo_or_gravatar_url(user):
if user: if user:
return get_photo_url(user.photo) if user.photo else get_gravatar_url(user.email) return get_photo_url(user.photo) if user.photo else get_gravatar_url(user.email)
return "" return ""
def get_big_photo_url(photo):
"""Get a big photo absolute url and the photo automatically cropped."""
url = get_thumbnailer(photo)['big-avatar'].url
return get_absolute_url(url)
def get_big_photo_or_gravatar_url(user):
"""Get the user's big photo/gravatar url."""
if user:
return get_big_photo_url(user.photo) if user.photo else get_gravatar_url(user.email, size=settings.DEFAULT_BIG_AVATAR_SIZE)
return ""