From d518c3f47a1876f5d027f99e01a852f2a5c94618 Mon Sep 17 00:00:00 2001 From: poetwang Date: Fri, 30 Oct 2015 20:50:51 +0800 Subject: [PATCH] [api2] generate url for each block for downloading blocks --- seahub/api2/urls.py | 1 + seahub/api2/views.py | 33 +++++++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/seahub/api2/urls.py b/seahub/api2/urls.py index 2b128f1886..12700e200c 100644 --- a/seahub/api2/urls.py +++ b/seahub/api2/urls.py @@ -33,6 +33,7 @@ urlpatterns = patterns('', url(r'^repos/(?P[-0-9a-f]{36})/upload-blks-link/$', UploadBlksLinkView.as_view()), url(r'^repos/(?P[-0-9a-f]{36})/update-blks-link/$', UpdateBlksLinkView.as_view()), url(r'^repos/(?P[-0-9-a-f]{36})/file/$', FileView.as_view(), name='FileView'), + url(r'^repos/(?P[-0-9a-f]{36})/files/(?P[0-9a-f]{40})/blks/(?P[0-9a-f]{40})/download-link/$', FileBlockDownloadLinkView.as_view()), url(r'^repos/(?P[-0-9-a-f]{36})/file/detail/$', FileDetailView.as_view()), url(r'^repos/(?P[-0-9-a-f]{36})/file/history/$', FileHistory.as_view()), url(r'^repos/(?P[-0-9-a-f]{36})/file/revision/$', FileRevision.as_view()), diff --git a/seahub/api2/views.py b/seahub/api2/views.py index f787d062df..502fb59841 100644 --- a/seahub/api2/views.py +++ b/seahub/api2/views.py @@ -1098,6 +1098,25 @@ class RepoOwner(APIView): content_type=json_content_type) ########## File related +class FileBlockDownloadLinkView(APIView): + authentication_classes = (TokenAuthentication, ) + permission_classes = (IsAuthenticated, ) + throttle_classes = (UserRateThrottle, ) + + def get(self, request, repo_id, file_id, block_id, format=None): + parent_dir = request.GET.get('p', '/') + if check_folder_permission(request, repo_id, parent_dir) is None: + return api_error(status.HTTP_403_FORBIDDEN, + 'You do not have permission to access this repo.') + + if check_quota(repo_id) < 0: + return api_error(HTTP_520_OPERATION_FAILED, 'Above quota') + + token = seafile_api.get_fileserver_access_token( + repo_id, file_id, 'downloadblks', request.user.username) + url = gen_block_get_url(token, block_id) + return Response(url) + class UploadLinkView(APIView): authentication_classes = (TokenAuthentication, ) permission_classes = (IsAuthenticated, ) @@ -1151,7 +1170,7 @@ class UploadBlksLinkView(APIView): return api_error(HTTP_520_OPERATION_FAILED, 'Above quota') token = seafile_api.get_fileserver_access_token( - repo_id, 'dummy', 'upload-blks', request.user.username, use_onetime = False) + repo_id, 'dummy', 'upload-blks-api', request.user.username, use_onetime = False) url = gen_file_upload_url(token, 'upload-blks-api') return Response(url) @@ -1170,7 +1189,7 @@ class UpdateBlksLinkView(APIView): return api_error(HTTP_520_OPERATION_FAILED, 'Above quota') token = seafile_api.get_fileserver_access_token( - repo_id, 'dummy', 'update-blks', request.user.username) + repo_id, 'dummy', 'update-blks-api', request.user.username) url = gen_file_upload_url(token, 'update-blks-api') return Response(url) @@ -1315,13 +1334,11 @@ def get_repo_file(request, repo_id, file_id, file_name, op, use_onetime=True): repo = get_repo(repo_id) encrypted = repo.encrypted enc_version = repo.enc_version - token = seafile_api.get_fileserver_access_token( - repo_id, file_id, op, request.user.username) - url = gen_block_get_url(token, None) + res = { - 'blklist':blklist, - 'url':url, - 'encrypted':encrypted, + 'file_id': file_id, + 'blklist': blklist, + 'encrypted': encrypted, 'enc_version': enc_version, } response = HttpResponse(json.dumps(res), status=200,