diff --git a/models/organization/org.go b/models/organization/org.go index b4d28f5405..e60de91691 100644 --- a/models/organization/org.go +++ b/models/organization/org.go @@ -596,3 +596,27 @@ func getUserTeamIDsQueryBuilder(orgID, userID int64) *builder.Builder { "team_user.uid": userID, }) } + +// CanUserSeeAllTeams returns true if user can see all teams in organization +func (org *Organization) CanUserSeeAllTeams(ctx context.Context, userID int64) (bool, error) { + isOwner, err := org.IsOwnedBy(ctx, userID) + if err != nil { + return false, err + } + if isOwner { + return true, nil + } + + teams, err := org.GetUserTeams(ctx, userID) + if err != nil { + return false, err + } + + for _, team := range teams { + if team.IncludesAllRepositories && team.HasAdminAccess() { + return true, nil + } + } + + return false, nil +} diff --git a/routers/web/org/teams.go b/routers/web/org/teams.go index d72484d728..6330c1b180 100644 --- a/routers/web/org/teams.go +++ b/routers/web/org/teams.go @@ -67,7 +67,13 @@ func Teams(ctx *context.Context) { }, } - if !ctx.Org.IsOwner { + + canSeeAllTeams, err := ctx.Org.Organization.CanUserSeeAllTeams(ctx, ctx.Doer.ID) + if err != nil { + ctx.ServerError("CanUserSeeAllTeams", err) + return + } + if !canSeeAllTeams { opts.UserID = ctx.Doer.ID } diff --git a/services/context/org.go b/services/context/org.go index 4c64ff72a9..78e6b1c3e0 100644 --- a/services/context/org.go +++ b/services/context/org.go @@ -171,24 +171,15 @@ func OrgAssignment(orgAssignmentOpts OrgAssignmentOptions) func(ctx *Context) { return } + // Team. if ctx.Org.IsMember { - shouldSeeAllTeams := false - if ctx.Org.IsOwner { - shouldSeeAllTeams = true - } else { - teams, err := org.GetUserTeams(ctx, ctx.Doer.ID) - if err != nil { - ctx.ServerError("GetUserTeams", err) - return - } - for _, team := range teams { - if team.IncludesAllRepositories && team.HasAdminAccess() { - shouldSeeAllTeams = true - break - } - } + shouldSeeAllTeams, err := org.CanUserSeeAllTeams(ctx, ctx.Doer.ID) + if err != nil { + ctx.ServerError("CanUserSeeAllTeams", err) + return } + if shouldSeeAllTeams { ctx.Org.Teams, err = org.LoadTeams(ctx) if err != nil { diff --git a/templates/org/team/teams.tmpl b/templates/org/team/teams.tmpl index 85ace44bc0..2c97f8ce3b 100644 --- a/templates/org/team/teams.tmpl +++ b/templates/org/team/teams.tmpl @@ -12,7 +12,7 @@