diff --git a/seahub/api2/endpoints/dir_shared_items.py b/seahub/api2/endpoints/dir_shared_items.py index e9c1e27c2d..fdac143695 100644 --- a/seahub/api2/endpoints/dir_shared_items.py +++ b/seahub/api2/endpoints/dir_shared_items.py @@ -100,7 +100,7 @@ class DirSharedItemsEndpoint(APIView): path, repo_owner) ret = [] # change is_admin to True if user in admin groups. - admin_groups = ExtraGroupsSharePermission.objects.get_admin_groups(repo_id) + admin_groups = ExtraGroupsSharePermission.objects.get_admin_groups_by_repo(repo_id) for item in share_items: ret.append({ "share_type": "group", @@ -109,7 +109,7 @@ class DirSharedItemsEndpoint(APIView): "name": seaserv.get_group(item.group_id).group_name, }, "permission": item.perm, - "is_admin": str(item.group_id) in admin_groups, + "is_admin": item.group_id in admin_groups, }) return ret diff --git a/seahub/api2/endpoints/groups.py b/seahub/api2/endpoints/groups.py index 7419d04cdd..9b6a555de8 100644 --- a/seahub/api2/endpoints/groups.py +++ b/seahub/api2/endpoints/groups.py @@ -102,11 +102,13 @@ class Groups(APIView): error_msg = 'with_repos invalid.' return api_error(status.HTTP_400_BAD_REQUEST, error_msg) - all_group_admin_records = ExtraGroupsSharePermission.objects.get_all_admin_records() - all_group_admin_records = [(e.repo_id, e.group_id)for e in all_group_admin_records] 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) + group_info = get_group_info(request, g.id, avatar_size) if with_repos: if org_id: @@ -127,7 +129,7 @@ class Groups(APIView): "permission": r.permission, "owner": r.user, "owner_name": email2nickname(r.user), - "is_admin": (str(r.id), str(g.id)) in all_group_admin_records + "is_admin": (r.id, g.id) in admin_info } repos.append(repo) diff --git a/seahub/api2/views.py b/seahub/api2/views.py index 5e1cbf5d6a..1402027204 100644 --- a/seahub/api2/views.py +++ b/seahub/api2/views.py @@ -4019,7 +4019,7 @@ class GroupRepos(APIView): "modifier_email": r.last_modifier, "modifier_contact_email": contact_email_dict.get(r.last_modifier, ''), "modifier_name": nickname_dict.get(r.last_modifier, ''), - "is_admin": str(r.id) in admin_repos, + "is_admin": r.id in admin_repos, } repos_json.append(repo) @@ -4040,7 +4040,6 @@ class GroupRepo(APIView): group_id = group.id # only admin or owner can delete share record. - groups = [str(e.id) for e in get_groups_by_user(request)] repo_owner = get_repo_owner(request, repo_id) if not group.is_staff and repo_owner != username and not is_repo_admin(username, repo_id): return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.') diff --git a/seahub/share/models.py b/seahub/share/models.py index 99de2521d5..5b8ee8564e 100644 --- a/seahub/share/models.py +++ b/seahub/share/models.py @@ -192,7 +192,7 @@ class ExtraSharePermissionManager(models.Manager): e.g. in_datas: [(repo_id1, username1), (repo_id2, admin1)] - return: + admin permission data returnd: [(repo_id2, admin1)] """ if len(in_datas) <= 0: @@ -220,14 +220,6 @@ class ExtraSharePermissionManager(models.Manager): class ExtraGroupsSharePermissionManager(models.Manager): - def get_admin_groups(self, repo_id): - """ return admin groups in specific repo - e.g: ['23', '12'] - """ - return super(ExtraGroupsSharePermissionManager, self).filter( - repo_id=repo_id, permission='admin' - ).values_list('group_id', flat=True) - def get_repos_with_admin_permission(self, gid): """ return admin repo in specific group e.g: ['repo_id1', 'repo_id2'] @@ -236,10 +228,21 @@ class ExtraGroupsSharePermissionManager(models.Manager): group_id=gid, permission='admin' ).values_list('repo_id', flat=True) - def get_all_admin_records(self): + def get_admin_groups_by_repo(self, repo_id): + """ return admin groups in specific repo + e.g: ['23', '12'] + """ return super(ExtraGroupsSharePermissionManager, self).filter( - permission='admin' - ) + repo_id=repo_id, permission='admin' + ).values_list('group_id', flat=True) + + def batch_get_repos_with_admin_permission(self, gids): + """ + """ + if len(gids) <= 0: + return [] + db_data = super(ExtraGroupsSharePermissionManager, self).filter(group_id__in=gids, permission=PERMISSION_ADMIN) + return [(e.repo_id, e.group_id) for e in db_data] def create_share_permission(self, repo_id, gid, permission): self.model(repo_id=repo_id, group_id=gid, permission=permission).save() @@ -257,7 +260,7 @@ class ExtraGroupsSharePermissionManager(models.Manager): class ExtraGroupsSharePermission(models.Model): repo_id = models.CharField(max_length=36, db_index=True) - group_id = models.CharField(max_length=20, db_index=True) + group_id = models.IntegerField(db_index=True) permission = models.CharField(max_length=30) objects = ExtraGroupsSharePermissionManager() diff --git a/seahub/share/utils.py b/seahub/share/utils.py index 38fd829a7a..39a603d696 100644 --- a/seahub/share/utils.py +++ b/seahub/share/utils.py @@ -6,7 +6,7 @@ def is_repo_admin(username, repo_id): is_administrator = ExtraSharePermission.objects.\ get_user_permission(repo_id, username) == PERMISSION_ADMIN belong_to_admin_group = False - group_ids = ExtraGroupsSharePermission.objects.get_admin_groups(repo_id) + group_ids = ExtraGroupsSharePermission.objects.get_admin_groups_by_repo(repo_id) for group_id in group_ids: if is_group_member(group_id, username): belong_to_admin_group = True diff --git a/tests/seahub/share/models/test_extra_groups_share_permission.py b/tests/seahub/share/models/test_extra_groups_share_permission.py index f98bee1783..bb78df7f76 100644 --- a/tests/seahub/share/models/test_extra_groups_share_permission.py +++ b/tests/seahub/share/models/test_extra_groups_share_permission.py @@ -3,7 +3,6 @@ from seahub.test_utils import BaseTestCase from seaserv import seafile_api - class ExtraGroupsSharePermissionTest(BaseTestCase): def test_can_add(self): ExtraGroupsSharePermission.objects.create_share_permission(self.repo.id, @@ -11,14 +10,14 @@ class ExtraGroupsSharePermissionTest(BaseTestCase): 'admin') self.assertEqual(1, len(ExtraGroupsSharePermission.objects.all())) - def test_can_get_admin_groups(self): - res = ExtraGroupsSharePermission.objects.get_admin_groups(self.repo.id) + def test_can_get_admin_groups_by_repo(self): + res = ExtraGroupsSharePermission.objects.get_admin_groups_by_repo(self.repo.id) assert len(res) == 0 ExtraGroupsSharePermission.objects.create_share_permission(self.repo.id, self.group.id, 'admin') - res = ExtraGroupsSharePermission.objects.get_admin_groups(self.repo.id) - assert res[0] == str(self.group.id) + res = ExtraGroupsSharePermission.objects.get_admin_groups_by_repo(self.repo.id) + assert res[0] == self.group.id def test_can_get_repos_with_admin_permission(self): res = ExtraGroupsSharePermission.objects.get_repos_with_admin_permission(self.group.id) @@ -27,7 +26,7 @@ class ExtraGroupsSharePermissionTest(BaseTestCase): self.group.id, 'admin') res = ExtraGroupsSharePermission.objects.get_repos_with_admin_permission(self.group.id) - assert res[0] == str(self.repo.id) + assert res[0] == self.repo.id def test_can_delete(self): self.assertEqual(0, len(ExtraGroupsSharePermission.objects.all())) @@ -45,3 +44,20 @@ class ExtraGroupsSharePermissionTest(BaseTestCase): self.group.id, 'admin') self.assertEqual(1, len(ExtraGroupsSharePermission.objects.all())) + + def test_batch_get_repos_with_admin_permission(self): + r = seafile_api.get_repo(self.create_repo(name='repo2', + desc='', username=self.user.email, passwd=None)) + new_group = self.create_group(group_name='test_group', + username=self.user.username) + data = [self.group.id, new_group.id] + self.assertEqual([], ExtraGroupsSharePermission.objects.batch_get_repos_with_admin_permission(data)) + ExtraGroupsSharePermission.objects.create_share_permission(self.repo.id, + self.group.id, + 'admin') + ExtraGroupsSharePermission.objects.create_share_permission(self.repo.id, + new_group.id, + 'admin') + res = ExtraGroupsSharePermission.objects.batch_get_repos_with_admin_permission(data) + assert (self.repo.id, self.group.id) in res + assert (self.repo.id, new_group.id) in res