mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-20 10:58:33 +00:00
performance, funciton name (#1795)
* performance, funciton name * middle * depend with_repos, modify test
This commit is contained in:
@@ -100,7 +100,7 @@ class DirSharedItemsEndpoint(APIView):
|
|||||||
path, repo_owner)
|
path, repo_owner)
|
||||||
ret = []
|
ret = []
|
||||||
# change is_admin to True if user in admin groups.
|
# 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:
|
for item in share_items:
|
||||||
ret.append({
|
ret.append({
|
||||||
"share_type": "group",
|
"share_type": "group",
|
||||||
@@ -109,7 +109,7 @@ class DirSharedItemsEndpoint(APIView):
|
|||||||
"name": seaserv.get_group(item.group_id).group_name,
|
"name": seaserv.get_group(item.group_id).group_name,
|
||||||
},
|
},
|
||||||
"permission": item.perm,
|
"permission": item.perm,
|
||||||
"is_admin": str(item.group_id) in admin_groups,
|
"is_admin": item.group_id in admin_groups,
|
||||||
})
|
})
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
@@ -102,11 +102,13 @@ class Groups(APIView):
|
|||||||
error_msg = 'with_repos invalid.'
|
error_msg = 'with_repos invalid.'
|
||||||
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
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 = []
|
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:
|
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 with_repos:
|
||||||
if org_id:
|
if org_id:
|
||||||
@@ -127,7 +129,7 @@ class Groups(APIView):
|
|||||||
"permission": r.permission,
|
"permission": r.permission,
|
||||||
"owner": r.user,
|
"owner": r.user,
|
||||||
"owner_name": email2nickname(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)
|
repos.append(repo)
|
||||||
|
|
||||||
|
@@ -4019,7 +4019,7 @@ class GroupRepos(APIView):
|
|||||||
"modifier_email": r.last_modifier,
|
"modifier_email": r.last_modifier,
|
||||||
"modifier_contact_email": contact_email_dict.get(r.last_modifier, ''),
|
"modifier_contact_email": contact_email_dict.get(r.last_modifier, ''),
|
||||||
"modifier_name": nickname_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)
|
repos_json.append(repo)
|
||||||
|
|
||||||
@@ -4040,7 +4040,6 @@ class GroupRepo(APIView):
|
|||||||
group_id = group.id
|
group_id = group.id
|
||||||
|
|
||||||
# only admin or owner can delete share record.
|
# 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)
|
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):
|
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.')
|
return api_error(status.HTTP_403_FORBIDDEN, 'Permission denied.')
|
||||||
|
@@ -192,7 +192,7 @@ class ExtraSharePermissionManager(models.Manager):
|
|||||||
e.g.
|
e.g.
|
||||||
in_datas:
|
in_datas:
|
||||||
[(repo_id1, username1), (repo_id2, admin1)]
|
[(repo_id1, username1), (repo_id2, admin1)]
|
||||||
return:
|
admin permission data returnd:
|
||||||
[(repo_id2, admin1)]
|
[(repo_id2, admin1)]
|
||||||
"""
|
"""
|
||||||
if len(in_datas) <= 0:
|
if len(in_datas) <= 0:
|
||||||
@@ -220,14 +220,6 @@ class ExtraSharePermissionManager(models.Manager):
|
|||||||
|
|
||||||
|
|
||||||
class ExtraGroupsSharePermissionManager(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):
|
def get_repos_with_admin_permission(self, gid):
|
||||||
""" return admin repo in specific group
|
""" return admin repo in specific group
|
||||||
e.g: ['repo_id1', 'repo_id2']
|
e.g: ['repo_id1', 'repo_id2']
|
||||||
@@ -236,10 +228,21 @@ class ExtraGroupsSharePermissionManager(models.Manager):
|
|||||||
group_id=gid, permission='admin'
|
group_id=gid, permission='admin'
|
||||||
).values_list('repo_id', flat=True)
|
).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(
|
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):
|
def create_share_permission(self, repo_id, gid, permission):
|
||||||
self.model(repo_id=repo_id, group_id=gid, permission=permission).save()
|
self.model(repo_id=repo_id, group_id=gid, permission=permission).save()
|
||||||
@@ -257,7 +260,7 @@ class ExtraGroupsSharePermissionManager(models.Manager):
|
|||||||
|
|
||||||
class ExtraGroupsSharePermission(models.Model):
|
class ExtraGroupsSharePermission(models.Model):
|
||||||
repo_id = models.CharField(max_length=36, db_index=True)
|
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)
|
permission = models.CharField(max_length=30)
|
||||||
objects = ExtraGroupsSharePermissionManager()
|
objects = ExtraGroupsSharePermissionManager()
|
||||||
|
|
||||||
|
@@ -6,7 +6,7 @@ def is_repo_admin(username, repo_id):
|
|||||||
is_administrator = ExtraSharePermission.objects.\
|
is_administrator = ExtraSharePermission.objects.\
|
||||||
get_user_permission(repo_id, username) == PERMISSION_ADMIN
|
get_user_permission(repo_id, username) == PERMISSION_ADMIN
|
||||||
belong_to_admin_group = False
|
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:
|
for group_id in group_ids:
|
||||||
if is_group_member(group_id, username):
|
if is_group_member(group_id, username):
|
||||||
belong_to_admin_group = True
|
belong_to_admin_group = True
|
||||||
|
@@ -3,7 +3,6 @@ from seahub.test_utils import BaseTestCase
|
|||||||
|
|
||||||
from seaserv import seafile_api
|
from seaserv import seafile_api
|
||||||
|
|
||||||
|
|
||||||
class ExtraGroupsSharePermissionTest(BaseTestCase):
|
class ExtraGroupsSharePermissionTest(BaseTestCase):
|
||||||
def test_can_add(self):
|
def test_can_add(self):
|
||||||
ExtraGroupsSharePermission.objects.create_share_permission(self.repo.id,
|
ExtraGroupsSharePermission.objects.create_share_permission(self.repo.id,
|
||||||
@@ -11,14 +10,14 @@ class ExtraGroupsSharePermissionTest(BaseTestCase):
|
|||||||
'admin')
|
'admin')
|
||||||
self.assertEqual(1, len(ExtraGroupsSharePermission.objects.all()))
|
self.assertEqual(1, len(ExtraGroupsSharePermission.objects.all()))
|
||||||
|
|
||||||
def test_can_get_admin_groups(self):
|
def test_can_get_admin_groups_by_repo(self):
|
||||||
res = ExtraGroupsSharePermission.objects.get_admin_groups(self.repo.id)
|
res = ExtraGroupsSharePermission.objects.get_admin_groups_by_repo(self.repo.id)
|
||||||
assert len(res) == 0
|
assert len(res) == 0
|
||||||
ExtraGroupsSharePermission.objects.create_share_permission(self.repo.id,
|
ExtraGroupsSharePermission.objects.create_share_permission(self.repo.id,
|
||||||
self.group.id,
|
self.group.id,
|
||||||
'admin')
|
'admin')
|
||||||
res = ExtraGroupsSharePermission.objects.get_admin_groups(self.repo.id)
|
res = ExtraGroupsSharePermission.objects.get_admin_groups_by_repo(self.repo.id)
|
||||||
assert res[0] == str(self.group.id)
|
assert res[0] == self.group.id
|
||||||
|
|
||||||
def test_can_get_repos_with_admin_permission(self):
|
def test_can_get_repos_with_admin_permission(self):
|
||||||
res = ExtraGroupsSharePermission.objects.get_repos_with_admin_permission(self.group.id)
|
res = ExtraGroupsSharePermission.objects.get_repos_with_admin_permission(self.group.id)
|
||||||
@@ -27,7 +26,7 @@ class ExtraGroupsSharePermissionTest(BaseTestCase):
|
|||||||
self.group.id,
|
self.group.id,
|
||||||
'admin')
|
'admin')
|
||||||
res = ExtraGroupsSharePermission.objects.get_repos_with_admin_permission(self.group.id)
|
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):
|
def test_can_delete(self):
|
||||||
self.assertEqual(0, len(ExtraGroupsSharePermission.objects.all()))
|
self.assertEqual(0, len(ExtraGroupsSharePermission.objects.all()))
|
||||||
@@ -45,3 +44,20 @@ class ExtraGroupsSharePermissionTest(BaseTestCase):
|
|||||||
self.group.id,
|
self.group.id,
|
||||||
'admin')
|
'admin')
|
||||||
self.assertEqual(1, len(ExtraGroupsSharePermission.objects.all()))
|
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
|
||||||
|
Reference in New Issue
Block a user