diff --git a/models/org.go b/models/org.go index e00bef5798fd9..ae9bd3223db29 100644 --- a/models/org.go +++ b/models/org.go @@ -53,6 +53,10 @@ func (org *User) GetOwnerTeam() (*Team, error) { return org.getOwnerTeam(x) } +func (org *User) getTeamsWithAutoAddRepos(e Engine) ([]*Team, error) { + return getTeamsWithAutoAddRepos(e, org.ID) +} + func (org *User) getTeams(e Engine) error { return e. Where("org_id=?", org.ID). diff --git a/models/org_team.go b/models/org_team.go index 799716679c4a9..73ca6776e65f9 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -21,17 +21,18 @@ const ownerTeamName = "Owners" // Team represents a organization team. type Team struct { - ID int64 `xorm:"pk autoincr"` - OrgID int64 `xorm:"INDEX"` - LowerName string - Name string - Description string - Authorize AccessMode - Repos []*Repository `xorm:"-"` - Members []*User `xorm:"-"` - NumRepos int - NumMembers int - Units []*TeamUnit `xorm:"-"` + ID int64 `xorm:"pk autoincr"` + OrgID int64 `xorm:"INDEX"` + LowerName string + Name string + Description string + Authorize AccessMode + AutoAddNewRepo bool + Repos []*Repository `xorm:"-"` + Members []*User `xorm:"-"` + NumRepos int + NumMembers int + Units []*TeamUnit `xorm:"-"` } // ColorFormat provides a basic color format for a Team @@ -357,6 +358,13 @@ func getTeam(e Engine, orgID int64, name string) (*Team, error) { return t, nil } +func getTeamsWithAutoAddRepos(e Engine, orgID int64) ([]*Team, error) { + teams := make([]*Team, 0, 5) + sess := e.Where("org_id = ?", orgID). + And("auto_add_new_repo = ?", true) + return teams, sess.Find(&teams) +} + // GetTeam returns team by given team name and organization. func GetTeam(orgID int64, name string) (*Team, error) { return getTeam(x, orgID, name) diff --git a/models/repo.go b/models/repo.go index 507521357e343..88dba7069d154 100644 --- a/models/repo.go +++ b/models/repo.go @@ -1318,14 +1318,27 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err } u.NumRepos++ - // Give access to all members in owner team. if u.IsOrganization() { + // Give access to all members in owner team. t, err := u.getOwnerTeam(e) if err != nil { return fmt.Errorf("getOwnerTeam: %v", err) } else if err = t.addRepository(e, repo); err != nil { return fmt.Errorf("addRepository: %v", err) - } else if err = prepareWebhooks(e, repo, HookEventRepository, &api.RepositoryPayload{ + } + + // Add teams that shall automatically get repo access + teams, err := u.getTeamsWithAutoAddRepos(e) + if err != nil { + return fmt.Errorf("getTeamsWithAutoAddRepos: %v", err) + } + for _, t = range teams { + if err = t.addRepository(e, repo); err != nil { + return fmt.Errorf("addRepository: %v", err) + } + } + + if err = prepareWebhooks(e, repo, HookEventRepository, &api.RepositoryPayload{ Action: api.HookRepoCreated, Repository: repo.innerAPIFormat(e, AccessModeOwner, false), Organization: u.APIFormat(), @@ -1514,12 +1527,24 @@ func TransferOwnership(doer *User, newOwnerName string, repo *Repository) error } if newOwner.IsOrganization() { + // Give access to all members in owner team. t, err := newOwner.getOwnerTeam(sess) if err != nil { return fmt.Errorf("getOwnerTeam: %v", err) } else if err = t.addRepository(sess, repo); err != nil { return fmt.Errorf("add to owner team: %v", err) } + + // Add teams that shall automatically get repo access + teams, err := newOwner.getTeamsWithAutoAddRepos(sess) + if err != nil { + return fmt.Errorf("getTeamsWithAutoAddRepos: %v", err) + } + for _, t = range teams { + if err = t.addRepository(sess, repo); err != nil { + return fmt.Errorf("addRepository: %v", err) + } + } } else if err = repo.recalculateAccesses(sess); err != nil { // Organization called this in addRepository method. return fmt.Errorf("recalculateAccesses: %v", err) diff --git a/modules/auth/org.go b/modules/auth/org.go index 367468e587d39..51926495b3453 100644 --- a/modules/auth/org.go +++ b/modules/auth/org.go @@ -56,10 +56,11 @@ func (f *UpdateOrgSettingForm) Validate(ctx *macaron.Context, errs binding.Error // CreateTeamForm form for creating team type CreateTeamForm struct { - TeamName string `binding:"Required;AlphaDashDot;MaxSize(30)"` - Description string `binding:"MaxSize(255)"` - Permission string - Units []models.UnitType + TeamName string `binding:"Required;AlphaDashDot;MaxSize(30)"` + Description string `binding:"MaxSize(255)"` + Permission string + AutoAddRepos bool + Units []models.UnitType } // Validate validates the fields diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 90ee32a25cfd6..08646798814be 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1485,6 +1485,8 @@ members.invite_now = Invite Now teams.join = Join teams.leave = Leave +teams.auto_add_repo = Automatically add new repositories +teams.auto_add_repo_helper = Team will automatically get access to newly created or transferred repositories in organization. teams.read_access = Read Access teams.read_access_helper = Members can view and clone team repositories. teams.write_access = Write Access diff --git a/routers/org/teams.go b/routers/org/teams.go index 7ead6ea5ff8ca..85ecfc6653a7b 100644 --- a/routers/org/teams.go +++ b/routers/org/teams.go @@ -182,10 +182,11 @@ func NewTeamPost(ctx *context.Context, form auth.CreateTeamForm) { ctx.Data["Units"] = models.Units t := &models.Team{ - OrgID: ctx.Org.Organization.ID, - Name: form.TeamName, - Description: form.Description, - Authorize: models.ParseAccessMode(form.Permission), + OrgID: ctx.Org.Organization.ID, + Name: form.TeamName, + Description: form.Description, + Authorize: models.ParseAccessMode(form.Permission), + AutoAddNewRepo: form.AutoAddRepos, } if t.Authorize < models.AccessModeOwner { @@ -273,6 +274,7 @@ func EditTeamPost(ctx *context.Context, form auth.CreateTeamForm) { auth := models.ParseAccessMode(form.Permission) t.Name = form.TeamName + t.AutoAddNewRepo = form.AutoAddRepos if t.Authorize != auth { isAuthChanged = true t.Authorize = auth diff --git a/templates/org/team/new.tmpl b/templates/org/team/new.tmpl index fb79c9b7fbac5..66ab075ef3199 100644 --- a/templates/org/team/new.tmpl +++ b/templates/org/team/new.tmpl @@ -27,6 +27,13 @@

+
+
+ + + {{.i18n.Tr "org.teams.auto_add_repo_helper"}} +
+