You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

teams.go 7.6 kB

11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
10 years ago
10 years ago
10 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package org
  5. import (
  6. "path"
  7. "github.com/Unknwon/com"
  8. "code.gitea.io/gitea/models"
  9. "code.gitea.io/gitea/modules/auth"
  10. "code.gitea.io/gitea/modules/base"
  11. "code.gitea.io/gitea/modules/context"
  12. "code.gitea.io/gitea/modules/log"
  13. )
  14. const (
  15. // tplTeams template path for teams list page
  16. tplTeams base.TplName = "org/team/teams"
  17. // tplTeamNew template path for create new team page
  18. tplTeamNew base.TplName = "org/team/new"
  19. // tplTeamMembers template path for showing team members page
  20. tplTeamMembers base.TplName = "org/team/members"
  21. // tplTeamRepositories template path for showing team repositories page
  22. tplTeamRepositories base.TplName = "org/team/repositories"
  23. )
  24. // Teams render teams list page
  25. func Teams(ctx *context.Context) {
  26. org := ctx.Org.Organization
  27. ctx.Data["Title"] = org.FullName
  28. ctx.Data["PageIsOrgTeams"] = true
  29. for _, t := range org.Teams {
  30. if err := t.GetMembers(); err != nil {
  31. ctx.Handle(500, "GetMembers", err)
  32. return
  33. }
  34. }
  35. ctx.Data["Teams"] = org.Teams
  36. ctx.HTML(200, tplTeams)
  37. }
  38. // TeamsAction response for join, leave, remove, add operations to team
  39. func TeamsAction(ctx *context.Context) {
  40. uid := com.StrTo(ctx.Query("uid")).MustInt64()
  41. if uid == 0 {
  42. ctx.Redirect(ctx.Org.OrgLink + "/teams")
  43. return
  44. }
  45. page := ctx.Query("page")
  46. var err error
  47. switch ctx.Params(":action") {
  48. case "join":
  49. if !ctx.Org.IsOwner {
  50. ctx.Error(404)
  51. return
  52. }
  53. err = ctx.Org.Team.AddMember(ctx.User.ID)
  54. case "leave":
  55. err = ctx.Org.Team.RemoveMember(ctx.User.ID)
  56. case "remove":
  57. if !ctx.Org.IsOwner {
  58. ctx.Error(404)
  59. return
  60. }
  61. err = ctx.Org.Team.RemoveMember(uid)
  62. page = "team"
  63. case "add":
  64. if !ctx.Org.IsOwner {
  65. ctx.Error(404)
  66. return
  67. }
  68. uname := ctx.Query("uname")
  69. var u *models.User
  70. u, err = models.GetUserByName(uname)
  71. if err != nil {
  72. if models.IsErrUserNotExist(err) {
  73. ctx.Flash.Error(ctx.Tr("form.user_not_exist"))
  74. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName)
  75. } else {
  76. ctx.Handle(500, " GetUserByName", err)
  77. }
  78. return
  79. }
  80. if u.IsOrganization() {
  81. ctx.Flash.Error(ctx.Tr("form.cannot_add_org_to_team"))
  82. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName)
  83. return
  84. }
  85. err = ctx.Org.Team.AddMember(u.ID)
  86. page = "team"
  87. }
  88. if err != nil {
  89. if models.IsErrLastOrgOwner(err) {
  90. ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
  91. } else {
  92. log.Error(3, "Action(%s): %v", ctx.Params(":action"), err)
  93. ctx.JSON(200, map[string]interface{}{
  94. "ok": false,
  95. "err": err.Error(),
  96. })
  97. return
  98. }
  99. }
  100. switch page {
  101. case "team":
  102. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName)
  103. case "home":
  104. ctx.Redirect(ctx.Org.Organization.HomeLink())
  105. default:
  106. ctx.Redirect(ctx.Org.OrgLink + "/teams")
  107. }
  108. }
  109. // TeamsRepoAction operate team's repository
  110. func TeamsRepoAction(ctx *context.Context) {
  111. if !ctx.Org.IsOwner {
  112. ctx.Error(404)
  113. return
  114. }
  115. var err error
  116. switch ctx.Params(":action") {
  117. case "add":
  118. repoName := path.Base(ctx.Query("repo_name"))
  119. var repo *models.Repository
  120. repo, err = models.GetRepositoryByName(ctx.Org.Organization.ID, repoName)
  121. if err != nil {
  122. if models.IsErrRepoNotExist(err) {
  123. ctx.Flash.Error(ctx.Tr("org.teams.add_nonexistent_repo"))
  124. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName + "/repositories")
  125. return
  126. }
  127. ctx.Handle(500, "GetRepositoryByName", err)
  128. return
  129. }
  130. err = ctx.Org.Team.AddRepository(repo)
  131. case "remove":
  132. err = ctx.Org.Team.RemoveRepository(com.StrTo(ctx.Query("repoid")).MustInt64())
  133. }
  134. if err != nil {
  135. log.Error(3, "Action(%s): '%s' %v", ctx.Params(":action"), ctx.Org.Team.Name, err)
  136. ctx.Handle(500, "TeamsRepoAction", err)
  137. return
  138. }
  139. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName + "/repositories")
  140. }
  141. // NewTeam render create new team page
  142. func NewTeam(ctx *context.Context) {
  143. ctx.Data["Title"] = ctx.Org.Organization.FullName
  144. ctx.Data["PageIsOrgTeams"] = true
  145. ctx.Data["PageIsOrgTeamsNew"] = true
  146. ctx.Data["Team"] = &models.Team{}
  147. ctx.Data["Units"] = models.Units
  148. ctx.HTML(200, tplTeamNew)
  149. }
  150. // NewTeamPost response for create new team
  151. func NewTeamPost(ctx *context.Context, form auth.CreateTeamForm) {
  152. ctx.Data["Title"] = ctx.Org.Organization.FullName
  153. ctx.Data["PageIsOrgTeams"] = true
  154. ctx.Data["PageIsOrgTeamsNew"] = true
  155. t := &models.Team{
  156. OrgID: ctx.Org.Organization.ID,
  157. Name: form.TeamName,
  158. Description: form.Description,
  159. Authorize: models.ParseAccessMode(form.Permission),
  160. UnitTypes: form.Units,
  161. }
  162. ctx.Data["Team"] = t
  163. if ctx.HasError() {
  164. ctx.HTML(200, tplTeamNew)
  165. return
  166. }
  167. if err := models.NewTeam(t); err != nil {
  168. ctx.Data["Err_TeamName"] = true
  169. switch {
  170. case models.IsErrTeamAlreadyExist(err):
  171. ctx.RenderWithErr(ctx.Tr("form.team_name_been_taken"), tplTeamNew, &form)
  172. default:
  173. ctx.Handle(500, "NewTeam", err)
  174. }
  175. return
  176. }
  177. log.Trace("Team created: %s/%s", ctx.Org.Organization.Name, t.Name)
  178. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + t.LowerName)
  179. }
  180. // TeamMembers render team members page
  181. func TeamMembers(ctx *context.Context) {
  182. ctx.Data["Title"] = ctx.Org.Team.Name
  183. ctx.Data["PageIsOrgTeams"] = true
  184. if err := ctx.Org.Team.GetMembers(); err != nil {
  185. ctx.Handle(500, "GetMembers", err)
  186. return
  187. }
  188. ctx.HTML(200, tplTeamMembers)
  189. }
  190. // TeamRepositories show the repositories of team
  191. func TeamRepositories(ctx *context.Context) {
  192. ctx.Data["Title"] = ctx.Org.Team.Name
  193. ctx.Data["PageIsOrgTeams"] = true
  194. if err := ctx.Org.Team.GetRepositories(); err != nil {
  195. ctx.Handle(500, "GetRepositories", err)
  196. return
  197. }
  198. ctx.HTML(200, tplTeamRepositories)
  199. }
  200. // EditTeam render team edit page
  201. func EditTeam(ctx *context.Context) {
  202. ctx.Data["Title"] = ctx.Org.Organization.FullName
  203. ctx.Data["PageIsOrgTeams"] = true
  204. ctx.Data["team_name"] = ctx.Org.Team.Name
  205. ctx.Data["desc"] = ctx.Org.Team.Description
  206. ctx.Data["Units"] = models.Units
  207. ctx.HTML(200, tplTeamNew)
  208. }
  209. // EditTeamPost response for modify team information
  210. func EditTeamPost(ctx *context.Context, form auth.CreateTeamForm) {
  211. t := ctx.Org.Team
  212. ctx.Data["Title"] = ctx.Org.Organization.FullName
  213. ctx.Data["PageIsOrgTeams"] = true
  214. ctx.Data["Team"] = t
  215. if ctx.HasError() {
  216. ctx.HTML(200, tplTeamNew)
  217. return
  218. }
  219. isAuthChanged := false
  220. if !t.IsOwnerTeam() {
  221. // Validate permission level.
  222. var auth models.AccessMode
  223. switch form.Permission {
  224. case "read":
  225. auth = models.AccessModeRead
  226. case "write":
  227. auth = models.AccessModeWrite
  228. case "admin":
  229. auth = models.AccessModeAdmin
  230. default:
  231. ctx.Error(401)
  232. return
  233. }
  234. t.Name = form.TeamName
  235. if t.Authorize != auth {
  236. isAuthChanged = true
  237. t.Authorize = auth
  238. }
  239. }
  240. t.Description = form.Description
  241. t.UnitTypes = form.Units
  242. if err := models.UpdateTeam(t, isAuthChanged); err != nil {
  243. ctx.Data["Err_TeamName"] = true
  244. switch {
  245. case models.IsErrTeamAlreadyExist(err):
  246. ctx.RenderWithErr(ctx.Tr("form.team_name_been_taken"), tplTeamNew, &form)
  247. default:
  248. ctx.Handle(500, "UpdateTeam", err)
  249. }
  250. return
  251. }
  252. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + t.LowerName)
  253. }
  254. // DeleteTeam response for the delete team request
  255. func DeleteTeam(ctx *context.Context) {
  256. if err := models.DeleteTeam(ctx.Org.Team); err != nil {
  257. ctx.Flash.Error("DeleteTeam: " + err.Error())
  258. } else {
  259. ctx.Flash.Success(ctx.Tr("org.teams.delete_team_success"))
  260. }
  261. ctx.JSON(200, map[string]interface{}{
  262. "redirect": ctx.Org.OrgLink + "/teams",
  263. })
  264. }