1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-12 13:24:52 +00:00

Merge pull request #1589 from haiwen/avatar-api

add api for creating user avatar
This commit is contained in:
xiez
2017-05-12 19:01:30 +08:00
committed by GitHub
3 changed files with 61 additions and 10 deletions

View File

@@ -90,7 +90,7 @@ urlpatterns = patterns('',
url(r'^repo_history_changes/(?P<repo_id>[-0-9a-f]{36})/$', RepoHistoryChange.as_view()),
url(r'^unseen_messages/$', UnseenMessagesCountView.as_view()),
url(r'^avatars/user/(?P<user>\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/resized/(?P<size>[0-9]+)/$', UserAvatarView.as_view()),
url(r'^avatars/user/(?P<user>\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+)/resized/(?P<size>[0-9]+)/$', UserAvatarView.as_view(), name="api2-user-avatar"),
url(r'^avatars/group/(?P<group_id>\d+)/resized/(?P<size>[0-9]+)/$', GroupAvatarView.as_view()),
url(r'^groups/$', Groups.as_view()),

View File

@@ -42,9 +42,13 @@ from .utils import get_diff_details, \
from seahub.api2.base import APIView
from seahub.api2.models import TokenV2, DESKTOP_PLATFORMS
from seahub.avatar.models import Avatar
from seahub.avatar.signals import avatar_updated
from seahub.avatar.templatetags.avatar_tags import api_avatar_url, avatar
from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, \
grp_avatar
from seahub.avatar.templatetags.group_avatar_tags import api_grp_avatar_url, grp_avatar
from seahub.avatar.settings import (AVATAR_MAX_AVATARS_PER_USER,
AVATAR_MAX_SIZE, AVATAR_ALLOWED_FILE_EXTS)
from seahub.base.accounts import User
from seahub.base.models import UserStarredFiles, DeviceToken
from seahub.base.templatetags.seahub_tags import email2nickname, \
@@ -3844,9 +3848,9 @@ class GroupRepo(APIView):
content_type=json_content_type)
class UserAvatarView(APIView):
authentication_classes = (TokenAuthentication, )
authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated,)
throttle_classes = (UserRateThrottle, )
throttle_classes = (UserRateThrottle,)
def get(self, request, user, size, format=None):
url, is_default, date_uploaded = api_avatar_url(user, int(size))
@@ -3856,6 +3860,44 @@ class UserAvatarView(APIView):
"mtime": get_timestamp(date_uploaded) }
return Response(ret)
def post(self, request, user, size, format=None):
image_file = request.FILES.get('avatar', None)
if not image_file:
error_msg = 'avatar invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
(root, ext) = os.path.splitext(image_file.name.lower())
if AVATAR_ALLOWED_FILE_EXTS and ext not in AVATAR_ALLOWED_FILE_EXTS:
error_msg = _(u"%(ext)s is an invalid file extension. Authorized extensions are : %(valid_exts_list)s") % {'ext' : ext, 'valid_exts_list' : ", ".join(AVATAR_ALLOWED_FILE_EXTS)}
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
if image_file.size > AVATAR_MAX_SIZE:
error_msg = _(u"Your file is too big (%(size)s), the maximum allowed size is %(max_valid_size)s") % { 'size' : filesizeformat(image_file.size), 'max_valid_size' : filesizeformat(AVATAR_MAX_SIZE)}
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
username = request.user.username
count = Avatar.objects.filter(emailuser=username).count()
if AVATAR_MAX_AVATARS_PER_USER > 1 and count >= AVATAR_MAX_AVATARS_PER_USER:
error_msg = _(u"You already have %(nb_avatars)d avatars, and the maximum allowed is %(nb_max_avatars)d.") % { 'nb_avatars' : count, 'nb_max_avatars' : AVATAR_MAX_AVATARS_PER_USER}
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
avatar = Avatar(
emailuser = username,
primary = True,
)
avatar.avatar.save(image_file.name, image_file)
avatar.save()
avatar_updated.send(sender=Avatar, user=request.user, avatar=avatar)
url, is_default, date_uploaded = api_avatar_url(request.user, int(size))
ret = {
"url": request.build_absolute_uri(url),
"mtime": get_timestamp(date_uploaded)
}
return Response(ret)
class GroupAvatarView(APIView):
authentication_classes = (TokenAuthentication, )
permission_classes = (IsAuthenticated,)

View File

@@ -1,18 +1,27 @@
import unittest
import os
from tests.api.apitestbase import ApiTestBase
from tests.api.urls import AVATAR_BASE_URL, GROUPS_URL
from tests.common.utils import randstring, apiurl, urljoin
from tests.common.utils import randstring, urljoin
class AvatarApiTest(ApiTestBase):
def test_user_avatar(self):
def test_get_user_avatar(self):
avatar_url = urljoin(AVATAR_BASE_URL, 'user', self.username, '/resized/80/')
info = self.get(avatar_url).json()
self.assertIsNotNone(info['url'])
self.assertIsNotNone(info['is_default'])
self.assertIsNotNone(info['mtime'])
def test_group_avatar(self):
def test_create_user_avatar(self):
avatar_url = urljoin(AVATAR_BASE_URL, 'user', self.username, '/resized/80/')
avatar_file = os.path.join(os.getcwd(), 'media/img/seafile-logo.png')
with open(avatar_file) as f:
json_resp = self.post(avatar_url, files={'avatar': f}).json()
assert 'media/avatars' in json_resp['url']
def test_get_group_avatar(self):
gname = randstring(16)
data = {'group_name': gname}
res = self.put(GROUPS_URL, data=data)