def test_delete_if_login_user_is_repo_owner(self): self.login_as(self.admin) # admin user can not delete resp = self.client.delete(self.group_library_url) self.assertEqual(403, resp.status_code) group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 1 # add admin user to group ccnet_api.group_add_member(self.group_id, self.user_name, self.admin_name) # transfer repo to admin user library_url = reverse('api-v2.1-admin-library', args=[self.repo_id]) data = 'owner=%s' % self.admin_name resp = self.client.put(library_url, data, 'application/x-www-form-urlencoded') # admin user can delete resp = self.client.delete(self.group_library_url) self.assertEqual(200, resp.status_code) group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 0
def test_reshare_to_group_after_transfer_repo(self): # If new owner in group repo shared to, reshare to group # share user's repo to group with 'r' permission seafile_api.set_group_repo(self.user_repo_id, self.group_id, self.user_name, 'r') group_repos = seafile_api.get_repos_by_group(self.group_id) assert group_repos[0].permission == 'r' # add admin user to group ccnet_api.group_add_member(self.group_id, self.user_name, self.admin.username) self.login_as(self.user) url = reverse("api2-repo-owner", args=[self.user_repo_id]) data = 'owner=%s' % self.admin.email # transfer repo to admin resp = self.client.put(url, data, 'application/x-www-form-urlencoded') self.assertEqual(200, resp.status_code) group_repos = seafile_api.get_repos_by_group(self.group_id) assert group_repos[0].permission == 'r'
def test_delete_if_login_user_is_group_repo_admin(self): self.login_as(self.admin) # commont user can not delete resp = self.client.delete(self.group_library_url) self.assertEqual(403, resp.status_code) group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 1 # share library to group with `admin` permission ccnet_api.group_add_member(self.group_id, self.user_name, self.admin_name) ExtraGroupsSharePermission.objects.create_share_permission( self.repo_id, self.group_id, PERMISSION_ADMIN) # repo admin user(not group admin) can not delete resp = self.client.delete(self.group_library_url) self.assertEqual(403, resp.status_code) # repo admin user(also is group admin) can delete ccnet_api.group_set_admin(self.group_id, self.admin_name) resp = self.client.delete(self.group_library_url) self.assertEqual(200, resp.status_code) group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 0
def test_reshare_to_user_group_after_transfer_repo(self): tmp_user = '******' User.objects.create_user(tmp_user) # add admin user to group ccnet_api.group_add_member(self.group_id, self.user_name, self.admin.username) # share user's repo to tmp_user with 'rw' permission seafile_api.share_repo(self.user_repo_id, self.user.username, tmp_user, 'rw') # share user's repo to group with 'r' permission seafile_api.set_group_repo(self.user_repo_id, self.group_id, self.user_name, 'r') group_repos = seafile_api.get_repos_by_group(self.group_id) assert group_repos[0].permission == 'r' assert seafile_api.check_permission_by_path(self.user_repo_id, '/', tmp_user) == 'rw' self.login_as(self.user) url = reverse("api2-repo-owner", args=[self.user_repo_id]) data = 'owner=%s' % self.admin.email # transfer repo to admin resp = self.client.put(url, data, 'application/x-www-form-urlencoded') self.assertEqual(200, resp.status_code) group_repos = seafile_api.get_repos_by_group(self.group_id) assert group_repos[0].permission == 'r' assert seafile_api.check_permission_by_path(self.user_repo_id, '/', tmp_user) == 'rw'
def test_share_repo_to_group(repo, group, permission): assert api.check_permission(repo.id, USER) == 'rw' assert api.check_permission(repo.id, USER2) is None repos = api.get_repos_by_group(group.id) assert len(repos) == 0 group_list = ccnet_api.get_groups(USER) assert len(group_list) == 1 group_list = ccnet_api.get_groups(USER2) assert len(group_list) == 0 api.group_share_repo(repo.id, group.id, USER, permission) repos = api.get_repos_by_group(group.id) assert_repo_with_permission(repo, repos, permission) ccnet_api.group_add_member(group.id, USER, USER2) group_list = ccnet_api.get_groups(USER2) assert len(group_list) == 1 group = group_list[0] assert group.id == group.id repos2 = api.get_repos_by_group(group.id) assert_repo_with_permission(repo, repos2, permission) assert api.check_permission(repo.id, USER2) == permission api.group_unshare_repo(repo.id, group.id, USER) repos = api.get_repos_by_group(group.id) assert len(repos) == 0 assert api.check_permission(repo.id, USER2) is None
def test_can_not_unshare_if_not_admin(self): # make sure repo is shared to group repos = seafile_api.get_repos_by_group(self.group_id) assert len(repos) == 1 self.login_as(self.user) url = reverse('api-v2.1-admin-group-library', args=[self.group_id, self.repo_id]) resp = self.client.delete(url) self.assertEqual(403, resp.status_code) # make sure repo is unshared repos = seafile_api.get_repos_by_group(self.group_id) assert len(repos) == 1
def get(self, request, group_id, format=None): """ List all group repos Permission checking: 1. only admin can perform this action. """ if not request.user.admin_permissions.can_manage_group(): return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.') group_id = int(group_id) group = ccnet_api.get_group(group_id) if not group: error_msg = 'Group %d not found.' % group_id return api_error(status.HTTP_404_NOT_FOUND, error_msg) if is_org_context(request): org_id = request.user.org.org_id repos = seafile_api.get_org_group_repos(org_id, group_id) else: repos = seafile_api.get_repos_by_group(group_id) group_repos_info = [] for repo in repos: repo_info = get_group_repo_info(repo) group_repos_info.append(repo_info) group_libraries = { 'group_id': group_id, 'group_name': group.group_name, 'libraries': group_repos_info } return Response(group_libraries)
def get(self, request, group_id): """ Get all group libraries. Permission checking: 1. is group member; """ # only group member can get group libraries if not is_group_member(group_id, request.user.username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) if is_org_context(request): org_id = request.user.org.org_id group_repos = seafile_api.get_org_group_repos(org_id, group_id) else: group_repos = seafile_api.get_repos_by_group(group_id) group_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified)) result = [] for repo in group_repos: group_repo_info = get_group_repo_info(request, repo) result.append(group_repo_info) return Response(result)
def get(self, request): """ List all groups. """ org_id = None username = request.user.username if is_org_context(request): org_id = request.user.org.org_id user_groups = seaserv.get_org_groups_by_user(org_id, username) else: user_groups = seaserv.get_personal_groups_by_user(username) try: avatar_size = int( request.GET.get('avatar_size', GROUP_AVATAR_DEFAULT_SIZE)) except ValueError: avatar_size = GROUP_AVATAR_DEFAULT_SIZE try: with_repos = int(request.GET.get('with_repos', 0)) except ValueError: with_repos = 0 if with_repos not in (0, 1): error_msg = 'with_repos invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) groups = [] for g in user_groups: group_info = get_group_info(request, g.id, avatar_size) if with_repos: if org_id: group_repos = seafile_api.get_org_group_repos(org_id, g.id) else: group_repos = seafile_api.get_repos_by_group(g.id) repos = [] for r in group_repos: repo = { "id": r.id, "name": r.name, "size": r.size, "size_formatted": filesizeformat(r.size), "mtime": r.last_modified, "mtime_relative": translate_seahub_time(r.last_modified), "encrypted": r.encrypted, "permission": r.permission, "owner": r.user, "owner_name": email2nickname(r.user), } repos.append(repo) group_info['repos'] = repos groups.append(group_info) return Response(groups)
def get(self, request): """ List all groups. """ org_id = None username = request.user.username if is_org_context(request): org_id = request.user.org.org_id user_groups = seaserv.get_org_groups_by_user(org_id, username) else: user_groups = seaserv.get_personal_groups_by_user(username) try: size = int(request.GET.get('avatar_size', GROUP_AVATAR_DEFAULT_SIZE)) except ValueError: size = GROUP_AVATAR_DEFAULT_SIZE try: with_repos = int(request.GET.get('with_repos', 0)) except ValueError: with_repos = 0 if with_repos not in (0, 1): error_msg = _(u'Argument can only be 0 or 1') return api_error(status.HTTP_400_BAD_REQUEST, error_msg) groups = [] for g in user_groups: group_info = get_group_info(request, g.id , size) if with_repos: if org_id: group_repos = seafile_api.get_org_group_repos(org_id, g.id) else: group_repos = seafile_api.get_repos_by_group(g.id) repos = [] for r in group_repos: repo = { "id": r.id, "name": r.name, "desc": r.desc, "size": r.size, "size_formatted": filesizeformat(r.size), "mtime": r.last_modified, "mtime_relative": translate_seahub_time(r.last_modified), "encrypted": r.encrypted, "permission": r.permission, "owner": r.user, "owner_nickname": email2nickname(r.user), "share_from_me": True if username == r.user else False, } repos.append(repo) group_info['repos'] = repos groups.append(group_info) return Response(groups)
def test_can_create(self): group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 0 self.login_as(self.user) repo_name = randstring(6) resp = self.client.post(self.group_libraries_url, {'repo_name': repo_name}) self.assertEqual(200, resp.status_code) json_resp = json.loads(resp.content) assert json_resp['repo_name'] == repo_name group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 1
def test_can_clean_department_repo_trash(self): if not LOCAL_PRO_DEV_ENV: return # create a department group_id = ccnet_api.create_group('department_test', 'system admin', parent_group_id=-1) seafile_api.set_group_quota(group_id, -2) repo_id = seafile_api.add_group_owned_repo(group_id, 'dep_test', 'rw') repo_owner = seafile_api.get_repo_owner(repo_id) assert '@seafile_group' in repo_owner group_repos = seafile_api.get_repos_by_group(group_id) assert len(group_repos) == 1 group = ccnet_api.get_group(group_id) # department add user ccnet_api.group_add_member(group_id, group.creator_name, self.user_name) ccnet_api.group_add_member(group_id, group.creator_name, self.tmp_user.username) ccnet_api.group_set_admin(group_id, self.user_name) ccnet_api.group_unset_admin(group_id, self.tmp_user.username) assert is_group_admin(group_id, self.user_name) assert not is_group_admin(group_id, self.tmp_user.username) file_name = 'dep_test.txt' self.create_file(repo_id=repo_id, parent_dir='/', filename=file_name, username=self.user_name) # delete a file first seafile_api.del_file(repo_id, '/', file_name, self.user_name) # get trash item count self.login_as(self.user) resp = self.client.get(reverse('api-v2.1-repo-trash', args=[repo_id])) json_resp = json.loads(resp.content) assert len(json_resp['data']) > 0 # department member can not clean trash self.logout() self.login_as(self.tmp_user) resp = self.client.delete(self.url) self.assertEqual(403, resp.status_code) # department admin can clean library trash self.logout() self.login_as(self.user) ccnet_api.group_set_admin(group_id, self.user_name) resp = self.client.delete(self.url) self.assertEqual(200, resp.status_code) # get trash item count again resp = self.client.get(self.url) json_resp = json.loads(resp.content) assert len(json_resp['data']) == 0
def test_can_delete(self): self.login_as(self.user) resp = self.client.delete(self.group_library_url) self.assertEqual(200, resp.status_code) group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 0
def test_can_create_with_perms(self): group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 0 self.login_as(self.user) for perm in [PERMISSION_PREVIEW, PERMISSION_PREVIEW_EDIT]: repo_name = randstring(6) resp = self.client.post(self.group_libraries_url, { 'repo_name': repo_name, 'permission': perm }) self.assertEqual(200, resp.status_code) json_resp = json.loads(resp.content) assert json_resp['repo_name'] == repo_name assert json_resp['permission'] == perm group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 2
def test_delete_if_login_user_is_group_staff(self): self.login_as(self.admin) # admin user can not delete resp = self.client.delete(self.group_library_url) self.assertEqual(403, resp.status_code) group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 1 # set admin user as group staff ccnet_api.group_add_member(self.group_id, self.user_name, self.admin_name) ccnet_api.group_set_admin(self.group_id, self.admin_name) # admin user can delete resp = self.client.delete(self.group_library_url) self.assertEqual(200, resp.status_code) group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 0
def test_not_reshare_to_group_after_transfer_repo(self): # If new owner NOT in group repo shared to, NOT reshare to group # share user's repo to group with 'r' permission seafile_api.set_group_repo(self.user_repo_id, self.group_id, self.user_name, 'r') group_repos = seafile_api.get_repos_by_group(self.group_id) assert group_repos[0].permission == 'r' self.login_as(self.user) url = reverse("api2-repo-owner", args=[self.user_repo_id]) data = 'owner=%s' % self.admin.email # transfer repo to admin resp = self.client.put(url, data, 'application/x-www-form-urlencoded') self.assertEqual(200, resp.status_code) group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 0
def setUp(self): self.repo_id = self.repo.id self.repo_name = self.repo.name self.group_id = self.group.id self.user_name = self.user.username self.admin_name = self.admin.username self.group_library_url = reverse('api-v2.1-group-library', args=[self.group_id, self.repo_id]) seafile_api.set_group_repo(self.repo_id, self.group_id, self.user_name, 'rw') group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 1
def test_can_get(self): # share repo to group seafile_api.set_group_repo(self.repo_id, self.group_id, self.user_name, 'rw') group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 1 self.login_as(self.user) resp = self.client.get(self.group_libraries_url) self.assertEqual(200, resp.status_code) json_resp = json.loads(resp.content) assert json_resp[0]['repo_name'] == self.repo_name assert json_resp[0]['repo_id'] == self.repo_id
def test_can_set_department_repo(self): if not LOCAL_PRO_DEV_ENV: return # create a department group_id = ccnet_api.create_group('department_test', 'system admin', parent_group_id=-1) seafile_api.set_group_quota(group_id, -2) repo_id = seafile_api.add_group_owned_repo(group_id, 'dep_test', 'rw') repo_owner = seafile_api.get_repo_owner(repo_id) assert '@seafile_group' in repo_owner group_repos = seafile_api.get_repos_by_group(group_id) assert len(group_repos) == 1 group = ccnet_api.get_group(group_id) # department add user ccnet_api.group_add_member(group_id, group.creator_name, self.user.username) ccnet_api.group_add_member(group_id, group.creator_name, self.tmp_user.username) ccnet_api.group_set_admin(group_id, self.user.username) ccnet_api.group_unset_admin(group_id, self.tmp_user.username) assert is_group_admin(group_id, self.user.username) assert not is_group_admin(group_id, self.tmp_user.username) url = reverse("api2-repo-history-limit", args=[repo_id]) self.config.ENABLE_REPO_HISTORY_SETTING = True # department member can not set self.logout() self.login_as(self.tmp_user) data = 'keep_days=%s' % 6 resp = self.client.put(url, data, 'application/x-www-form-urlencoded') self.assertEqual(403, resp.status_code) # department admin can set self.logout() self.login_as(self.user) data = 'keep_days=%s' % 6 resp = self.client.put(url, data, 'application/x-www-form-urlencoded') self.assertEqual(200, resp.status_code) self.remove_group(group_id) self.remove_repo(repo_id)
def test_create_with_login_user_is_group_member(self): ccnet_api.group_add_member(self.group_id, self.user_name, self.admin_name) self.login_as(self.admin) repo_name = randstring(6) resp = self.client.post(self.group_libraries_url, { 'repo_name': repo_name }) self.assertEqual(200, resp.status_code) json_resp = json.loads(resp.content) assert json_resp['repo_name'] == repo_name group_repos = seafile_api.get_repos_by_group(self.group_id) assert len(group_repos) == 1
def test_get_group_repos(repo, group): repo = api.get_repo(repo.id) api.group_share_repo(repo.id, group.id, USER, 'rw') repos = api.get_repos_by_group(group.id) assert_group_repos_attr(repo, repos[0]) repos = api.get_group_repos_by_owner(USER) assert_group_repos_attr(repo, repos[0]) v_repo_id = api.share_subdir_to_group(repo.id, '/dir1', USER, group.id, 'rw') v_repo = api.get_repo(v_repo_id) v_repo_to_test = api.get_group_shared_repo_by_path(repo.id, '/dir1', group.id) assert_group_repos_attr(v_repo, v_repo_to_test) api.unshare_subdir_for_group(repo.id, '/dir1', USER, group.id) repos = api.get_group_repos_by_user(USER) assert_group_repos_attr(repo, repos[0]) assert api.group_unshare_repo(repo.id, group.id, USER) == 0
def get_unenc_group_repos(request, group_id): ''' Get unenc repos in a group. Used in selecting a library for a group wiki ''' content_type = 'application/json; charset=utf-8' group_id_int = int(group_id) group = get_group(group_id_int) if not group: err_msg = _(u"The group doesn't exist") return HttpResponse(json.dumps({"error": err_msg}), status=400, content_type=content_type) joined = is_group_user(group_id_int, request.user.username) if not joined and not request.user.is_staff: err_msg = _(u"Permission denied") return HttpResponse(json.dumps({"error": err_msg}), status=403, content_type=content_type) repo_list = [] if is_org_context(request): org_id = request.user.org.org_id repos = seafile_api.get_org_group_repos(org_id, group_id_int) for repo in repos: if not repo.encrypted: repo_list.append({"name": repo.repo_name, "id": repo.repo_id}) else: repos = seafile_api.get_repos_by_group(group_id_int) for repo in repos: if not repo.encrypted: repo_list.append({"name": repo.name, "id": repo.id}) repo_list.sort(lambda x, y : cmp(x['name'].lower(), y['name'].lower())) return HttpResponse(json.dumps(repo_list), content_type=content_type)
def get(self, request, group_id): """ Get all group libraries. Permission checking: 1. is group member; """ # only group member can get group libraries if not is_group_member(group_id, request.user.username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) if is_org_context(request): org_id = request.user.org.org_id group_repos = seafile_api.get_org_group_repos(org_id, group_id) else: group_repos = seafile_api.get_repos_by_group(group_id) group_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified)) # get repo id owner dict all_repo_owner = [] repo_id_owner_dict = {} for repo in group_repos: repo_id = repo.id if repo_id not in repo_id_owner_dict: repo_owner = get_repo_owner(request, repo_id) all_repo_owner.append(repo_owner) repo_id_owner_dict[repo_id] = repo_owner all_modifier = [r.last_modifier for r in group_repos] # Use dict to reduce memcache fetch cost in large for-loop. name_dict = {} contact_email_dict = {} for email in set(all_repo_owner + all_modifier): if email not in name_dict: if '@seafile_group' in email: group_id = get_group_id_by_repo_owner(email) group_name = group_id_to_name(group_id) name_dict[email] = group_name else: name_dict[email] = email2nickname(email) if email not in contact_email_dict: if '@seafile_group' in email: contact_email_dict[email] = '' else: contact_email_dict[email] = email2contact_email(email) result = [] for group_repo in group_repos: group_repo_info = get_group_repo_info(request, group_repo) repo_owner = repo_id_owner_dict[group_repo.id] group_repo_info['owner_email'] = repo_owner group_repo_info['owner_name'] = name_dict.get(repo_owner, '') group_repo_info['owner_contact_email'] = contact_email_dict.get( repo_owner, '') modifier = group_repo.last_modifier group_repo_info['modifier_email'] = modifier group_repo_info['modifier_name'] = name_dict.get(modifier, '') group_repo_info['modifier_contact_email'] = contact_email_dict.get( modifier, '') result.append(group_repo_info) return Response(result)
def get(self, request, group_id): """ Get all group libraries. Permission checking: 1. is group member; """ # only group member can get group libraries username = request.user.username if not is_group_member(group_id, request.user.username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) if is_org_context(request): org_id = request.user.org.org_id group_repos = seafile_api.get_org_group_repos(org_id, group_id) else: group_repos = seafile_api.get_repos_by_group(group_id) group_repos.sort(key=lambda x: x.last_modified, reverse=True) try: current_page = int(request.GET.get('page', '1')) per_page = int(request.GET.get('per_page', '100')) except ValueError: current_page = 1 per_page = 100 start = (current_page - 1) * per_page group_repos = group_repos[start:start + per_page] # get repo id owner dict all_repo_owner = [] repo_id_owner_dict = {} for repo in group_repos: repo_id = repo.id if repo_id not in repo_id_owner_dict: repo_owner = get_repo_owner(request, repo_id) all_repo_owner.append(repo_owner) repo_id_owner_dict[repo_id] = repo_owner all_modifier = [r.last_modifier for r in group_repos] # Use dict to reduce memcache fetch cost in large for-loop. name_dict = {} contact_email_dict = {} for email in set(all_repo_owner + all_modifier): if email not in name_dict: if '@seafile_group' in email: group_id = get_group_id_by_repo_owner(email) group_name = group_id_to_name(group_id) name_dict[email] = group_name else: name_dict[email] = email2nickname(email) if email not in contact_email_dict: if '@seafile_group' in email: contact_email_dict[email] = '' else: contact_email_dict[email] = email2contact_email(email) try: starred_repos = UserStarredFiles.objects.get_starred_repos_by_user( username) starred_repo_id_list = [item.repo_id for item in starred_repos] except Exception as e: logger.error(e) starred_repo_id_list = [] result = [] for group_repo in group_repos: group_repo_info = get_group_repo_info(request, group_repo) repo_owner = repo_id_owner_dict[group_repo.id] group_repo_info['owner_email'] = repo_owner group_repo_info['owner_name'] = name_dict.get(repo_owner, '') group_repo_info['owner_contact_email'] = contact_email_dict.get( repo_owner, '') modifier = group_repo.last_modifier group_repo_info['modifier_email'] = modifier group_repo_info['modifier_name'] = name_dict.get(modifier, '') group_repo_info['modifier_contact_email'] = contact_email_dict.get( modifier, '') group_repo_info['starred'] = group_repo.id in starred_repo_id_list result.append(group_repo_info) return Response(result)
def get(self, request): """ List all groups. """ org_id = None username = request.user.username if is_org_context(request): org_id = request.user.org.org_id user_groups = seaserv.get_org_groups_by_user(org_id, username) else: user_groups = ccnet_api.get_groups(username, return_ancestors=True) try: avatar_size = int(request.GET.get('avatar_size', GROUP_AVATAR_DEFAULT_SIZE)) except ValueError: avatar_size = GROUP_AVATAR_DEFAULT_SIZE try: with_repos = int(request.GET.get('with_repos', 0)) except ValueError: with_repos = 0 if with_repos not in (0, 1): error_msg = 'with_repos invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) groups = [] if with_repos: gids = [g.id for g in user_groups] admin_info = ExtraGroupsSharePermission.objects.batch_get_repos_with_admin_permission(gids) try: starred_repos = UserStarredFiles.objects.get_starred_repos_by_user(username) starred_repo_id_list = [item.repo_id for item in starred_repos] except Exception as e: logger.error(e) starred_repo_id_list = [] for g in user_groups: group_info = get_group_info(request, g.id, avatar_size) if with_repos: if org_id: group_repos = seafile_api.get_org_group_repos(org_id, g.id) else: group_repos = seafile_api.get_repos_by_group(g.id) repos = [] # get repo id owner dict all_repo_owner = [] repo_id_owner_dict = {} for repo in group_repos: repo_id = repo.id if repo_id not in repo_id_owner_dict: repo_owner = get_repo_owner(request, repo_id) all_repo_owner.append(repo_owner) repo_id_owner_dict[repo_id] = repo_owner # Use dict to reduce memcache fetch cost in large for-loop. name_dict = {} contact_email_dict = {} for email in all_repo_owner: if email not in name_dict: if '@seafile_group' in email: group_id = get_group_id_by_repo_owner(email) group_name= group_id_to_name(group_id) name_dict[email] = group_name else: name_dict[email] = email2nickname(email) if email not in contact_email_dict: if '@seafile_group' in email: contact_email_dict[email] = '' else: contact_email_dict[email] = email2contact_email(email) for r in group_repos: repo_owner = repo_id_owner_dict.get(r.id, r.user) repo = { "id": r.id, "repo_id": r.id, "name": r.name, "repo_name": r.name, "size": r.size, "size_formatted": filesizeformat(r.size), "mtime": r.last_modified, "mtime_relative": translate_seahub_time(r.last_modified), "last_modified": timestamp_to_isoformat_timestr(r.last_modified), "encrypted": r.encrypted, "permission": r.permission, "owner": repo_owner, "owner_email": repo_owner, "owner_name": name_dict.get(repo_owner, ''), "owner_contact_email": contact_email_dict.get(repo_owner, ''), "is_admin": (r.id, g.id) in admin_info, "starred": r.repo_id in starred_repo_id_list, } repos.append(repo) group_info['repos'] = repos groups.append(group_info) return Response(groups)
def get(self, request, group_id): """ Get all group libraries. Permission checking: 1. is group member; """ # only group member can get group libraries username = request.user.username if not is_group_member(group_id, request.user.username): error_msg = 'Permission denied.' return api_error(status.HTTP_403_FORBIDDEN, error_msg) if is_org_context(request): org_id = request.user.org.org_id group_repos = seafile_api.get_org_group_repos(org_id, group_id) else: group_repos = seafile_api.get_repos_by_group(group_id) group_repos.sort(lambda x, y: cmp(y.last_modified, x.last_modified)) # get repo id owner dict all_repo_owner = [] repo_id_owner_dict = {} for repo in group_repos: repo_id = repo.id if repo_id not in repo_id_owner_dict: repo_owner = get_repo_owner(request, repo_id) all_repo_owner.append(repo_owner) repo_id_owner_dict[repo_id] = repo_owner all_modifier = [r.last_modifier for r in group_repos] # Use dict to reduce memcache fetch cost in large for-loop. name_dict = {} contact_email_dict = {} for email in set(all_repo_owner + all_modifier): if email not in name_dict: if '@seafile_group' in email: group_id = get_group_id_by_repo_owner(email) group_name= group_id_to_name(group_id) name_dict[email] = group_name else: name_dict[email] = email2nickname(email) if email not in contact_email_dict: if '@seafile_group' in email: contact_email_dict[email] = '' else: contact_email_dict[email] = email2contact_email(email) try: starred_repos = UserStarredFiles.objects.get_starred_repos_by_user(username) starred_repo_id_list = [item.repo_id for item in starred_repos] except Exception as e: logger.error(e) starred_repo_id_list = [] result = [] for group_repo in group_repos: group_repo_info = get_group_repo_info(request, group_repo) repo_owner = repo_id_owner_dict[group_repo.id] group_repo_info['owner_email'] = repo_owner group_repo_info['owner_name'] = name_dict.get(repo_owner, '') group_repo_info['owner_contact_email'] = contact_email_dict.get(repo_owner, '') modifier = group_repo.last_modifier group_repo_info['modifier_email'] = modifier group_repo_info['modifier_name'] = name_dict.get(modifier, '') group_repo_info['modifier_contact_email'] = contact_email_dict.get(modifier, '') group_repo_info['starred'] = group_repo.id in starred_repo_id_list result.append(group_repo_info) return Response(result)
def test_share_repo_to_group(repo, group, permission): assert api.check_permission(repo.id, USER) == 'rw' assert api.check_permission(repo.id, USER2) is None repos = api.get_repos_by_group(group.id) assert len(repos) == 0 group_list = ccnet_api.get_groups(USER) assert len(group_list) == 1 group_list = ccnet_api.get_groups(USER2) assert len(group_list) == 0 api.group_share_repo(repo.id, group.id, USER, permission) repos = api.get_repos_by_group(group.id) assert_repo_with_permission(repo, repos, permission) group_ids = api.get_shared_group_ids_by_repo(repo.id) assert group_ids[0] == str(group.id) group_list = api.list_repo_shared_group_by_user(USER, repo.id) assert len(group_list) == 1 group_list = api.list_repo_shared_group_by_user(USER2, repo.id) assert len(group_list) == 0 repo_get = api.get_group_shared_repo_by_path(repo.id, None, group.id) assert repo_get and repo_get.repo_id == repo.id ccnet_api.group_add_member(group.id, USER, USER2) group_list = ccnet_api.get_groups(USER2) assert len(group_list) == 1 group = group_list[0] assert group.id == group.id repos2 = api.get_repos_by_group(group.id) assert_repo_with_permission(repo, repos2, permission) assert api.check_permission(repo.id, USER2) == permission repos = api.get_group_repos_by_user(USER) assert len(repos) == 1 repoids = api.get_group_repoids(group.id) assert len(repoids) == 1 repos = api.get_group_repos_by_owner(USER) assert len(repos) == 1 api.remove_group_repos_by_owner(group.id, USER) repos = api.get_group_repos_by_owner(USER) assert len(repos) == 0 api.set_group_repo(repo.id, group.id, USER, permission) repos = api.get_repos_by_group(group.id) assert len(repos) == 1 api.remove_group_repos(group.id) repos = api.get_repos_by_group(group.id) assert len(repos) == 0 api.group_unshare_repo(repo.id, group.id, USER) repos = api.get_repos_by_group(group.id) assert len(repos) == 0 assert api.check_permission(repo.id, USER2) is None
def get(self, request): """ List all groups. """ org_id = None username = request.user.username if is_org_context(request): org_id = request.user.org.org_id user_groups = seaserv.get_org_groups_by_user(org_id, username) else: user_groups = ccnet_api.get_groups(username, return_ancestors=True) try: avatar_size = int(request.GET.get('avatar_size', GROUP_AVATAR_DEFAULT_SIZE)) except ValueError: avatar_size = GROUP_AVATAR_DEFAULT_SIZE try: with_repos = int(request.GET.get('with_repos', 0)) except ValueError: with_repos = 0 if with_repos not in (0, 1): error_msg = 'with_repos invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) groups = [] if with_repos: gids = [g.id for g in user_groups] admin_info = ExtraGroupsSharePermission.objects.batch_get_repos_with_admin_permission(gids) for g in user_groups: group_info = get_group_info(request, g.id, avatar_size) if with_repos: if org_id: group_repos = seafile_api.get_org_group_repos(org_id, g.id) else: group_repos = seafile_api.get_repos_by_group(g.id) repos = [] # get repo id owner dict all_repo_owner = [] repo_id_owner_dict = {} for repo in group_repos: repo_id = repo.id if repo_id not in repo_id_owner_dict: repo_owner = get_repo_owner(request, repo_id) all_repo_owner.append(repo_owner) repo_id_owner_dict[repo_id] = repo_owner # Use dict to reduce memcache fetch cost in large for-loop. name_dict = {} contact_email_dict = {} for email in all_repo_owner: if email not in name_dict: if '@seafile_group' in email: group_id = get_group_id_by_repo_owner(email) group_name= group_id_to_name(group_id) name_dict[email] = group_name else: name_dict[email] = email2nickname(email) if email not in contact_email_dict: if '@seafile_group' in email: contact_email_dict[email] = '' else: contact_email_dict[email] = email2contact_email(email) for r in group_repos: repo_owner = repo_id_owner_dict.get(r.id, r.user) repo = { "id": r.id, "repo_id": r.id, "name": r.name, "repo_name": r.name, "size": r.size, "size_formatted": filesizeformat(r.size), "mtime": r.last_modified, "mtime_relative": translate_seahub_time(r.last_modified), "last_modified": timestamp_to_isoformat_timestr(r.last_modified), "encrypted": r.encrypted, "permission": r.permission, "owner": repo_owner, "owner_email": repo_owner, "owner_name": name_dict.get(repo_owner, ''), "owner_contact_email": contact_email_dict.get(repo_owner, ''), "is_admin": (r.id, g.id) in admin_info } repos.append(repo) group_info['repos'] = repos groups.append(group_info) return Response(groups)
def get(self, request): """ List all groups. """ org_id = None username = request.user.username if is_org_context(request): org_id = request.user.org.org_id user_groups = seaserv.get_org_groups_by_user(org_id, username) else: user_groups = seaserv.get_personal_groups_by_user(username) try: size = int(request.GET.get('avatar_size', GROUP_AVATAR_DEFAULT_SIZE)) except ValueError: size = GROUP_AVATAR_DEFAULT_SIZE with_repos = request.GET.get('with_repos') with_repos = True if with_repos == '1' else False groups = [] for g in user_groups: try: avatar_url, is_default, date_uploaded = api_grp_avatar_url(g.id, size) except Exception as e: logger.error(e) avatar_url = get_default_group_avatar_url() val = utc_to_local(dt(g.timestamp)) group = { "id": g.id, "name": g.group_name, "creator": g.creator_name, "created_at": val.strftime("%Y-%m-%dT%H:%M:%S") + DateFormat(val).format('O'), "avatar_url": request.build_absolute_uri(avatar_url), "admins": self._get_group_admins(g.id), } if with_repos: if org_id: group_repos = seafile_api.get_org_group_repos(org_id, g.id) else: group_repos = seafile_api.get_repos_by_group(g.id) repos = [] for r in group_repos: repo = { "id": r.id, "name": r.name, "desc": r.desc, "size": r.size, "size_formatted": filesizeformat(r.size), "mtime": r.last_modified, "mtime_relative": translate_seahub_time(r.last_modified), "encrypted": r.encrypted, "permission": r.permission, "owner": r.user, "owner_nickname": email2nickname(r.user), "share_from_me": True if username == r.user else False, } repos.append(repo) group['repos'] = repos groups.append(group) return Response(groups)