diff --git a/seahub/share/templates/share/list_priv_shared_folders.html b/seahub/share/templates/share/list_priv_shared_folders.html index 348686dae8..b2a0c85f49 100644 --- a/seahub/share/templates/share/list_priv_shared_folders.html +++ b/seahub/share/templates/share/list_priv_shared_folders.html @@ -76,11 +76,8 @@ $('.share-permission-select').change(function() { select_cont = $(this).parent(), user = select_cont.prev(), share_type = select_cont.parent().attr('data'); - {% if org %} - var url = '{% url 'org_share_permission_admin' org.url_prefix %}?org_id={{ org.org_id }}&share_type=' + share_type; - {% else %} - var url = '{% url 'share_permission_admin' %}?share_type=' + share_type; - {% endif %} + var url = '{% url 'share_permission_admin' %}?share_type=' + share_type; + $.ajax({ url: url, type: 'POST', diff --git a/seahub/share/templates/share/repos.html b/seahub/share/templates/share/repos.html index 4eef93913d..ec5841d17d 100644 --- a/seahub/share/templates/share/repos.html +++ b/seahub/share/templates/share/repos.html @@ -50,7 +50,7 @@ {% trans "Unshare"%} {% endif %} {% if repo.props.share_type == 'public' %} - {% trans "Unshare"%} + {% trans "Unshare"%} {% endif %} diff --git a/seahub/share/views.py b/seahub/share/views.py index f4a9067275..883db80184 100644 --- a/seahub/share/views.py +++ b/seahub/share/views.py @@ -16,8 +16,8 @@ from django.contrib import messages import seaserv from seaserv import seafile_api from seaserv import ccnet_threaded_rpc, is_org_group, \ - get_org_id_by_group, del_org_group_repo, get_group_repos_by_owner, \ - remove_share + get_org_id_by_group, del_org_group_repo +from pysearpc import SearpcError from seahub.share.forms import RepoShareForm, FileLinkShareForm, \ UploadLinkShareForm @@ -55,7 +55,16 @@ def get_org_group_repos_by_owner(org_id, username): def list_org_inner_pub_repos_by_owner(org_id, username): return seaserv.seafserv_threaded_rpc.list_org_inner_pub_repos_by_owner( org_id, username) - + +def org_share_repo(org_id, repo_id, from_user, to_user, permission): + return seaserv.seafserv_threaded_rpc.org_add_share(org_id, repo_id, + from_user, to_user, + permission) + +def org_remove_share(org_id, repo_id, from_user, to_user): + return seaserv.seafserv_threaded_rpc.org_remove_share(org_id, repo_id, + from_user, to_user) + ########## functions def share_to_public(request, repo, permission): @@ -127,24 +136,37 @@ def share_to_user(request, repo, to_user, permission): messages.error(request, msg) return - if is_registered_user(to_user): - try: + # permission check + if is_org_context(request): + org_id = request.user.org.org_id + if not seaserv.ccnet_threaded_rpc.org_user_exists(org_id, to_user): + msg = _(u'Failed to share to %s, user is not found.') % to_user + messages.error(request, msg) + return + else: + if not is_registered_user(to_user): + msg = _(u'Failed to share to %s, as the email is not registered.') % to_user + messages.error(request, msg) + return + + try: + if is_org_context(request): + org_id = request.user.org.org_id + org_share_repo(org_id, repo_id, from_user, to_user, permission) + else: seafile_api.share_repo(repo_id, from_user, to_user, permission) - except Exception, e: + except SearpcError as e: logger.error(e) msg = _(u'Failed to share to %s, please try again later.') % to_user messages.error(request, msg) - else: - # send a signal when sharing repo successful - share_repo_to_user_successful.send(sender=None, - from_user=from_user, - to_user=to_user, repo=repo) - msg = _(u'Shared to %(email)s successfully,go check it at Shares.') % \ - {'email':to_user, 'share':reverse('share_admin')} - messages.success(request, msg) else: - msg = _(u'Failed to share to %s, as the email is not registered.') % to_user - messages.error(request, msg) + # send a signal when sharing repo successful + share_repo_to_user_successful.send(sender=None, + from_user=from_user, + to_user=to_user, repo=repo) + msg = _(u'Shared to %(email)s successfully, go check it at Shares.') % \ + {'email': to_user, 'share': reverse('share_admin')} + messages.success(request, msg) def check_user_share_quota(username, repo, users=[], groups=[]): """Check whether user has enough quota when share repo to users/groups. @@ -266,7 +288,12 @@ def repo_remove_share(request): if username != from_email and username != to_email: return render_permission_error(request, _(u'Failed to remove share')) - remove_share(repo_id, from_email, to_email) + + if is_org_context(request): + org_id = request.user.org.org_id + org_remove_share(org_id, repo_id, from_email, to_email) + else: + seaserv.remove_share(repo_id, from_email, to_email) else: try: group_id = int(group_id) @@ -292,65 +319,26 @@ def repo_remove_share(request): next = request.META.get('HTTP_REFERER', SITE_ROOT) return HttpResponseRedirect(next) -# @login_required -# def share_admin(request): -# """ -# List share out libraries. -# """ -# username = request.user.username - -# shared_repos = [] - -# # personal repos shared by this user -# shared_repos += list_share_repos(username, 'from_email', -1, -1) - -# # repos shared to groups -# group_repos = get_group_repos_by_owner(username) -# for repo in group_repos: -# group = ccnet_threaded_rpc.get_group(int(repo.group_id)) -# if not group: -# repo.props.user = '' -# continue -# repo.props.user = group.props.group_name -# repo.props.user_info = repo.group_id -# shared_repos += group_repos - -# if not CLOUD_MODE: -# # public repos shared by this user -# pub_repos = list_inner_pub_repos_by_owner(username) -# for repo in pub_repos: -# repo.props.user = _(u'all members') -# repo.props.user_info = 'all' -# shared_repos += pub_repos - -# for repo in shared_repos: -# if repo.props.permission == 'rw': -# repo.share_permission = _(u'Read-Write') -# elif repo.props.permission == 'r': -# repo.share_permission = _(u'Read-Only') -# else: -# repo.share_permission = '' - -# if repo.props.share_type == 'personal': -# repo.props.user_info = repo.props.user - -# shared_repos.sort(lambda x, y: cmp(x.repo_id, y.repo_id)) - -# # Repo anonymous share links -# # out_links = AnonymousShare.objects.filter(repo_owner=request.user.username) -# # for link in out_links: -# # repo = get_repo(link.repo_id) -# # link.repo_name = repo.name -# # link.remain_time = anon_share_token_generator.get_remain_time(link.token) - -# return render_to_response('repo/share_admin.html', { -# "org": None, -# "shared_repos": shared_repos, -# # "out_links": out_links, -# }, context_instance=RequestContext(request)) +def get_share_out_repo_list(request): + """List repos that @user share to other users. + Returns: + A list of repos. + """ + username = request.user.username + if is_org_context(request): + org_id = request.user.org.org_id + return seafile_api.get_org_share_out_repo_list(org_id, username, + -1, -1) + else: + return seafile_api.get_share_out_repo_list(username, -1, -1) def get_group_repos_by_owner(request): + """List repos that @user share to groups. + + Returns: + A list of repos. + """ username = request.user.username if is_org_context(request): org_id = request.user.org.org_id @@ -358,22 +346,26 @@ def get_group_repos_by_owner(request): else: return seaserv.get_group_repos_by_owner(username) -def get_inner_pub_repo_list(request): +def list_inner_pub_repos_by_owner(request): + """List repos that @user share to organizatoin. + + Returns: + A list of repos, or empty list if in cloud_mode. + """ username = request.user.username if is_org_context(request): org_id = request.user.org.org_id return list_org_inner_pub_repos_by_owner(org_id, username) elif request.cloud_mode: - return seaserv.list_inner_pub_repos_by_owner(username) - else: return [] + else: + return seaserv.list_inner_pub_repos_by_owner(username) def list_share_out_repos(request): shared_repos = [] - username = request.user.username # repos shared from this user - shared_repos += seafile_api.get_share_out_repo_list(username, -1, -1) + shared_repos += get_share_out_repo_list(request) # repos shared to groups group_repos = get_group_repos_by_owner(request) @@ -386,8 +378,8 @@ def list_share_out_repos(request): repo.props.user_info = repo.group_id shared_repos += group_repos - # pub repos - pub_repos = get_inner_pub_repo_list(request) + # inner pub repos + pub_repos = list_inner_pub_repos_by_owner(request) for repo in pub_repos: repo.props.user = _(u'all members') repo.props.user_info = 'all' @@ -418,7 +410,7 @@ def list_shared_repos(request): repo.props.user_info = repo.props.user out_repos.append(repo) - out_repos.sort(lambda x, y: cmp(x.repo_id, y.repo_id)) + out_repos.sort(lambda x, y: cmp(x.repo_name, y.repo_name)) return render_to_response('share/repos.html', { "out_repos": out_repos, @@ -570,8 +562,13 @@ def share_permission_admin(request): content_type=content_type) try: - seafile_api.set_share_permission(repo_id, from_email, - email_or_group, permission) + if is_org_context(request): + org_id = request.user.org.org_id + seaserv.seafserv_threaded_rpc.org_set_share_permission( + org_id, repo_id, from_email, email_or_group, permission) + else: + seafile_api.set_share_permission(repo_id, from_email, + email_or_group, permission) except SearpcError: return HttpResponse(json.dumps({'success': False}), status=500, content_type=content_type) @@ -580,8 +577,13 @@ def share_permission_admin(request): elif share_type == 'group': try: - seafile_api.set_group_repo_permission(int(email_or_group), - repo_id, permission) + if is_org_context(request): + org_id = request.user.org.org_id + seaserv.seafserv_threaded_rpc.set_org_group_repo_permission( + org_id, int(email_or_group), repo_id, permission) + else: + seafile_api.set_group_repo_permission(int(email_or_group), + repo_id, permission) except SearpcError: return HttpResponse(json.dumps({'success': False}), status=500, content_type=content_type) @@ -589,7 +591,7 @@ def share_permission_admin(request): content_type=content_type) elif share_type == 'public': - try: + try: if is_org_context(request): org_id = request.user.org.org_id seaserv.seafserv_threaded_rpc.set_org_inner_pub_repo( diff --git a/seahub/views/__init__.py b/seahub/views/__init__.py index 8021c580e3..fb4e36e8a8 100644 --- a/seahub/views/__init__.py +++ b/seahub/views/__init__.py @@ -891,80 +891,20 @@ def get_owned_repo_list(request): else: return seafile_api.get_owned_repo_list(username) -def get_share_in_repo_list(request, start, limit): - """List share in repos; - """ - username = request.user.username - if is_org_context(request): - org_id = request.user.org.org_id - return seafile_api.get_org_share_in_repo_list(org_id, username, -1, -1) - else: - return seafile_api.get_share_in_repo_list(username, -1, -1) +def get_virtual_repos_by_owner(request): + """List virtual repos. -def get_groups_by_user(request): - """List user groups. + Arguments: + - `request`: """ username = request.user.username if is_org_context(request): org_id = request.user.org.org_id - return seaserv.get_org_groups_by_user(org_id, username) + return seaserv.seafserv_threaded_rpc.get_org_virtual_repos_by_owner( + org_id, username) else: - return seaserv.get_personal_groups_by_user(username) - -def get_group_repos(request, groups): - """Get repos shared to groups. - """ - username = request.user.username - group_repos = [] - if is_org_context(request): - org_id = request.user.org.org_id - # For each group I joined... - for grp in groups: - # Get group repos, and for each group repos... - for r_id in seafile_api.get_org_group_repoids(org_id, grp.id): - # No need to list my own repo - repo_owner = seafile_api.get_org_repo_owner(r_id) - if repo_owner == username: - continue - # Convert repo properties due to the different collumns in Repo - # and SharedRepo - r = get_repo(r_id) - if not r: - continue - r.repo_id = r.id - r.repo_name = r.name - r.repo_desc = r.desc - r.last_modified = get_repo_last_modify(r) - r.share_type = 'group' - r.user = repo_owner - r.user_perm = check_permission(r_id, username) - r.group = grp - group_repos.append(r) - else: - # For each group I joined... - for grp in groups: - # Get group repos, and for each group repos... - for r_id in seafile_api.get_group_repoids(grp.id): - # No need to list my own repo - repo_owner = seafile_api.get_repo_owner(r_id) - if repo_owner == username: - continue - # Convert repo properties due to the different collumns in Repo - # and SharedRepo - r = get_repo(r_id) - if not r: - continue - r.repo_id = r.id - r.repo_name = r.name - r.repo_desc = r.desc - r.last_modified = get_repo_last_modify(r) - r.share_type = 'group' - r.user = repo_owner - r.user_perm = check_permission(r_id, username) - r.group = grp - group_repos.append(r) - return group_repos - + return seafile_api.get_virtual_repos_by_owner(username) + @login_required @user_mods_check def myhome(request): @@ -981,7 +921,7 @@ def myhome(request): sub_repos = [] sub_lib_enabled = UserOptions.objects.is_sub_lib_enabled(username) if ENABLE_SUB_LIBRARY and sub_lib_enabled: - sub_repos = seafile_api.get_virtual_repos_by_owner(username) + sub_repos = get_virtual_repos_by_owner(request) for repo in sub_repos: repo.abbrev_origin_path = get_abbrev_origin_path(repo.origin_repo_name, repo.origin_path) @@ -1127,55 +1067,30 @@ def client_unsync(request): return HttpResponse(json.dumps({'error': _(u'Internal server error')}), status=500, content_type=content_type) -# @login_required -# def innerpub_msg_reply(request, msg_id): -# """Show inner pub message replies, and process message reply in ajax""" - -# content_type = 'application/json; charset=utf-8' -# if request.is_ajax(): -# ctx = {} -# if request.method == 'POST': -# form = MessageReplyForm(request.POST) - -# # TODO: invalid form -# if form.is_valid(): -# msg = form.cleaned_data['message'] -# try: -# innerpub_msg = InnerPubMsg.objects.get(id=msg_id) -# except InnerPubMsg.DoesNotExist: -# return HttpResponseBadRequest(content_type=content_type) - -# msg_reply = InnerPubMsgReply() -# msg_reply.reply_to = innerpub_msg -# msg_reply.from_email = request.user.username -# msg_reply.message = msg -# msg_reply.save() - -# ctx['reply'] = msg_reply -# html = render_to_string("group/group_reply_new.html", ctx) - -# else: -# try: -# msg = InnerPubMsg.objects.get(id=msg_id) -# except InnerPubMsg.DoesNotExist: -# raise HttpResponse(status=400) - -# replies = InnerPubMsgReply.objects.filter(reply_to=msg) -# ctx['replies'] = replies -# html = render_to_string("group/group_reply_list.html", ctx) - -# serialized_data = json.dumps({"html": html}) -# return HttpResponse(serialized_data, content_type=content_type) -# else: -# return HttpResponseBadRequest(content_type=content_type) @login_required def unsetinnerpub(request, repo_id): + """Unshare repos in organization or in share admin page. + + Only system admin, organization admin or repo owner can perform this op. + """ repo = get_repo(repo_id) if not repo: messages.error(request, _('Failed to unshare the library, as it does not exist.')) return HttpResponseRedirect(reverse('share_admin')) - # TODO: permission check + # permission check + username = request.user.username + if is_org_context(request): + org_id = request.user.org.org_id + repo_owner = seafile_api.get_org_repo_owner(repo.id) + is_repo_owner = True if repo_owner == username else False + if not (request.user.org.is_staff or is_repo_owner): + raise Http404 + else: + repo_owner = seafile_api.get_repo_owner(repo.id) + is_repo_owner = True if repo_owner == username else False + if not (request.user.is_staff or is_repo_owner): + raise Http404 try: if is_org_context(request): diff --git a/seahub/views/ajax.py b/seahub/views/ajax.py index 56c99222ae..a803827c0d 100644 --- a/seahub/views/ajax.py +++ b/seahub/views/ajax.py @@ -1148,8 +1148,13 @@ def sub_repo(request, repo_id): # check if the sub-lib exist try: - sub_repo = seafile_api.get_virtual_repo(repo_id, path, username) - except SearpcError, e: + if is_org_context(request): + org_id = request.user.org.org_id + sub_repo = seaserv.seafserv_threaded_rpc.get_org_virtual_repo( + org_id, repo_id, path, username) + else: + sub_repo = seafile_api.get_virtual_repo(repo_id, path, username) + except SearpcError as e: result['error'] = e.msg return HttpResponse(json.dumps(result), status=500, content_type=content_type) @@ -1159,7 +1164,14 @@ def sub_repo(request, repo_id): # create a sub-lib try: # use name as 'repo_name' & 'repo_desc' for sub_repo - sub_repo_id = seafile_api.create_virtual_repo(repo_id, path, name, name, username) + if is_org_context(request): + org_id = request.user.org.org_id + sub_repo_id = seaserv.seafserv_threaded_rpc.create_org_virtual_repo( + org_id, repo_id, path, name, name, username) + else: + sub_repo_id = seafile_api.create_virtual_repo(repo_id, path, + name, name, + username) result['sub_repo_id'] = sub_repo_id except SearpcError, e: result['error'] = e.msg @@ -1388,10 +1400,92 @@ def space_and_traffic(request): context_instance=RequestContext(request)) return HttpResponse(json.dumps({"html": html}), content_type=content_type) +def get_share_in_repo_list(request, start, limit): + """List share in repos. + """ + username = request.user.username + if is_org_context(request): + org_id = request.user.org.org_id + repo_list = seafile_api.get_org_share_in_repo_list(org_id, username, + -1, -1) + else: + repo_list = seafile_api.get_share_in_repo_list(username, -1, -1) + + for repo in repo_list: + repo.user_perm = seafile_api.check_repo_access_permission(repo.repo_id, + username) + return repo_list + +def get_groups_by_user(request): + """List user groups. + """ + username = request.user.username + if is_org_context(request): + org_id = request.user.org.org_id + return seaserv.get_org_groups_by_user(org_id, username) + else: + return seaserv.get_personal_groups_by_user(username) + +def get_group_repos(request, groups): + """Get repos shared to groups. + """ + username = request.user.username + group_repos = [] + if is_org_context(request): + org_id = request.user.org.org_id + # For each group I joined... + for grp in groups: + # Get group repos, and for each group repos... + for r_id in seafile_api.get_org_group_repoids(org_id, grp.id): + # No need to list my own repo + repo_owner = seafile_api.get_org_repo_owner(r_id) + if repo_owner == username: + continue + # Convert repo properties due to the different collumns in Repo + # and SharedRepo + r = get_repo(r_id) + if not r: + continue + r.repo_id = r.id + r.repo_name = r.name + r.repo_desc = r.desc + r.last_modified = get_repo_last_modify(r) + r.share_type = 'group' + r.user = repo_owner + r.user_perm = seafile_api.check_repo_access_permission( + r_id, username) + r.group = grp + group_repos.append(r) + else: + # For each group I joined... + for grp in groups: + # Get group repos, and for each group repos... + for r_id in seafile_api.get_group_repoids(grp.id): + # No need to list my own repo + repo_owner = seafile_api.get_repo_owner(r_id) + if repo_owner == username: + continue + # Convert repo properties due to the different collumns in Repo + # and SharedRepo + r = get_repo(r_id) + if not r: + continue + r.repo_id = r.id + r.repo_name = r.name + r.repo_desc = r.desc + r.last_modified = get_repo_last_modify(r) + r.share_type = 'group' + r.user = repo_owner + r.user_perm = seafile_api.check_repo_access_permission( + r_id, username) + r.group = grp + group_repos.append(r) + return group_repos + @login_required def my_shared_and_group_repos(request): """Return html snippet of repos that shared to user and group repos. - + Arguments: - `request`: """ @@ -1400,39 +1494,13 @@ def my_shared_and_group_repos(request): content_type = 'application/json; charset=utf-8' - username = request.user.username - - shared_repos = seafile_api.get_share_in_repo_list(username, -1, -1) - for repo in shared_repos: - repo.user_perm = seafile_api.check_repo_access_permission(repo.repo_id, username) - + # shared + shared_repos = get_share_in_repo_list(request, -1, -1) shared_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified)) - group_repos = [] - # Get all personal groups I joined. - joined_groups = request.user.joined_groups - # For each group I joined... - for grp in joined_groups: - # Get group repos, and for each group repos... - for r_id in seaserv.get_group_repoids(grp.id): - # No need to list my own repo - repo_owner = seafile_api.get_repo_owner(r_id) - if repo_owner == username: - continue - # Convert repo properties due to the different collumns in Repo - # and SharedRepo - r = seaserv.get_repo(r_id) - if not r: - continue - r.repo_id = r.id - r.repo_name = r.name - r.repo_desc = r.desc - r.last_modified = get_repo_last_modify(r) - r.share_type = 'group' - r.user = repo_owner - r.user_perm = seaserv.check_permission(r_id, username) - r.group = grp - group_repos.append(r) + # group repos + joined_groups = get_groups_by_user(request) + group_repos = get_group_repos(request, joined_groups) group_repos.sort(key=lambda x: x.group.group_name) for i, repo in enumerate(group_repos): if i == 0: @@ -1441,19 +1509,18 @@ def my_shared_and_group_repos(request): if repo.group.group_name != group_repos[i-1].group.group_name: repo.show_group_name = True - ctx_shared = { - "shared_repos": shared_repos, - } - ctx_group = { - "group_repos": group_repos, - } - shared_repos_html = render_to_string('snippets/my_shared_repos.html', ctx_shared, - context_instance=RequestContext(request)) - group_repos_html = render_to_string('snippets/my_group_repos.html', ctx_group, - context_instance=RequestContext(request)) + ctx_shared = {"shared_repos": shared_repos} + ctx_group = {"group_repos": group_repos} + shared_repos_html = render_to_string( + 'snippets/my_shared_repos.html', ctx_shared, + context_instance=RequestContext(request)) + group_repos_html = render_to_string( + 'snippets/my_group_repos.html', ctx_group, + context_instance=RequestContext(request)) - return HttpResponse(json.dumps({"shared": shared_repos_html, "group": group_repos_html}), - content_type=content_type) + return HttpResponse(json.dumps({"shared": shared_repos_html, + "group": group_repos_html}), + content_type=content_type) @login_required def get_file_op_url(request, repo_id): diff --git a/seahub/views/file.py b/seahub/views/file.py index 2ce6ef1a2a..34d5acb0f4 100644 --- a/seahub/views/file.py +++ b/seahub/views/file.py @@ -44,7 +44,7 @@ from seahub.contacts.models import Contact from seahub.share.models import FileShare, PrivateFileDirShare from seahub.wiki.utils import get_wiki_dirent from seahub.wiki.models import WikiDoesNotExist, WikiPageMissing -from seahub.utils import show_delete_days, render_error, \ +from seahub.utils import show_delete_days, render_error, is_org_context, \ get_file_type_and_ext, gen_file_get_url, gen_file_share_link, \ render_permission_error, \ is_textual_file, show_delete_days, mkstemp, EMPTY_SHA1, HtmlDiff, \ @@ -318,9 +318,13 @@ def view_file(request, repo_id): obj_id, path) if not user_perm: return render_permission_error(request, _(u'Unable to view file')) - + # check if the user is the owner or not, for 'private share' - is_repo_owner = seafile_api.is_repo_owner(username, repo.id) + if is_org_context(request): + repo_owner = seafile_api.get_org_repo_owner(repo.id) + is_repo_owner = True if repo_owner == username else False + else: + is_repo_owner = seafile_api.is_repo_owner(username, repo.id) # get file type and extension filetype, fileext = get_file_type_and_ext(u_filename) diff --git a/seahub/views/repo.py b/seahub/views/repo.py index c1c57bb1d7..350ff40dd9 100644 --- a/seahub/views/repo.py +++ b/seahub/views/repo.py @@ -21,7 +21,7 @@ from seahub.share.models import FileShare, UploadLinkShare from seahub.views import gen_path_link, get_repo_dirents, \ check_repo_access_permission -from seahub.utils import gen_file_upload_url, \ +from seahub.utils import gen_file_upload_url, is_org_context, \ get_httpserver_root, gen_dir_share_link, gen_shared_upload_link, \ get_max_upload_file_size, new_merge_with_no_conflict, \ get_commit_before_new_merge @@ -204,7 +204,10 @@ def render_repo(request, repo): repo_size = get_repo_size(repo.id) no_quota = is_no_quota(repo.id) search_repo_id = None if repo.encrypted else repo.id - repo_owner = seafile_api.get_repo_owner(repo.id) + 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) is_repo_owner = True if repo_owner == username else False if is_repo_owner and not repo.is_virtual: show_repo_settings = True @@ -212,7 +215,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(request, repo, + head_commit, path, + offset=0, limit=100) if dirent_more: more_start = 100 zipped = get_nav_path(path, repo.name)