diff --git a/seahub/api2/endpoints/admin/libraries.py b/seahub/api2/endpoints/admin/libraries.py index e07e0daaf5..32dcd1a5e0 100644 --- a/seahub/api2/endpoints/admin/libraries.py +++ b/seahub/api2/endpoints/admin/libraries.py @@ -6,12 +6,10 @@ from rest_framework.response import Response from rest_framework.views import APIView from rest_framework import status from django.template.defaultfilters import filesizeformat +from django.utils.translation import ugettext as _ from seaserv import ccnet_api, seafile_api, seafserv_threaded_rpc -from seahub.views.ajax import get_related_users_by_org_repo, \ - get_related_users_by_repo -from seahub.signals import repo_deleted from seahub.views import get_system_default_repo_id from seahub.utils import is_org_context from seahub.base.accounts import User @@ -35,6 +33,8 @@ def get_repo_info(repo): class AdminLibraries(APIView): + """ return all libraries + """ authentication_classes = (TokenAuthentication, SessionAuthentication) throttle_classes = (UserRateThrottle,) @@ -87,18 +87,9 @@ class AdminLibrary(APIView): return Response({'success': True}) if get_system_default_repo_id() == repo_id: - error_msg = ('System library can not be deleted.') + error_msg = _('System library can not be deleted.') return api_error(status.HTTP_400_BAD_REQUEST, error_msg) - if is_org_context(request): - org_id = seafserv_threaded_rpc.get_org_id_by_repo_id(repo_id) - usernames = get_related_users_by_org_repo(org_id, repo_id) - repo_owner = seafile_api.get_org_repo_owner(repo_id) - else: - org_id = -1 - usernames = get_related_users_by_repo(repo_id) - repo_owner = seafile_api.get_repo_owner(repo_id) - try: seafile_api.remove_repo(repo_id) except Exception as e: @@ -106,13 +97,11 @@ class AdminLibrary(APIView): error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) - repo_deleted.send(sender=None, org_id=org_id, usernames=usernames, - repo_owner=repo_owner, repo_id=repo_id, - repo_name=repo.repo_name) - return Response({'success': True}) def put(self, request, repo_id, format=None): + """ transfer a library + """ repo = seafile_api.get_repo(repo_id) if not repo: error_msg = 'Library %s not found.' % repo_id diff --git a/seahub/api2/endpoints/admin/library_dirents.py b/seahub/api2/endpoints/admin/library_dirents.py index 03acaa0269..b7b9cfc9e2 100644 --- a/seahub/api2/endpoints/admin/library_dirents.py +++ b/seahub/api2/endpoints/admin/library_dirents.py @@ -1,7 +1,7 @@ import os import stat import logging -import time +import posixpath from rest_framework.authentication import SessionAuthentication from rest_framework.permissions import IsAdminUser @@ -26,6 +26,22 @@ from seahub.api2.utils import api_error logger = logging.getLogger(__name__) +def get_dirent_info(dirent): + + if stat.S_ISDIR(dirent.mode): + is_file = False + else: + is_file = True + + result = {} + result['is_file'] = is_file + result['obj_name'] = dirent.obj_name + result['file_size'] = filesizeformat(dirent.size) if is_file else '' + result['last_update'] = timestamp_to_isoformat_timestr(dirent.mtime) + + return result + + class AdminLibraryDirents(APIView): authentication_classes = (TokenAuthentication, SessionAuthentication) @@ -33,6 +49,9 @@ class AdminLibraryDirents(APIView): permission_classes = (IsAdminUser,) def get(self, request, repo_id, format=None): + """ get all file/folder in a library + """ + repo = seafile_api.get_repo(repo_id) if not repo: error_msg = 'Library %s not found.' % repo_id @@ -55,7 +74,6 @@ class AdminLibraryDirents(APIView): error_msg = 'Folder %s not found.' % parent_dir return api_error(status.HTTP_404_NOT_FOUND, error_msg) - # TODO org? if is_org_context(request): repo_owner = seafile_api.get_org_repo_owner(repo_id) else: @@ -77,29 +95,15 @@ class AdminLibraryDirents(APIView): return_results['dirent_list'] = [] for dirent in dirs: - result = {} - if stat.S_ISDIR(dirent.mode): - result['is_file'] = False - result['obj_name'] = dirent.obj_name - result['file_size'] = '' - result['last_update'] = timestamp_to_isoformat_timestr(dirent.mtime) - else: - if repo.version == 0: - size = seafile_api.get_file_size(repo.store_id, - repo.version, dirent.obj_id) - else: - size = dirent.size - - result['is_file'] = True - result['obj_name'] = dirent.obj_name - result['file_size'] = filesizeformat(size) - result['last_update'] = timestamp_to_isoformat_timestr(dirent.mtime) - - return_results['dirent_list'].append(result) + dirent_info = get_dirent_info(dirent) + return_results['dirent_list'].append(dirent_info) return Response(return_results) def post(self, request, repo_id, format=None): + """ create file/folder in a library + """ + repo = seafile_api.get_repo(repo_id) if not repo: error_msg = 'Library %s not found.' % repo_id @@ -137,13 +141,11 @@ class AdminLibraryDirents(APIView): error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) - result = {} - result['is_file'] = False - result['obj_name'] = obj_name - result['file_size'] = filesizeformat(0) - result['last_update'] = timestamp_to_isoformat_timestr(time.time()) + dirent_path = posixpath.join(parent_dir, obj_name) + dirent = seafile_api.get_dirent_by_path(repo_id, dirent_path) + dirent_info = get_dirent_info(dirent) - return Response(result) + return Response(dirent_info) class AdminLibraryDirent(APIView): @@ -152,6 +154,9 @@ class AdminLibraryDirent(APIView): permission_classes = (IsAdminUser,) def get(self, request, repo_id): + """ get info of a single file/folder in a library + """ + repo = seafile_api.get_repo(repo_id) if not repo: error_msg = 'Library %s not found.' % repo_id @@ -169,47 +174,39 @@ class AdminLibraryDirent(APIView): if path[0] != '/': path = '/' + path - file_id = None - dir_id = None try: - file_id = seafile_api.get_file_id_by_path(repo_id, path) - dir_id = seafile_api.get_dir_id_by_path(repo_id, path) + dirent = seafile_api.get_dirent_by_path(repo_id, path) except SearpcError as e: logger.error(e) error_msg = 'Internal Server Error' return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) - if file_id: - is_file = True - elif dir_id: - is_file = False - else: - error_msg = 'path %s not found.' % path + if not dirent: + error_msg = 'file/folder %s not found.' % path return api_error(status.HTTP_404_NOT_FOUND, error_msg) - username = request.user.username - obj_name = os.path.basename(path.rstrip('/')) + if stat.S_ISDIR(dirent.mode): + is_file = False + else: + is_file = True + username = request.user.username if is_file and request.GET.get('dl', '0') == '1': + token = seafile_api.get_fileserver_access_token(repo_id, - file_id, 'download', username, use_onetime=True) - dl_url = gen_file_get_url(token, obj_name) + dirent.obj_id, 'download', username, use_onetime=True) + dl_url = gen_file_get_url(token, dirent.obj_name) send_file_access_msg(request, repo, path, 'web') return Response({'download_url': dl_url}) - size = seafile_api.get_file_size(repo.store_id, - repo.version, file_id or dir_id) + dirent_info = get_dirent_info(dirent) - result = {} - result['is_file'] = is_file - result['obj_name'] = obj_name - result['file_size'] = filesizeformat(size) -# TODO -# result['last_update'] = timestamp_to_isoformat_timestr(dirent.mtime) - - return Response(result) + return Response(dirent_info) def delete(self, request, repo_id): + """ delete a single file/folder in a library + """ + repo = seafile_api.get_repo(repo_id) if not repo: error_msg = 'Library %s not found.' % repo_id diff --git a/seahub/api2/endpoints/admin/trash_libraries.py b/seahub/api2/endpoints/admin/trash_libraries.py index 7c984a5139..69731295d8 100644 --- a/seahub/api2/endpoints/admin/trash_libraries.py +++ b/seahub/api2/endpoints/admin/trash_libraries.py @@ -25,6 +25,8 @@ class AdminTrashLibraries(APIView): permission_classes = (IsAdminUser,) def get(self, request, format=None): + """ get all deleted libraries + """ repos_all = seafile_api.get_trash_repo_list(-1, -1) return_results = [] @@ -40,6 +42,9 @@ class AdminTrashLibraries(APIView): return Response(return_results) def delete(self, request, format=None): + """ clean all deleted libraries + """ + try: seafile_api.empty_repo_trash() except SearpcError as e: @@ -56,6 +61,9 @@ class AdminTrashLibrary(APIView): permission_classes = (IsAdminUser,) def put(self, request, repo_id, format=None): + """ restore a deleted library + """ + try: seafile_api.restore_repo_from_trash(repo_id) except SearpcError as e: @@ -66,6 +74,9 @@ class AdminTrashLibrary(APIView): return Response({'success': True}) def delete(self, request, repo_id, format=None): + """ permanently delete a deleted library + """ + try: seafile_api.del_repo_from_trash(repo_id) except SearpcError as e: diff --git a/seahub/templates/js/sysadmin-templates.html b/seahub/templates/js/sysadmin-templates.html index 10cf37c94f..7ece74fde1 100644 --- a/seahub/templates/js/sysadmin-templates.html +++ b/seahub/templates/js/sysadmin-templates.html @@ -3,10 +3,10 @@