1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-04 16:31:13 +00:00

add get repo info api for v2.1

This commit is contained in:
lian
2017-06-27 17:23:10 +08:00
parent 2e5d8bc1ed
commit 070f68e3e4
3 changed files with 171 additions and 0 deletions

View File

@@ -0,0 +1,67 @@
# Copyright (c) 2012-2016 Seafile Ltd.
import logging
from rest_framework.authentication import SessionAuthentication
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from seahub.api2.throttling import UserRateThrottle
from seahub.api2.authentication import TokenAuthentication
from seahub.api2.utils import api_error
from seahub.base.templatetags.seahub_tags import email2nickname, \
email2contact_email
from seahub.utils import is_org_context
from seahub.views import check_folder_permission
from seaserv import seafile_api
logger = logging.getLogger(__name__)
class RepoView(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated, )
throttle_classes = (UserRateThrottle, )
def get(self, request, repo_id):
""" Return repo info
Permission checking:
1. all authenticated user can perform this action.
"""
# resource check
repo = seafile_api.get_repo(repo_id)
if not repo:
error_msg = 'Library %s not found.' % repo_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg)
# permission check
permission = check_folder_permission(request, repo_id, '/')
if permission is None:
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
if is_org_context(request):
repo_owner = seafile_api.get_org_repo_owner(repo_id)
else:
repo_owner = seafile_api.get_repo_owner(repo_id)
result = {
"repo_id": repo.id,
"repo_name": repo.name,
"owner_email": repo_owner,
"owner_name": email2nickname(repo_owner),
"owner_contact_email": email2contact_email(repo_owner),
"size": repo.size,
"encrypted": repo.encrypted,
"file_count": repo.file_count,
"permission": permission,
}
return Response(result)

View File

@@ -26,6 +26,7 @@ from seahub.api2.endpoints.shared_folders import SharedFolders
from seahub.api2.endpoints.shared_repos import SharedRepos, SharedRepo
from seahub.api2.endpoints.upload_links import UploadLinks, UploadLink
from seahub.api2.endpoints.repos_batch import ReposBatchView
from seahub.api2.endpoints.repos import RepoView
from seahub.api2.endpoints.file import FileView
from seahub.api2.endpoints.dir import DirView
from seahub.api2.endpoints.repo_trash import RepoTrash
@@ -207,6 +208,7 @@ urlpatterns = patterns(
## user::repos
url(r'^api/v2.1/repos/batch/$', ReposBatchView.as_view(), name='api-v2.1-repos-batch'),
url(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/$', RepoView.as_view(), name='api-v2.1-repo-view'),
url(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/file/$', FileView.as_view(), name='api-v2.1-file-view'),
url(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/dir/$', DirView.as_view(), name='api-v2.1-dir-view'),
url(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/trash/$', RepoTrash.as_view(), name='api-v2.1-repo-trash'),

View File

@@ -0,0 +1,102 @@
import json
from django.core.urlresolvers import reverse
from seaserv import seafile_api
from seahub.test_utils import BaseTestCase
from seahub.base.templatetags.seahub_tags import email2nickname, \
email2contact_email
class RepoViewTest(BaseTestCase):
def setUp(self):
self.user_name = self.user.username
self.admin_name = self.admin.username
self.url = reverse('api-v2.1-repo-view', args=[self.repo.id])
def tearDown(self):
self.remove_repo()
def test_can_get(self):
self.login_as(self.user)
resp = self.client.get(self.url)
self.assertEqual(200, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp['repo_id'] == self.repo.id
assert json_resp['repo_name'] == self.repo.name
assert json_resp['owner_email'] == self.user_name
assert json_resp['owner_name'] == email2nickname(self.user_name)
assert json_resp['owner_contact_email'] == email2contact_email(self.user_name)
assert json_resp['permission'] == 'rw'
self.assertFalse(json_resp['encrypted'])
self.assertIsNotNone(json_resp['file_count'])
self.assertIsNotNone(json_resp['size'])
def test_can_get_be_shared_repo_info(self):
# create admin repo
admin_repo_id = seafile_api.create_repo(name='test-repo', desc='',
username=self.admin_name, passwd=None)
admin_repo = seafile_api.get_repo(admin_repo_id)
# share admin repo to current user
permission = 'r'
seafile_api.share_repo(admin_repo_id, self.admin_name,
self.user_name, permission)
self.login_as(self.user)
url = reverse('api-v2.1-repo-view', args=[admin_repo_id])
resp = self.client.get(url)
self.assertEqual(200, resp.status_code)
json_resp = json.loads(resp.content)
assert json_resp['repo_id'] == admin_repo.id
assert json_resp['repo_name'] == admin_repo.name
assert json_resp['owner_email'] == self.admin_name
assert json_resp['owner_name'] == email2nickname(self.admin_name)
assert json_resp['owner_contact_email'] == email2contact_email(self.admin_name)
assert json_resp['permission'] == permission
self.assertFalse(json_resp['encrypted'])
self.assertIsNotNone(json_resp['file_count'])
self.assertIsNotNone(json_resp['size'])
self.remove_repo(admin_repo_id)
def test_get_with_invalid_authentication(self):
self.login_as(self.admin)
resp = self.client.get(self.url)
self.assertEqual(403, resp.status_code)
def test_get_with_invalid_permission(self):
admin_repo_id = seafile_api.create_repo(name='test-repo', desc='',
username=self.admin_name, passwd=None)
self.login_as(self.user)
url = reverse('api-v2.1-repo-view', args=[admin_repo_id])
resp = self.client.get(url)
self.assertEqual(403, resp.status_code)
self.remove_repo(admin_repo_id)
def test_get_with_invalid_repo(self):
self.login_as(self.user)
repo_id = self.repo.id
invalid_repo_id = repo_id[0:-5] + '12345'
url = reverse('api-v2.1-repo-view', args=[invalid_repo_id])
resp = self.client.get(url)
self.assertEqual(404, resp.status_code)