Change permissions to only load required by default

Permissions now load just the namespace and/or repository permissions requested, with a fallback to a full permissions load if necessary.
This commit is contained in:
Joseph Schorr 2016-03-16 16:08:53 -04:00
parent 685dd1a925
commit a3aa4592cf
3 changed files with 167 additions and 70 deletions

View file

@ -33,7 +33,7 @@ def list_organization_member_permissions(organization, limit_to_user=None):
return query
def get_all_user_permissions(user):
def get_all_user_repository_permissions(user):
return _get_user_repo_permissions(user)
@ -41,7 +41,12 @@ def get_user_repo_permissions(user, repo):
return _get_user_repo_permissions(user, limit_to_repository_obj=repo)
def _get_user_repo_permissions(user, limit_to_repository_obj=None):
def get_user_repository_permissions(user, namespace, repo_name):
return _get_user_repo_permissions(user, limit_namespace=namespace, limit_repo_name=repo_name)
def _get_user_repo_permissions(user, limit_to_repository_obj=None, limit_namespace=None,
limit_repo_name=None):
UserThroughTeam = User.alias()
base_query = (RepositoryPermission
@ -54,6 +59,9 @@ def _get_user_repo_permissions(user, limit_to_repository_obj=None):
if limit_to_repository_obj is not None:
base_query = base_query.where(RepositoryPermission.repository == limit_to_repository_obj)
elif limit_namespace and limit_repo_name:
base_query = base_query.where(Repository.name == limit_repo_name,
Namespace.username == limit_namespace)
direct = (base_query
.clone()
@ -121,12 +129,16 @@ def add_prototype_permission(org, role_name, activating_user,
delegate_user=delegate_user, delegate_team=delegate_team)
def get_org_wide_permissions(user):
def get_org_wide_permissions(user, org_filter=None):
Org = User.alias()
team_with_role = Team.select(Team, Org, TeamRole).join(TeamRole)
with_org = team_with_role.switch(Team).join(Org, on=(Team.organization ==
Org.id))
with_user = with_org.switch(Team).join(TeamMember).join(User)
if org_filter:
with_user.where(Org.username == org_filter)
return with_user.where(User.id == user, Org.organization == True)