2014-06-30 02:00:41 +05:30
// Copyright 2014 The Gogs Authors. All rights reserved.
2019-11-06 15:07:14 +05:30
// Copyright 2019 The Gitea Authors. All rights reserved.
2014-06-30 02:00:41 +05:30
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2014-06-27 19:03:49 +05:30
package org
import (
2019-06-13 01:11:28 +05:30
"net/http"
2021-11-16 23:48:25 +05:30
"net/url"
2014-08-26 15:41:15 +05:30
"path"
2022-01-05 09:07:00 +05:30
"strconv"
2017-11-26 13:31:48 +05:30
"strings"
2014-08-26 15:41:15 +05:30
2016-11-10 21:54:48 +05:30
"code.gitea.io/gitea/models"
2022-04-08 00:29:56 +05:30
"code.gitea.io/gitea/models/db"
2022-10-19 18:10:28 +05:30
org_model "code.gitea.io/gitea/models/organization"
2021-11-28 17:28:28 +05:30
"code.gitea.io/gitea/models/perm"
2021-12-10 06:57:50 +05:30
repo_model "code.gitea.io/gitea/models/repo"
2021-11-10 01:27:58 +05:30
unit_model "code.gitea.io/gitea/models/unit"
2021-11-24 15:19:20 +05:30
user_model "code.gitea.io/gitea/models/user"
2016-11-10 21:54:48 +05:30
"code.gitea.io/gitea/modules/base"
"code.gitea.io/gitea/modules/context"
2022-04-08 00:29:56 +05:30
"code.gitea.io/gitea/modules/convert"
2016-11-10 21:54:48 +05:30
"code.gitea.io/gitea/modules/log"
2022-10-19 18:10:28 +05:30
"code.gitea.io/gitea/modules/setting"
2021-01-26 21:06:53 +05:30
"code.gitea.io/gitea/modules/web"
2017-12-07 12:30:09 +05:30
"code.gitea.io/gitea/routers/utils"
2021-04-07 01:14:05 +05:30
"code.gitea.io/gitea/services/forms"
2022-10-19 18:10:28 +05:30
"code.gitea.io/gitea/services/mailer"
2022-08-25 08:01:57 +05:30
org_service "code.gitea.io/gitea/services/org"
2014-06-27 19:03:49 +05:30
)
2014-06-30 02:00:41 +05:30
const (
2016-11-18 08:33:03 +05:30
// tplTeams template path for teams list page
tplTeams base . TplName = "org/team/teams"
// tplTeamNew template path for create new team page
tplTeamNew base . TplName = "org/team/new"
// tplTeamMembers template path for showing team members page
tplTeamMembers base . TplName = "org/team/members"
// tplTeamRepositories template path for showing team repositories page
tplTeamRepositories base . TplName = "org/team/repositories"
2022-10-19 18:10:28 +05:30
// tplTeamInvite template path for team invites page
tplTeamInvite base . TplName = "org/team/invite"
2014-06-30 02:00:41 +05:30
)
2016-11-18 08:33:03 +05:30
// Teams render teams list page
2016-03-11 22:26:52 +05:30
func Teams ( ctx * context . Context ) {
2014-08-16 13:51:17 +05:30
org := ctx . Org . Organization
ctx . Data [ "Title" ] = org . FullName
ctx . Data [ "PageIsOrgTeams" ] = true
2014-06-30 02:00:41 +05:30
2021-11-19 17:11:40 +05:30
for _ , t := range ctx . Org . Teams {
2022-03-29 11:59:02 +05:30
if err := t . GetMembersCtx ( ctx ) ; err != nil {
2018-01-11 03:04:17 +05:30
ctx . ServerError ( "GetMembers" , err )
2014-06-30 02:00:41 +05:30
return
}
}
2021-11-19 17:11:40 +05:30
ctx . Data [ "Teams" ] = ctx . Org . Teams
2014-06-30 02:00:41 +05:30
2021-04-05 21:00:52 +05:30
ctx . HTML ( http . StatusOK , tplTeams )
2014-06-27 19:03:49 +05:30
}
2016-11-18 08:33:03 +05:30
// TeamsAction response for join, leave, remove, add operations to team
2016-03-11 22:26:52 +05:30
func TeamsAction ( ctx * context . Context ) {
2021-08-11 06:01:13 +05:30
page := ctx . FormString ( "page" )
2014-08-16 13:51:17 +05:30
var err error
switch ctx . Params ( ":action" ) {
case "join" :
2014-08-24 18:39:05 +05:30
if ! ctx . Org . IsOwner {
2021-04-05 21:00:52 +05:30
ctx . Error ( http . StatusNotFound )
2014-08-24 18:39:05 +05:30
return
}
2022-03-29 11:59:02 +05:30
err = models . AddTeamMember ( ctx . Org . Team , ctx . Doer . ID )
2014-08-16 13:51:17 +05:30
case "leave" :
2022-03-29 11:59:02 +05:30
err = models . RemoveTeamMember ( ctx . Org . Team , ctx . Doer . ID )
2021-08-27 08:27:40 +05:30
if err != nil {
2022-10-19 18:10:28 +05:30
if org_model . IsErrLastOrgOwner ( err ) {
2021-08-27 08:27:40 +05:30
ctx . Flash . Error ( ctx . Tr ( "form.last_org_owner" ) )
} else {
log . Error ( "Action(%s): %v" , ctx . Params ( ":action" ) , err )
ctx . JSON ( http . StatusOK , map [ string ] interface { } {
"ok" : false ,
"err" : err . Error ( ) ,
} )
return
}
}
ctx . JSON ( http . StatusOK ,
map [ string ] interface { } {
"redirect" : ctx . Org . OrgLink + "/teams/" ,
} )
return
2014-08-24 18:39:05 +05:30
case "remove" :
if ! ctx . Org . IsOwner {
2021-04-05 21:00:52 +05:30
ctx . Error ( http . StatusNotFound )
2014-08-24 18:39:05 +05:30
return
}
2022-10-19 18:10:28 +05:30
uid := ctx . FormInt64 ( "uid" )
if uid == 0 {
ctx . Redirect ( ctx . Org . OrgLink + "/teams" )
return
}
2022-03-29 11:59:02 +05:30
err = models . RemoveTeamMember ( ctx . Org . Team , uid )
2021-08-27 08:27:40 +05:30
if err != nil {
2022-10-19 18:10:28 +05:30
if org_model . IsErrLastOrgOwner ( err ) {
2021-08-27 08:27:40 +05:30
ctx . Flash . Error ( ctx . Tr ( "form.last_org_owner" ) )
} else {
log . Error ( "Action(%s): %v" , ctx . Params ( ":action" ) , err )
ctx . JSON ( http . StatusOK , map [ string ] interface { } {
"ok" : false ,
"err" : err . Error ( ) ,
} )
return
}
}
ctx . JSON ( http . StatusOK ,
map [ string ] interface { } {
2021-11-16 23:48:25 +05:30
"redirect" : ctx . Org . OrgLink + "/teams/" + url . PathEscape ( ctx . Org . Team . LowerName ) ,
2021-08-27 08:27:40 +05:30
} )
return
2014-08-24 18:39:05 +05:30
case "add" :
if ! ctx . Org . IsOwner {
2021-04-05 21:00:52 +05:30
ctx . Error ( http . StatusNotFound )
2014-08-24 18:39:05 +05:30
return
}
2021-08-11 06:01:13 +05:30
uname := utils . RemoveUsernameParameterSuffix ( strings . ToLower ( ctx . FormString ( "uname" ) ) )
2021-11-24 15:19:20 +05:30
var u * user_model . User
2022-05-20 19:38:52 +05:30
u , err = user_model . GetUserByName ( ctx , uname )
2014-08-24 18:39:05 +05:30
if err != nil {
2021-11-24 15:19:20 +05:30
if user_model . IsErrUserNotExist ( err ) {
2022-10-19 18:10:28 +05:30
if setting . MailService != nil && user_model . ValidateEmail ( uname ) == nil {
invite , err := org_model . CreateTeamInvite ( ctx , ctx . Doer , ctx . Org . Team , uname )
if err != nil {
if org_model . IsErrTeamInviteAlreadyExist ( err ) {
ctx . Flash . Error ( ctx . Tr ( "form.duplicate_invite_to_team" ) )
} else if org_model . IsErrUserEmailAlreadyAdded ( err ) {
ctx . Flash . Error ( ctx . Tr ( "org.teams.add_duplicate_users" ) )
} else {
ctx . ServerError ( "CreateTeamInvite" , err )
return
}
} else if err := mailer . MailTeamInvite ( ctx , ctx . Doer , ctx . Org . Team , invite ) ; err != nil {
ctx . ServerError ( "MailTeamInvite" , err )
return
}
} else {
ctx . Flash . Error ( ctx . Tr ( "form.user_not_exist" ) )
}
2021-11-16 23:48:25 +05:30
ctx . Redirect ( ctx . Org . OrgLink + "/teams/" + url . PathEscape ( ctx . Org . Team . LowerName ) )
2014-08-24 18:39:05 +05:30
} else {
2022-10-19 18:10:28 +05:30
ctx . ServerError ( "GetUserByName" , err )
2014-08-24 18:39:05 +05:30
}
return
}
2017-05-26 18:42:02 +05:30
if u . IsOrganization ( ) {
ctx . Flash . Error ( ctx . Tr ( "form.cannot_add_org_to_team" ) )
2021-11-16 23:48:25 +05:30
ctx . Redirect ( ctx . Org . OrgLink + "/teams/" + url . PathEscape ( ctx . Org . Team . LowerName ) )
2017-05-26 18:42:02 +05:30
return
}
2018-08-20 00:19:19 +05:30
if ctx . Org . Team . IsMember ( u . ID ) {
ctx . Flash . Error ( ctx . Tr ( "org.teams.add_duplicate_users" ) )
} else {
2022-03-29 11:59:02 +05:30
err = models . AddTeamMember ( ctx . Org . Team , u . ID )
2018-08-20 00:19:19 +05:30
}
2022-10-19 18:10:28 +05:30
page = "team"
case "remove_invite" :
if ! ctx . Org . IsOwner {
ctx . Error ( http . StatusNotFound )
return
}
iid := ctx . FormInt64 ( "iid" )
if iid == 0 {
ctx . Redirect ( ctx . Org . OrgLink + "/teams/" + url . PathEscape ( ctx . Org . Team . LowerName ) )
return
}
if err := org_model . RemoveInviteByID ( ctx , iid , ctx . Org . Team . ID ) ; err != nil {
log . Error ( "Action(%s): %v" , ctx . Params ( ":action" ) , err )
ctx . ServerError ( "RemoveInviteByID" , err )
return
}
2014-08-24 18:39:05 +05:30
page = "team"
2014-07-03 02:12:16 +05:30
}
2014-08-16 13:51:17 +05:30
if err != nil {
2022-10-19 18:10:28 +05:30
if org_model . IsErrLastOrgOwner ( err ) {
2014-08-24 18:39:05 +05:30
ctx . Flash . Error ( ctx . Tr ( "form.last_org_owner" ) )
} else {
2019-04-02 13:18:31 +05:30
log . Error ( "Action(%s): %v" , ctx . Params ( ":action" ) , err )
2021-04-05 21:00:52 +05:30
ctx . JSON ( http . StatusOK , map [ string ] interface { } {
2014-08-24 18:39:05 +05:30
"ok" : false ,
"err" : err . Error ( ) ,
} )
return
}
}
switch page {
case "team" :
2021-11-16 23:48:25 +05:30
ctx . Redirect ( ctx . Org . OrgLink + "/teams/" + url . PathEscape ( ctx . Org . Team . LowerName ) )
2017-03-09 16:48:49 +05:30
case "home" :
2021-11-19 17:11:40 +05:30
ctx . Redirect ( ctx . Org . Organization . AsUser ( ) . HomeLink ( ) )
2014-08-24 18:39:05 +05:30
default :
ctx . Redirect ( ctx . Org . OrgLink + "/teams" )
2014-07-03 02:12:16 +05:30
}
2014-08-16 13:51:17 +05:30
}
2014-07-03 02:12:16 +05:30
2016-11-18 08:33:03 +05:30
// TeamsRepoAction operate team's repository
2016-03-11 22:26:52 +05:30
func TeamsRepoAction ( ctx * context . Context ) {
2014-08-26 15:41:15 +05:30
if ! ctx . Org . IsOwner {
2021-04-05 21:00:52 +05:30
ctx . Error ( http . StatusNotFound )
2014-08-26 15:41:15 +05:30
return
}
var err error
2019-11-16 23:06:13 +05:30
action := ctx . Params ( ":action" )
switch action {
2014-08-26 15:41:15 +05:30
case "add" :
2021-08-11 06:01:13 +05:30
repoName := path . Base ( ctx . FormString ( "repo_name" ) )
2021-12-10 06:57:50 +05:30
var repo * repo_model . Repository
repo , err = repo_model . GetRepositoryByName ( ctx . Org . Organization . ID , repoName )
2014-08-26 15:41:15 +05:30
if err != nil {
2021-12-10 06:57:50 +05:30
if repo_model . IsErrRepoNotExist ( err ) {
2014-10-10 14:36:12 +05:30
ctx . Flash . Error ( ctx . Tr ( "org.teams.add_nonexistent_repo" ) )
2021-11-16 23:48:25 +05:30
ctx . Redirect ( ctx . Org . OrgLink + "/teams/" + url . PathEscape ( ctx . Org . Team . LowerName ) + "/repositories" )
2014-10-10 14:36:12 +05:30
return
}
2018-01-11 03:04:17 +05:30
ctx . ServerError ( "GetRepositoryByName" , err )
2014-08-26 15:41:15 +05:30
return
}
2022-08-25 08:01:57 +05:30
err = org_service . TeamAddRepository ( ctx . Org . Team , repo )
2014-08-26 15:41:15 +05:30
case "remove" :
2022-03-29 11:59:02 +05:30
err = models . RemoveRepository ( ctx . Org . Team , ctx . FormInt64 ( "repoid" ) )
2019-11-09 06:09:37 +05:30
case "addall" :
2022-03-29 11:59:02 +05:30
err = models . AddAllRepositories ( ctx . Org . Team )
2019-11-09 06:09:37 +05:30
case "removeall" :
2022-03-29 11:59:02 +05:30
err = models . RemoveAllRepositories ( ctx . Org . Team )
2014-08-26 15:41:15 +05:30
}
if err != nil {
2019-04-02 13:18:31 +05:30
log . Error ( "Action(%s): '%s' %v" , ctx . Params ( ":action" ) , ctx . Org . Team . Name , err )
2018-01-11 03:04:17 +05:30
ctx . ServerError ( "TeamsRepoAction" , err )
2014-08-26 15:41:15 +05:30
return
}
2019-11-09 06:09:37 +05:30
2019-11-16 23:06:13 +05:30
if action == "addall" || action == "removeall" {
2021-04-05 21:00:52 +05:30
ctx . JSON ( http . StatusOK , map [ string ] interface { } {
2021-11-16 23:48:25 +05:30
"redirect" : ctx . Org . OrgLink + "/teams/" + url . PathEscape ( ctx . Org . Team . LowerName ) + "/repositories" ,
2019-11-16 23:06:13 +05:30
} )
return
}
2021-11-16 23:48:25 +05:30
ctx . Redirect ( ctx . Org . OrgLink + "/teams/" + url . PathEscape ( ctx . Org . Team . LowerName ) + "/repositories" )
2014-08-26 15:41:15 +05:30
}
2016-11-18 08:33:03 +05:30
// NewTeam render create new team page
2016-03-11 22:26:52 +05:30
func NewTeam ( ctx * context . Context ) {
2014-08-16 13:51:17 +05:30
ctx . Data [ "Title" ] = ctx . Org . Organization . FullName
ctx . Data [ "PageIsOrgTeams" ] = true
ctx . Data [ "PageIsOrgTeamsNew" ] = true
2022-10-19 18:10:28 +05:30
ctx . Data [ "Team" ] = & org_model . Team { }
2021-11-10 01:27:58 +05:30
ctx . Data [ "Units" ] = unit_model . Units
2021-04-05 21:00:52 +05:30
ctx . HTML ( http . StatusOK , tplTeamNew )
2014-07-03 02:12:16 +05:30
}
2022-01-05 09:07:00 +05:30
func getUnitPerms ( forms url . Values ) map [ unit_model . Type ] perm . AccessMode {
unitPerms := make ( map [ unit_model . Type ] perm . AccessMode )
for k , v := range forms {
if strings . HasPrefix ( k , "unit_" ) {
t , _ := strconv . Atoi ( k [ 5 : ] )
if t > 0 {
vv , _ := strconv . Atoi ( v [ 0 ] )
unitPerms [ unit_model . Type ( t ) ] = perm . AccessMode ( vv )
}
}
}
return unitPerms
}
2016-11-18 08:33:03 +05:30
// NewTeamPost response for create new team
2021-01-26 21:06:53 +05:30
func NewTeamPost ( ctx * context . Context ) {
2021-04-07 01:14:05 +05:30
form := web . GetForm ( ctx ) . ( * forms . CreateTeamForm )
2022-01-05 09:07:00 +05:30
includesAllRepositories := form . RepoAccess == "all"
unitPerms := getUnitPerms ( ctx . Req . Form )
p := perm . ParseAccessMode ( form . Permission )
if p < perm . AccessModeAdmin {
// if p is less than admin accessmode, then it should be general accessmode,
// so we should calculate the minial accessmode from units accessmodes.
p = unit_model . MinUnitAccessMode ( unitPerms )
}
2014-07-03 02:12:16 +05:30
2022-10-19 18:10:28 +05:30
t := & org_model . Team {
2019-11-06 15:07:14 +05:30
OrgID : ctx . Org . Organization . ID ,
Name : form . TeamName ,
Description : form . Description ,
2022-01-05 09:07:00 +05:30
AccessMode : p ,
2019-11-06 15:07:14 +05:30
IncludesAllRepositories : includesAllRepositories ,
2019-11-20 16:57:49 +05:30
CanCreateOrgRepo : form . CanCreateOrgRepo ,
2014-07-03 02:12:16 +05:30
}
2018-08-21 22:32:32 +05:30
2022-01-05 09:07:00 +05:30
if t . AccessMode < perm . AccessModeAdmin {
2022-10-19 18:10:28 +05:30
units := make ( [ ] * org_model . TeamUnit , 0 , len ( unitPerms ) )
2022-01-05 09:07:00 +05:30
for tp , perm := range unitPerms {
2022-10-19 18:10:28 +05:30
units = append ( units , & org_model . TeamUnit {
2022-01-05 09:07:00 +05:30
OrgID : ctx . Org . Organization . ID ,
Type : tp ,
AccessMode : perm ,
2018-06-21 21:30:13 +05:30
} )
}
t . Units = units
2017-07-17 07:34:43 +05:30
}
2022-01-05 09:07:00 +05:30
ctx . Data [ "Title" ] = ctx . Org . Organization . FullName
ctx . Data [ "PageIsOrgTeams" ] = true
ctx . Data [ "PageIsOrgTeamsNew" ] = true
ctx . Data [ "Units" ] = unit_model . Units
2016-01-30 03:36:14 +05:30
ctx . Data [ "Team" ] = t
if ctx . HasError ( ) {
2021-04-05 21:00:52 +05:30
ctx . HTML ( http . StatusOK , tplTeamNew )
2016-01-30 03:36:14 +05:30
return
}
2022-01-05 09:07:00 +05:30
if t . AccessMode < perm . AccessModeAdmin && len ( unitPerms ) == 0 {
2017-07-17 07:34:43 +05:30
ctx . RenderWithErr ( ctx . Tr ( "form.team_no_units_error" ) , tplTeamNew , & form )
return
}
2014-08-16 13:51:17 +05:30
if err := models . NewTeam ( t ) ; err != nil {
2016-01-30 03:36:14 +05:30
ctx . Data [ "Err_TeamName" ] = true
switch {
2022-10-19 18:10:28 +05:30
case org_model . IsErrTeamAlreadyExist ( err ) :
2016-11-18 08:33:03 +05:30
ctx . RenderWithErr ( ctx . Tr ( "form.team_name_been_taken" ) , tplTeamNew , & form )
2014-08-16 13:51:17 +05:30
default :
2018-01-11 03:04:17 +05:30
ctx . ServerError ( "NewTeam" , err )
2014-07-03 02:12:16 +05:30
}
return
}
2016-01-30 03:36:14 +05:30
log . Trace ( "Team created: %s/%s" , ctx . Org . Organization . Name , t . Name )
2021-11-16 23:48:25 +05:30
ctx . Redirect ( ctx . Org . OrgLink + "/teams/" + url . PathEscape ( t . LowerName ) )
2014-06-27 19:03:49 +05:30
}
2014-06-27 19:34:04 +05:30
2016-11-18 08:33:03 +05:30
// TeamMembers render team members page
2016-03-11 22:26:52 +05:30
func TeamMembers ( ctx * context . Context ) {
2014-08-24 18:39:05 +05:30
ctx . Data [ "Title" ] = ctx . Org . Team . Name
ctx . Data [ "PageIsOrgTeams" ] = true
2018-12-09 12:12:11 +05:30
ctx . Data [ "PageIsOrgTeamMembers" ] = true
2022-03-29 11:59:02 +05:30
if err := ctx . Org . Team . GetMembersCtx ( ctx ) ; err != nil {
2018-01-11 03:04:17 +05:30
ctx . ServerError ( "GetMembers" , err )
2014-08-24 18:39:05 +05:30
return
}
2022-02-24 03:37:05 +05:30
ctx . Data [ "Units" ] = unit_model . Units
2022-10-19 18:10:28 +05:30
invites , err := org_model . GetInvitesByTeamID ( ctx , ctx . Org . Team . ID )
if err != nil {
ctx . ServerError ( "GetInvitesByTeamID" , err )
return
}
ctx . Data [ "Invites" ] = invites
ctx . Data [ "IsEmailInviteEnabled" ] = setting . MailService != nil
2021-04-05 21:00:52 +05:30
ctx . HTML ( http . StatusOK , tplTeamMembers )
2014-08-24 18:39:05 +05:30
}
2016-11-18 08:33:03 +05:30
// TeamRepositories show the repositories of team
2016-03-11 22:26:52 +05:30
func TeamRepositories ( ctx * context . Context ) {
2014-08-26 15:41:15 +05:30
ctx . Data [ "Title" ] = ctx . Org . Team . Name
ctx . Data [ "PageIsOrgTeams" ] = true
2018-12-09 12:12:11 +05:30
ctx . Data [ "PageIsOrgTeamRepos" ] = true
2022-03-29 11:59:02 +05:30
if err := ctx . Org . Team . GetRepositoriesCtx ( ctx ) ; err != nil {
2018-01-11 03:04:17 +05:30
ctx . ServerError ( "GetRepositories" , err )
2014-08-26 15:41:15 +05:30
return
}
2022-02-24 03:37:05 +05:30
ctx . Data [ "Units" ] = unit_model . Units
2021-04-05 21:00:52 +05:30
ctx . HTML ( http . StatusOK , tplTeamRepositories )
2014-08-26 15:41:15 +05:30
}
2022-04-08 00:29:56 +05:30
// SearchTeam api for searching teams
func SearchTeam ( ctx * context . Context ) {
listOptions := db . ListOptions {
Page : ctx . FormInt ( "page" ) ,
PageSize : convert . ToCorrectPageSize ( ctx . FormInt ( "limit" ) ) ,
}
2022-10-19 18:10:28 +05:30
opts := & org_model . SearchTeamOptions {
2022-08-21 21:54:05 +05:30
// UserID is not set because the router already requires the doer to be an org admin. Thus, we don't need to restrict to teams that the user belongs in
2022-04-08 00:29:56 +05:30
Keyword : ctx . FormTrim ( "q" ) ,
OrgID : ctx . Org . Organization . ID ,
IncludeDesc : ctx . FormString ( "include_desc" ) == "" || ctx . FormBool ( "include_desc" ) ,
ListOptions : listOptions ,
}
2022-10-19 18:10:28 +05:30
teams , maxResults , err := org_model . SearchTeam ( opts )
2022-04-08 00:29:56 +05:30
if err != nil {
log . Error ( "SearchTeam failed: %v" , err )
ctx . JSON ( http . StatusInternalServerError , map [ string ] interface { } {
"ok" : false ,
"error" : "SearchTeam internal failure" ,
} )
return
}
2022-05-13 22:57:58 +05:30
apiTeams , err := convert . ToTeams ( teams , false )
if err != nil {
log . Error ( "convert ToTeams failed: %v" , err )
ctx . JSON ( http . StatusInternalServerError , map [ string ] interface { } {
"ok" : false ,
"error" : "SearchTeam failed to get units" ,
} )
return
2022-04-08 00:29:56 +05:30
}
ctx . SetTotalCountHeader ( maxResults )
ctx . JSON ( http . StatusOK , map [ string ] interface { } {
"ok" : true ,
"data" : apiTeams ,
} )
}
2016-11-18 08:33:03 +05:30
// EditTeam render team edit page
2016-03-11 22:26:52 +05:30
func EditTeam ( ctx * context . Context ) {
2014-08-24 18:39:05 +05:30
ctx . Data [ "Title" ] = ctx . Org . Organization . FullName
ctx . Data [ "PageIsOrgTeams" ] = true
ctx . Data [ "team_name" ] = ctx . Org . Team . Name
ctx . Data [ "desc" ] = ctx . Org . Team . Description
2021-11-10 01:27:58 +05:30
ctx . Data [ "Units" ] = unit_model . Units
2021-04-05 21:00:52 +05:30
ctx . HTML ( http . StatusOK , tplTeamNew )
2014-06-27 19:34:04 +05:30
}
2014-07-07 15:43:42 +05:30
2016-11-18 08:33:03 +05:30
// EditTeamPost response for modify team information
2021-01-26 21:06:53 +05:30
func EditTeamPost ( ctx * context . Context ) {
2021-04-07 01:14:05 +05:30
form := web . GetForm ( ctx ) . ( * forms . CreateTeamForm )
2014-08-24 18:39:05 +05:30
t := ctx . Org . Team
2022-01-05 09:07:00 +05:30
unitPerms := getUnitPerms ( ctx . Req . Form )
isAuthChanged := false
isIncludeAllChanged := false
includesAllRepositories := form . RepoAccess == "all"
2014-08-24 18:39:05 +05:30
ctx . Data [ "Title" ] = ctx . Org . Organization . FullName
2014-08-23 17:54:02 +05:30
ctx . Data [ "PageIsOrgTeams" ] = true
2016-01-30 03:36:14 +05:30
ctx . Data [ "Team" ] = t
2021-11-10 01:27:58 +05:30
ctx . Data [ "Units" ] = unit_model . Units
2014-08-24 18:39:05 +05:30
if ! t . IsOwnerTeam ( ) {
// Validate permission level.
2022-01-05 09:07:00 +05:30
newAccessMode := perm . ParseAccessMode ( form . Permission )
if newAccessMode < perm . AccessModeAdmin {
// if p is less than admin accessmode, then it should be general accessmode,
// so we should calculate the minial accessmode from units accessmodes.
newAccessMode = unit_model . MinUnitAccessMode ( unitPerms )
}
2014-08-24 18:39:05 +05:30
t . Name = form . TeamName
2022-01-05 09:07:00 +05:30
if t . AccessMode != newAccessMode {
2014-08-24 18:39:05 +05:30
isAuthChanged = true
2022-01-05 09:07:00 +05:30
t . AccessMode = newAccessMode
2014-08-24 18:39:05 +05:30
}
2019-11-06 15:07:14 +05:30
if t . IncludesAllRepositories != includesAllRepositories {
isIncludeAllChanged = true
t . IncludesAllRepositories = includesAllRepositories
}
2022-08-18 14:28:21 +05:30
t . CanCreateOrgRepo = form . CanCreateOrgRepo
} else {
t . CanCreateOrgRepo = true
2014-08-24 18:39:05 +05:30
}
2022-08-18 14:28:21 +05:30
2014-08-24 18:39:05 +05:30
t . Description = form . Description
2022-01-05 09:07:00 +05:30
if t . AccessMode < perm . AccessModeAdmin {
2022-10-19 18:10:28 +05:30
units := make ( [ ] org_model . TeamUnit , 0 , len ( unitPerms ) )
2022-01-05 09:07:00 +05:30
for tp , perm := range unitPerms {
2022-10-19 18:10:28 +05:30
units = append ( units , org_model . TeamUnit {
2022-01-05 09:07:00 +05:30
OrgID : t . OrgID ,
TeamID : t . ID ,
Type : tp ,
AccessMode : perm ,
2018-06-21 21:30:13 +05:30
} )
}
2022-10-19 18:10:28 +05:30
if err := org_model . UpdateTeamUnits ( t , units ) ; err != nil {
2022-03-29 11:59:02 +05:30
ctx . Error ( http . StatusInternalServerError , "UpdateTeamUnits" , err . Error ( ) )
2019-06-13 01:11:28 +05:30
return
}
2017-07-17 07:34:43 +05:30
}
if ctx . HasError ( ) {
2021-04-05 21:00:52 +05:30
ctx . HTML ( http . StatusOK , tplTeamNew )
2017-07-17 07:34:43 +05:30
return
}
2022-01-05 09:07:00 +05:30
if t . AccessMode < perm . AccessModeAdmin && len ( unitPerms ) == 0 {
2017-07-17 07:34:43 +05:30
ctx . RenderWithErr ( ctx . Tr ( "form.team_no_units_error" ) , tplTeamNew , & form )
return
}
2019-11-06 15:07:14 +05:30
if err := models . UpdateTeam ( t , isAuthChanged , isIncludeAllChanged ) ; err != nil {
2016-01-30 03:36:14 +05:30
ctx . Data [ "Err_TeamName" ] = true
switch {
2022-10-19 18:10:28 +05:30
case org_model . IsErrTeamAlreadyExist ( err ) :
2016-11-18 08:33:03 +05:30
ctx . RenderWithErr ( ctx . Tr ( "form.team_name_been_taken" ) , tplTeamNew , & form )
2016-01-30 03:36:14 +05:30
default :
2018-01-11 03:04:17 +05:30
ctx . ServerError ( "UpdateTeam" , err )
2014-08-24 18:39:05 +05:30
}
return
}
2021-11-16 23:48:25 +05:30
ctx . Redirect ( ctx . Org . OrgLink + "/teams/" + url . PathEscape ( t . LowerName ) )
2014-08-24 18:39:05 +05:30
}
2016-11-18 08:33:03 +05:30
// DeleteTeam response for the delete team request
2016-03-11 22:26:52 +05:30
func DeleteTeam ( ctx * context . Context ) {
2014-08-24 18:39:05 +05:30
if err := models . DeleteTeam ( ctx . Org . Team ) ; err != nil {
2015-11-22 12:02:09 +05:30
ctx . Flash . Error ( "DeleteTeam: " + err . Error ( ) )
} else {
ctx . Flash . Success ( ctx . Tr ( "org.teams.delete_team_success" ) )
2014-08-24 18:39:05 +05:30
}
2015-11-22 12:02:09 +05:30
2021-04-05 21:00:52 +05:30
ctx . JSON ( http . StatusOK , map [ string ] interface { } {
2015-11-22 12:02:09 +05:30
"redirect" : ctx . Org . OrgLink + "/teams" ,
} )
2014-07-07 15:43:42 +05:30
}
2022-10-19 18:10:28 +05:30
// TeamInvite renders the team invite page
func TeamInvite ( ctx * context . Context ) {
invite , org , team , inviter , err := getTeamInviteFromContext ( ctx )
if err != nil {
if org_model . IsErrTeamInviteNotFound ( err ) {
ctx . NotFound ( "ErrTeamInviteNotFound" , err )
} else {
ctx . ServerError ( "getTeamInviteFromContext" , err )
}
return
}
ctx . Data [ "Title" ] = ctx . Tr ( "org.teams.invite_team_member" , team . Name )
ctx . Data [ "Invite" ] = invite
ctx . Data [ "Organization" ] = org
ctx . Data [ "Team" ] = team
ctx . Data [ "Inviter" ] = inviter
ctx . HTML ( http . StatusOK , tplTeamInvite )
}
// TeamInvitePost handles the team invitation
func TeamInvitePost ( ctx * context . Context ) {
invite , org , team , _ , err := getTeamInviteFromContext ( ctx )
if err != nil {
if org_model . IsErrTeamInviteNotFound ( err ) {
ctx . NotFound ( "ErrTeamInviteNotFound" , err )
} else {
ctx . ServerError ( "getTeamInviteFromContext" , err )
}
return
}
if err := models . AddTeamMember ( team , ctx . Doer . ID ) ; err != nil {
ctx . ServerError ( "AddTeamMember" , err )
return
}
if err := org_model . RemoveInviteByID ( ctx , invite . ID , team . ID ) ; err != nil {
log . Error ( "RemoveInviteByID: %v" , err )
}
ctx . Redirect ( org . OrganisationLink ( ) + "/teams/" + url . PathEscape ( team . LowerName ) )
}
func getTeamInviteFromContext ( ctx * context . Context ) ( * org_model . TeamInvite , * org_model . Organization , * org_model . Team , * user_model . User , error ) {
invite , err := org_model . GetInviteByToken ( ctx , ctx . Params ( "token" ) )
if err != nil {
return nil , nil , nil , nil , err
}
inviter , err := user_model . GetUserByIDCtx ( ctx , invite . InviterID )
if err != nil {
return nil , nil , nil , nil , err
}
team , err := org_model . GetTeamByID ( ctx , invite . TeamID )
if err != nil {
return nil , nil , nil , nil , err
}
org , err := user_model . GetUserByIDCtx ( ctx , team . OrgID )
if err != nil {
return nil , nil , nil , nil , err
}
return invite , org_model . OrgFromUser ( org ) , team , inviter , nil
}