mirror of https://github.com/gogs/gogs.git
repo: able to add organization member as repository collaborator
parent
0696d430c9
commit
10b93efc4a
|
@ -722,7 +722,6 @@ settings.collaborator_deletion_desc = This user will no longer have collaboratio
|
||||||
settings.remove_collaborator_success = Collaborator has been removed.
|
settings.remove_collaborator_success = Collaborator has been removed.
|
||||||
settings.search_user_placeholder = Search user...
|
settings.search_user_placeholder = Search user...
|
||||||
settings.org_not_allowed_to_be_collaborator = Organization is not allowed to be added as a collaborator.
|
settings.org_not_allowed_to_be_collaborator = Organization is not allowed to be added as a collaborator.
|
||||||
settings.user_is_org_member = User is organization member who cannot be added as a collaborator.
|
|
||||||
settings.add_webhook = Add Webhook
|
settings.add_webhook = Add Webhook
|
||||||
settings.hooks_desc = Webhooks are much like basic HTTP POST event triggers. Whenever something occurs in Gogs, we will handle the notification to the target host you specify. Learn more in this <a target="_blank" href="%s">Webhooks Guide</a>.
|
settings.hooks_desc = Webhooks are much like basic HTTP POST event triggers. Whenever something occurs in Gogs, we will handle the notification to the target host you specify. Learn more in this <a target="_blank" href="%s">Webhooks Guide</a>.
|
||||||
settings.webhook_deletion = Delete Webhook
|
settings.webhook_deletion = Delete Webhook
|
||||||
|
|
2
gogs.go
2
gogs.go
|
@ -16,7 +16,7 @@ import (
|
||||||
"github.com/gogits/gogs/modules/setting"
|
"github.com/gogits/gogs/modules/setting"
|
||||||
)
|
)
|
||||||
|
|
||||||
const APP_VER = "0.9.168.0223 / 0.10 RC"
|
const APP_VER = "0.9.169.0224 / 0.10 RC"
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
setting.AppVer = APP_VER
|
setting.AppVer = APP_VER
|
||||||
|
|
|
@ -229,7 +229,7 @@ func (repo *Repository) recalculateAccesses(e Engine) error {
|
||||||
return repo.recalculateTeamAccesses(e, 0)
|
return repo.recalculateTeamAccesses(e, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
accessMap := make(map[int64]AccessMode, 20)
|
accessMap := make(map[int64]AccessMode, 10)
|
||||||
if err := repo.refreshCollaboratorAccesses(e, accessMap); err != nil {
|
if err := repo.refreshCollaboratorAccesses(e, accessMap); err != nil {
|
||||||
return fmt.Errorf("refreshCollaboratorAccesses: %v", err)
|
return fmt.Errorf("refreshCollaboratorAccesses: %v", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -444,39 +444,34 @@ func GetTeamMembers(teamID int64) ([]*User, error) {
|
||||||
return getTeamMembers(x, teamID)
|
return getTeamMembers(x, teamID)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getUserTeams(e Engine, orgId, uid int64) ([]*Team, error) {
|
func getUserTeams(e Engine, orgID, userID int64) ([]*Team, error) {
|
||||||
tus := make([]*TeamUser, 0, 5)
|
teamUsers := make([]*TeamUser, 0, 5)
|
||||||
if err := e.Where("uid=?", uid).And("org_id=?", orgId).Find(&tus); err != nil {
|
if err := e.Where("uid = ?", userID).And("org_id = ?", orgID).Find(&teamUsers); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
ts := make([]*Team, len(tus))
|
teamIDs := make([]int64, len(teamUsers))
|
||||||
for i, tu := range tus {
|
for i := range teamUsers {
|
||||||
t := new(Team)
|
teamIDs[i] = teamUsers[i].TeamID
|
||||||
has, err := e.Id(tu.TeamID).Get(t)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
} else if !has {
|
|
||||||
return nil, ErrTeamNotExist
|
|
||||||
}
|
|
||||||
ts[i] = t
|
|
||||||
}
|
}
|
||||||
return ts, nil
|
|
||||||
|
teams := make([]*Team, 0, len(teamIDs))
|
||||||
|
return teams, e.Where("org_id = ?", orgID).In("id", teamIDs).Find(&teams)
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetUserTeams returns all teams that user belongs to in given organization.
|
// GetUserTeams returns all teams that user belongs to in given organization.
|
||||||
func GetUserTeams(orgId, uid int64) ([]*Team, error) {
|
func GetUserTeams(orgID, userID int64) ([]*Team, error) {
|
||||||
return getUserTeams(x, orgId, uid)
|
return getUserTeams(x, orgID, userID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddTeamMember adds new membership of given team to given organization,
|
// AddTeamMember adds new membership of given team to given organization,
|
||||||
// the user will have membership to given organization automatically when needed.
|
// the user will have membership to given organization automatically when needed.
|
||||||
func AddTeamMember(orgID, teamID, uid int64) error {
|
func AddTeamMember(orgID, teamID, userID int64) error {
|
||||||
if IsTeamMember(orgID, teamID, uid) {
|
if IsTeamMember(orgID, teamID, userID) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := AddOrgUser(orgID, uid); err != nil {
|
if err := AddOrgUser(orgID, userID); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -498,7 +493,7 @@ func AddTeamMember(orgID, teamID, uid int64) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
tu := &TeamUser{
|
tu := &TeamUser{
|
||||||
UID: uid,
|
UID: userID,
|
||||||
OrgID: orgID,
|
OrgID: orgID,
|
||||||
TeamID: teamID,
|
TeamID: teamID,
|
||||||
}
|
}
|
||||||
|
@ -517,7 +512,7 @@ func AddTeamMember(orgID, teamID, uid int64) error {
|
||||||
|
|
||||||
// We make sure it exists before.
|
// We make sure it exists before.
|
||||||
ou := new(OrgUser)
|
ou := new(OrgUser)
|
||||||
if _, err = sess.Where("uid = ?", uid).And("org_id = ?", orgID).Get(ou); err != nil {
|
if _, err = sess.Where("uid = ?", userID).And("org_id = ?", orgID).Get(ou); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
ou.NumTeams++
|
ou.NumTeams++
|
||||||
|
|
|
@ -62,17 +62,10 @@ func (repo *Repository) AddCollaborator(u *User) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err = sess.InsertOne(collaboration); err != nil {
|
if _, err = sess.Insert(collaboration); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
} else if err = repo.recalculateAccesses(sess); err != nil {
|
||||||
|
return fmt.Errorf("recalculateAccesses [repo_id: %v]: %v", repo.ID, err)
|
||||||
if repo.Owner.IsOrganization() {
|
|
||||||
err = repo.recalculateTeamAccesses(sess, 0)
|
|
||||||
} else {
|
|
||||||
err = repo.recalculateAccesses(sess)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return fmt.Errorf("recalculateAccesses 'team=%v': %v", repo.Owner.IsOrganization(), err)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return sess.Commit()
|
return sess.Commit()
|
||||||
|
@ -148,6 +141,19 @@ func (repo *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessM
|
||||||
}
|
}
|
||||||
collaboration.Mode = mode
|
collaboration.Mode = mode
|
||||||
|
|
||||||
|
// If it's an organizational repository, merge with team access level for highest permission
|
||||||
|
if repo.Owner.IsOrganization() {
|
||||||
|
teams, err := GetUserTeams(repo.OwnerID, userID)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("GetUserTeams: [org_id: %d, user_id: %d]: %v", repo.OwnerID, userID, err)
|
||||||
|
}
|
||||||
|
for i := range teams {
|
||||||
|
if mode < teams[i].Authorize {
|
||||||
|
mode = teams[i].Authorize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
sess := x.NewSession()
|
sess := x.NewSession()
|
||||||
defer sessionRelease(sess)
|
defer sessionRelease(sess)
|
||||||
if err = sess.Begin(); err != nil {
|
if err = sess.Begin(); err != nil {
|
||||||
|
@ -173,7 +179,7 @@ func (repo *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessM
|
||||||
_, err = sess.Insert(access)
|
_, err = sess.Insert(access)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("update access table: %v", err)
|
return fmt.Errorf("update/insert access table: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return sess.Commit()
|
return sess.Commit()
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -320,20 +320,13 @@ func SettingsCollaborationPost(ctx *context.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Organization is not allowed to be added as a collaborator.
|
// Organization is not allowed to be added as a collaborator
|
||||||
if u.IsOrganization() {
|
if u.IsOrganization() {
|
||||||
ctx.Flash.Error(ctx.Tr("repo.settings.org_not_allowed_to_be_collaborator"))
|
ctx.Flash.Error(ctx.Tr("repo.settings.org_not_allowed_to_be_collaborator"))
|
||||||
ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path)
|
ctx.Redirect(setting.AppSubUrl + ctx.Req.URL.Path)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if user is organization member.
|
|
||||||
if ctx.Repo.Owner.IsOrganization() && ctx.Repo.Owner.IsOrgMember(u.ID) {
|
|
||||||
ctx.Flash.Info(ctx.Tr("repo.settings.user_is_org_member"))
|
|
||||||
ctx.Redirect(ctx.Repo.RepoLink + "/settings/collaboration")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = ctx.Repo.Repository.AddCollaborator(u); err != nil {
|
if err = ctx.Repo.Repository.AddCollaborator(u); err != nil {
|
||||||
ctx.Handle(500, "AddCollaborator", err)
|
ctx.Handle(500, "AddCollaborator", err)
|
||||||
return
|
return
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
0.9.168.0223 / 0.10 RC
|
0.9.169.0224 / 0.10 RC
|
Loading…
Reference in New Issue