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:
67
seahub/api2/endpoints/repos.py
Normal file
67
seahub/api2/endpoints/repos.py
Normal 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)
|
@@ -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.shared_repos import SharedRepos, SharedRepo
|
||||||
from seahub.api2.endpoints.upload_links import UploadLinks, UploadLink
|
from seahub.api2.endpoints.upload_links import UploadLinks, UploadLink
|
||||||
from seahub.api2.endpoints.repos_batch import ReposBatchView
|
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.file import FileView
|
||||||
from seahub.api2.endpoints.dir import DirView
|
from seahub.api2.endpoints.dir import DirView
|
||||||
from seahub.api2.endpoints.repo_trash import RepoTrash
|
from seahub.api2.endpoints.repo_trash import RepoTrash
|
||||||
@@ -207,6 +208,7 @@ urlpatterns = patterns(
|
|||||||
|
|
||||||
## user::repos
|
## user::repos
|
||||||
url(r'^api/v2.1/repos/batch/$', ReposBatchView.as_view(), name='api-v2.1-repos-batch'),
|
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})/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})/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'),
|
url(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/trash/$', RepoTrash.as_view(), name='api-v2.1-repo-trash'),
|
||||||
|
102
tests/api/endpoints/test_repos.py
Normal file
102
tests/api/endpoints/test_repos.py
Normal 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)
|
Reference in New Issue
Block a user