def get_group_repos(username, org_id, groups): """Get repos shared to groups. """ group_repos = [] if 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 = seafile_api.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 = seafile_api.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
def group_wiki_pages(request, group): """ List wiki pages in group. """ username = request.user.username try: repo = get_group_wiki_repo(group, username) pages = get_wiki_pages(repo) except SearpcError: return render_error(request, _("Internal Server Error")) except WikiDoesNotExist: return render_error(request, _("Wiki does not exists.")) repo_perm = seafile_api.check_repo_access_permission(repo.id, username) mods_available = get_available_mods_by_group(group.id) mods_enabled = get_enabled_mods_by_group(group.id) return render_to_response( "group/group_wiki_pages.html", { "group": group, "pages": pages, "is_staff": group.is_staff, "repo_id": repo.id, "search_repo_id": repo.id, "search_wiki": True, "repo_perm": repo_perm, "mods_enabled": mods_enabled, "mods_available": mods_available, }, context_instance=RequestContext(request), )
def group_wiki_pages(request, group): """ List wiki pages in group. """ username = request.user.username try: repo = get_group_wiki_repo(group, username) pages = get_wiki_pages(repo) except SearpcError: return render_error(request, _('Internal Server Error')) except WikiDoesNotExist: return render_error(request, _('Wiki does not exists.')) repo_perm = seafile_api.check_repo_access_permission(repo.id, username) mods_available = get_available_mods_by_group(group.id) mods_enabled = get_enabled_mods_by_group(group.id) return render_to_response("group/group_wiki_pages.html", { "group": group, "pages": pages, "is_staff": group.is_staff, "repo_id": repo.id, "search_repo_id": repo.id, "search_wiki": True, "repo_perm": repo_perm, "mods_enabled": mods_enabled, "mods_available": mods_available, }, context_instance=RequestContext(request))
def is_repo_accessible(repo_id, username): """Check whether a user can read or write to a repo. Arguments: - `repo_id`: - `username`: """ if seafile_api.check_repo_access_permission(repo_id, username) is None: return False else: return True
def is_repo_writable(repo_id, username): """Check whether a user has write permission to a repo. Arguments: - `repo_id`: - `username`: """ if seafile_api.check_repo_access_permission(repo_id, username) == 'rw': return True else: return False
def allow_generate_thumbnail(username, repo, f): # check if thumbnail is allowed if seafile_api.check_repo_access_permission(repo.id, username) is None: # user can not access repo return False file_type, file_ext = get_file_type_and_ext(f.obj_name) if not repo.encrypted and file_type == IMAGE and ENABLE_THUMBNAIL \ and f.file_size < THUMBNAIL_IMAGE_SIZE_LIMIT * 1024**2: return True else: return False
def check_repo_access_permission(repo_id, username): return seafile_api.check_repo_access_permission(repo_id, username)
def group_wiki(request, group, page_name="home"): username = request.user.username # get available modules(wiki, etc) mods_available = get_available_mods_by_group(group.id) mods_enabled = get_enabled_mods_by_group(group.id) wiki_exists = True try: content, repo, dirent = get_group_wiki_page(username, group, page_name) except WikiDoesNotExist: wiki_exists = False group_repos = get_group_repos(group.id, username) group_repos = [r for r in group_repos if not r.encrypted] return render_to_response( "group/group_wiki.html", { "group": group, "is_staff": group.is_staff, "wiki_exists": wiki_exists, "mods_enabled": mods_enabled, "mods_available": mods_available, "group_repos": group_repos, }, context_instance=RequestContext(request), ) except WikiPageMissing: """create that page for user if he/she is a group member""" if not is_group_user(group.id, username): raise Http404 repo = get_group_wiki_repo(group, username) # No need to check whether repo is none, since repo is already created filename = page_name_to_file_name(clean_page_name(page_name)) if not post_empty_file(repo.id, "/", filename, username): return render_error(request, _("Failed to create wiki page. Please retry later.")) return HttpResponseRedirect(reverse("group_wiki", args=[group.id, page_name])) else: url_prefix = reverse("group_wiki", args=[group.id]) # fetch file modified time and modifier path = "/" + dirent.obj_name try: dirent = seafile_api.get_dirent_by_path(repo.id, path) if dirent: latest_contributor, last_modified = dirent.modifier, dirent.mtime else: latest_contributor, last_modified = None, 0 except SearpcError as e: logger.error(e) latest_contributor, last_modified = None, 0 repo_perm = seafile_api.check_repo_access_permission(repo.id, username) wiki_index_exists = True index_pagename = "index" index_content = None try: index_content, index_repo, index_dirent = get_group_wiki_page(username, group, index_pagename) except (WikiDoesNotExist, WikiPageMissing) as e: wiki_index_exists = False return render_to_response( "group/group_wiki.html", { "group": group, "is_staff": group.is_staff, "wiki_exists": wiki_exists, "content": content, "page": os.path.splitext(dirent.obj_name)[0], "last_modified": last_modified, "latest_contributor": latest_contributor or _("Unknown"), "path": path, "repo_id": repo.id, "search_repo_id": repo.id, "search_wiki": True, "mods_enabled": mods_enabled, "mods_available": mods_available, "repo_perm": repo_perm, "wiki_index_exists": wiki_index_exists, "index_content": index_content, }, context_instance=RequestContext(request), )
accessible_repos = [] for r in owned_repos: if not has_repo(accessible_repos, r) and not r.encrypted: r.has_subdir = check_has_subdir(r) accessible_repos.append(r) for r in shared_repos + public_repos: # For compatibility with diffrent fields names in Repo and # SharedRepo objects. r.id = r.repo_id r.name = r.repo_name r.desc = r.repo_desc if not has_repo(accessible_repos, r) and not r.encrypted: if seafile_api.check_repo_access_permission(r.id, username) == 'rw': r.has_subdir = check_has_subdir(r) accessible_repos.append(r) for r in groups_repos: if not has_repo(accessible_repos, r) and not r.encrypted: if seafile_api.check_repo_access_permission(r.id, username) == 'rw': r.has_subdir = check_has_subdir(r) accessible_repos.append(r) return accessible_repos def get_shared_groups_by_repo_and_user(repo_id, username): """Get all groups which this repo is shared.
def group_wiki(request, group, page_name="home"): username = request.user.username # get available modules(wiki, etc) mods_available = get_available_mods_by_group(group.id) mods_enabled = get_enabled_mods_by_group(group.id) wiki_exists = True try: content, repo, dirent = get_group_wiki_page(username, group, page_name) except WikiDoesNotExist: wiki_exists = False group_repos = get_group_repos(group.id, username) group_repos = [r for r in group_repos if not r.encrypted] return render_to_response("group/group_wiki.html", { "group" : group, "is_staff": group.is_staff, "wiki_exists": wiki_exists, "mods_enabled": mods_enabled, "mods_available": mods_available, "group_repos": group_repos, }, context_instance=RequestContext(request)) except WikiPageMissing: '''create that page for user if he/she is a group member''' if not is_group_user(group.id, username): raise Http404 repo = get_group_wiki_repo(group, username) # No need to check whether repo is none, since repo is already created filename = page_name_to_file_name(clean_page_name(page_name)) if not post_empty_file(repo.id, "/", filename, username): return render_error(request, _("Failed to create wiki page. Please retry later.")) return HttpResponseRedirect(reverse('group_wiki', args=[group.id, page_name])) else: url_prefix = reverse('group_wiki', args=[group.id]) # fetch file modified time and modifier path = '/' + dirent.obj_name try: dirent = seafile_api.get_dirent_by_path(repo.id, path) if dirent: latest_contributor, last_modified = dirent.modifier, dirent.mtime else: latest_contributor, last_modified = None, 0 except SearpcError as e: logger.error(e) latest_contributor, last_modified = None, 0 repo_perm = seafile_api.check_repo_access_permission(repo.id, username) wiki_index_exists = True index_pagename = 'index' index_content = None try: index_content, index_repo, index_dirent = get_group_wiki_page(username, group, index_pagename) except (WikiDoesNotExist, WikiPageMissing) as e: wiki_index_exists = False return render_to_response("group/group_wiki.html", { "group" : group, "is_staff": group.is_staff, "wiki_exists": wiki_exists, "content": content, "page": os.path.splitext(dirent.obj_name)[0], "last_modified": last_modified, "latest_contributor": latest_contributor or _("Unknown"), "path": path, "repo_id": repo.id, "search_repo_id": repo.id, "search_wiki": True, "mods_enabled": mods_enabled, "mods_available": mods_available, "repo_perm": repo_perm, "wiki_index_exists": wiki_index_exists, "index_content": index_content, }, context_instance=RequestContext(request))
accessible_repos = [] for r in owned_repos: if not has_repo(accessible_repos, r) and not r.encrypted: r.has_subdir = check_has_subdir(r) accessible_repos.append(r) for r in shared_repos + public_repos: # For compatibility with diffrent fields names in Repo and # SharedRepo objects. r.id = r.repo_id r.name = r.repo_name r.desc = r.repo_desc if not has_repo(accessible_repos, r) and not r.encrypted: if seafile_api.check_repo_access_permission(r.id, username) == 'rw': r.has_subdir = check_has_subdir(r) accessible_repos.append(r) for r in groups_repos: if not has_repo(accessible_repos, r) and not r.encrypted : if seafile_api.check_repo_access_permission(r.id, username) == 'rw': r.has_subdir = check_has_subdir(r) accessible_repos.append(r) return accessible_repos def get_shared_groups_by_repo_and_user(repo_id, username): """Get all groups which this repo is shared. """ repo_shared_groups = seaserv.get_shared_groups_by_repo(repo_id)
def my_shared_and_group_repos(request): """Return html snippet of repos that shared to user and group repos. Arguments: - `request`: """ if not request.is_ajax(): raise Http404 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_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.sort(key=lambda x: x.group.group_name) for i, repo in enumerate(group_repos): if i == 0: repo.show_group_name = True else: 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)) return HttpResponse(json.dumps({"shared": shared_repos_html, "group": group_repos_html}), content_type=content_type)