1
0
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:
zMingGit
2017-09-09 11:10:34 +08:00
committed by xiez
parent 0b973d854d
commit f9c16e95e1
6 changed files with 48 additions and 28 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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.')

View File

@@ -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()

View File

@@ -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

View File

@@ -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