From b6e9f2004f8e48b73d618824fad909c5cd84aa4d Mon Sep 17 00:00:00 2001 From: lian Date: Fri, 3 Apr 2015 14:05:31 +0800 Subject: [PATCH] [repo] get perm when list repo dir/file list --- media/img/folder-24.png | Bin 0 -> 298 bytes media/img/folder-read-only-24.png | Bin 0 -> 477 bytes seahub/api2/views.py | 4 +- seahub/templates/snippets/repo_dirents.html | 6 +- seahub/views/__init__.py | 82 ++++++++++++++++++++ seahub/views/ajax.py | 10 ++- seahub/views/repo.py | 8 +- 7 files changed, 101 insertions(+), 9 deletions(-) create mode 100644 media/img/folder-24.png create mode 100644 media/img/folder-read-only-24.png diff --git a/media/img/folder-24.png b/media/img/folder-24.png new file mode 100644 index 0000000000000000000000000000000000000000..572cda33f237ca6fcea3394472d3d7ed00fdb459 GIT binary patch literal 298 zcmV+_0oDGAP)AAWX9WV4Sa+!*%lCsNwNUw>X|@1 zi4;tN1r4WP>@4B_ytko-Y`mvI3#SF2_cvyL+}jvSL2&*0ysc6cy9N6ie|+50AoO`( z;~sJ?00!4aoI&(?f5YmxJF8{C>}&W-fdxT0E%>;v&im88#!3nde|vRR0~;<2Lig`) zU;zft4GJunf-@D}pWndoabK-DC3)fF-Uc)LNp)YtG_qa4zu`Jw!*6fPWd|nFcjQ{| wX>UUXUJE|%Zm_^s*b$3?<&n&2l`%pA08n?s>>zW-s{jB107*qoM6N<$g2f+!XaE2J literal 0 HcmV?d00001 diff --git a/media/img/folder-read-only-24.png b/media/img/folder-read-only-24.png new file mode 100644 index 0000000000000000000000000000000000000000..3c9bc0121c768c8edc18138addad0b8d3f9bb182 GIT binary patch literal 477 zcmV<30V4j1P)AAWX9WV4Sa+!*%lCsNwNUw>X|@1 zi4;tN1r4WP>@4B_ytko-Y`nWh6Q>2A_cvyL+}jvSL2&*0ysc6cy9N6ie|+50AoO`( z;~sJ?00!4aoI&(?f5YmxJF8{C>}&W-fdxT0E%>;v&im88#!3nde|vRR0~;<2Lig`) zU;zft4WbPN`V^cQ_cbg4CXV?)v0|L5=>Gf$j*t6l&51X>amTyq$vWSY^y0oI>9u}M z)NA{apqub9R9gslQr*`uji{giCdKaw`mx`V^k08Z(*KW)za{Ct`IksU|H}rK{plEQ2l2hj4TGUBm>2QkGmTzuoZR~h2Pdv37`QVkPQ3!Hd=)bguf^1 ze?t=g(7?dJL{`BF)O-_Rklx?#@w#^36LsysC+hu!izn*eBD>`M8n0^%H25=m_#+J0 z`|>qG+mxc>{X>$j640{eMHQ - {% trans + {% if dirent.permission = 'r' %} + {% trans + {% else %} + {% trans + {% endif %} {{ dirent.obj_name }} diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py index ac5aca4b02..48a6f2eb0c 100644 --- a/seahub/views/__init__.py +++ b/seahub/views/__init__.py @@ -174,6 +174,88 @@ def get_file_download_link(repo_id, obj_id, path): return reverse('download_file', args=[repo_id, obj_id]) + '?p=' + \ urlquote(path) +def get_repo_dirents_with_perm(request, repo, commit, path, offset=-1, limit=-1): + """List repo dirents with perm based on commit id and path. + Use ``offset`` and ``limit`` to do paginating. + + Returns: A tupple of (file_list, dir_list, dirent_more) + + TODO: Some unrelated parts(file sharing, stars, modified info, etc) need + to be pulled out to multiple functions. + """ + + dir_list = [] + file_list = [] + dirent_more = False + username = request.user.username + if commit.root_id == EMPTY_SHA1: + return ([], [], False) if limit == -1 else ([], [], False) + else: + try: + dir_id = seafile_api.get_dir_id_by_path(repo.id, path) + dirs = seafserv_threaded_rpc.list_dir_with_perm(repo.id, path, + dir_id, username, + offset, limit) + except SearpcError as e: + logger.error(e) + return ([], [], False) + + if limit != -1 and limit == len(dirs): + dirent_more = True + + starred_files = get_dir_starred_files(username, repo.id, path) + fileshares = FileShare.objects.filter(repo_id=repo.id).filter(username=username) + uploadlinks = UploadLinkShare.objects.filter(repo_id=repo.id).filter(username=username) + + view_dir_base = reverse('repo', args=[repo.id]) + dl_dir_base = reverse('repo_download_dir', args=[repo.id]) + view_file_base = reverse('repo_view_file', args=[repo.id]) + file_history_base = reverse('file_revisions', args=[repo.id]) + for dirent in dirs: + dirent.last_modified = dirent.mtime + dirent.sharelink = '' + dirent.uploadlink = '' + if stat.S_ISDIR(dirent.props.mode): + dpath = os.path.join(path, dirent.obj_name) + if dpath[-1] != '/': + dpath += '/' + for share in fileshares: + if dpath == share.path: + dirent.sharelink = gen_dir_share_link(share.token) + dirent.sharetoken = share.token + break + for link in uploadlinks: + if dpath == link.path: + dirent.uploadlink = gen_shared_upload_link(link.token) + dirent.uploadtoken = link.token + break + p_dpath = posixpath.join(path, dirent.obj_name) + dirent.view_link = view_dir_base + '?p=' + urlquote(p_dpath) + dirent.dl_link = dl_dir_base + '?p=' + urlquote(p_dpath) + dir_list.append(dirent) + else: + file_list.append(dirent) + if repo.version == 0: + dirent.file_size = get_file_size(repo.store_id, repo.version, dirent.obj_id) + else: + dirent.file_size = dirent.size + dirent.starred = False + fpath = os.path.join(path, dirent.obj_name) + p_fpath = posixpath.join(path, dirent.obj_name) + dirent.view_link = view_file_base + '?p=' + urlquote(p_fpath) + dirent.dl_link = get_file_download_link(repo.id, dirent.obj_id, + p_fpath) + dirent.history_link = file_history_base + '?p=' + urlquote(p_fpath) + if fpath in starred_files: + dirent.starred = True + for share in fileshares: + if fpath == share.path: + dirent.sharelink = gen_file_share_link(share.token) + dirent.sharetoken = share.token + break + + return (file_list, dir_list, dirent_more) + def get_repo_dirents(request, repo, commit, path, offset=-1, limit=-1): """List repo dirents based on commit id and path. Use ``offset`` and ``limit`` to do paginating. diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py index b15dd3d430..7b256c84dc 100644 --- a/seahub/views/ajax.py +++ b/seahub/views/ajax.py @@ -31,7 +31,7 @@ from seahub.notifications.views import add_notice_from_info from seahub.message.models import UserMessage from seahub.share.models import UploadLinkShare from seahub.signals import upload_file_successful, repo_created, repo_deleted -from seahub.views import get_repo_dirents, validate_owner, \ +from seahub.views import get_repo_dirents_with_perm, validate_owner, \ check_repo_access_permission, get_unencry_rw_repos_by_user, \ get_system_default_repo_id, get_diff, group_events_data, \ get_owned_repo_list, check_folder_permission @@ -273,7 +273,9 @@ def list_dir(request, repo_id): path = path + '/' more_start = None - file_list, dir_list, dirent_more = get_repo_dirents(request, repo, head_commit, path, offset=0, limit=100) + file_list, dir_list, dirent_more = get_repo_dirents_with_perm(request, repo, + head_commit, path, + offset=0, limit=100) if dirent_more: more_start = 100 zipped = get_nav_path(path, repo.name) @@ -365,7 +367,9 @@ def list_dir_more(request, repo_id): return HttpResponse(json.dumps({'error': err_msg}), status=400, content_type=content_type) more_start = None - file_list, dir_list, dirent_more = get_repo_dirents(request, repo, head_commit, path, offset, limit=100) + file_list, dir_list, dirent_more = get_repo_dirents_with_perm(request, repo, + head_commit, path, + offset, limit=100) if dirent_more: more_start = offset + 100 diff --git a/seahub/views/repo.py b/seahub/views/repo.py index ec0d41f9fa..8fbbc2a87d 100644 --- a/seahub/views/repo.py +++ b/seahub/views/repo.py @@ -23,7 +23,7 @@ from seahub.share.models import FileShare, UploadLinkShare, \ check_share_link_access, set_share_link_access from seahub.share.forms import SharedLinkPasswordForm from seahub.views import gen_path_link, get_repo_dirents, \ - check_repo_access_permission + check_repo_access_permission, get_repo_dirents_with_perm from seahub.utils import gen_file_upload_url, is_org_context, \ get_fileserver_root, gen_dir_share_link, gen_shared_upload_link, \ @@ -224,9 +224,9 @@ def render_repo(request, repo): show_repo_settings = False more_start = None - file_list, dir_list, dirent_more = get_repo_dirents(request, repo, - head_commit, path, - offset=0, limit=100) + file_list, dir_list, dirent_more = get_repo_dirents_with_perm(request, repo, + head_commit, path, + offset=0, limit=100) if dirent_more: more_start = 100 zipped = get_nav_path(path, repo.name)