teams.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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. "github.com/Unknwon/com"
  7. "github.com/gogits/gogs/models"
  8. "github.com/gogits/gogs/modules/auth"
  9. "github.com/gogits/gogs/modules/base"
  10. "github.com/gogits/gogs/modules/log"
  11. "github.com/gogits/gogs/modules/middleware"
  12. )
  13. const (
  14. TEAMS base.TplName = "org/team/teams"
  15. TEAM_NEW base.TplName = "org/team/new"
  16. TEAM_MEMBERS base.TplName = "org/team/members"
  17. )
  18. func Teams(ctx *middleware.Context) {
  19. org := ctx.Org.Organization
  20. ctx.Data["Title"] = org.FullName
  21. ctx.Data["PageIsOrgTeams"] = true
  22. if err := org.GetTeams(); err != nil {
  23. ctx.Handle(500, "GetTeams", err)
  24. return
  25. }
  26. for _, t := range org.Teams {
  27. if err := t.GetMembers(); err != nil {
  28. ctx.Handle(500, "GetMembers", err)
  29. return
  30. }
  31. }
  32. ctx.Data["Teams"] = org.Teams
  33. ctx.HTML(200, TEAMS)
  34. }
  35. func TeamsAction(ctx *middleware.Context) {
  36. uid := com.StrTo(ctx.Query("uid")).MustInt64()
  37. if uid == 0 {
  38. ctx.Redirect(ctx.Org.OrgLink + "/teams")
  39. return
  40. }
  41. page := ctx.Query("page")
  42. var err error
  43. switch ctx.Params(":action") {
  44. case "join":
  45. if !ctx.Org.IsOwner {
  46. ctx.Error(404)
  47. return
  48. }
  49. err = ctx.Org.Team.AddMember(ctx.User.Id)
  50. case "leave":
  51. err = ctx.Org.Team.RemoveMember(ctx.User.Id)
  52. case "remove":
  53. if !ctx.Org.IsOwner {
  54. ctx.Error(404)
  55. return
  56. }
  57. err = ctx.Org.Team.RemoveMember(uid)
  58. page = "team"
  59. case "add":
  60. if !ctx.Org.IsOwner {
  61. ctx.Error(404)
  62. return
  63. }
  64. uname := ctx.Query("uname")
  65. var u *models.User
  66. u, err = models.GetUserByName(uname)
  67. if err != nil {
  68. if err == models.ErrUserNotExist {
  69. ctx.Flash.Error(ctx.Tr("form.user_not_exist"))
  70. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName)
  71. } else {
  72. ctx.Handle(500, " GetUserByName", err)
  73. }
  74. return
  75. }
  76. err = ctx.Org.Team.AddMember(u.Id)
  77. page = "team"
  78. }
  79. if err != nil {
  80. if err == models.ErrLastOrgOwner {
  81. ctx.Flash.Error(ctx.Tr("form.last_org_owner"))
  82. } else {
  83. log.Error(4, "Action(%s): %v", ctx.Params(":action"), err)
  84. ctx.JSON(200, map[string]interface{}{
  85. "ok": false,
  86. "err": err.Error(),
  87. })
  88. return
  89. }
  90. }
  91. switch page {
  92. case "team":
  93. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName)
  94. default:
  95. ctx.Redirect(ctx.Org.OrgLink + "/teams")
  96. }
  97. }
  98. func NewTeam(ctx *middleware.Context) {
  99. ctx.Data["Title"] = ctx.Org.Organization.FullName
  100. ctx.Data["PageIsOrgTeams"] = true
  101. ctx.Data["PageIsOrgTeamsNew"] = true
  102. ctx.Data["Team"] = &models.Team{}
  103. ctx.HTML(200, TEAM_NEW)
  104. }
  105. func NewTeamPost(ctx *middleware.Context, form auth.CreateTeamForm) {
  106. ctx.Data["Title"] = ctx.Org.Organization.FullName
  107. ctx.Data["PageIsOrgTeams"] = true
  108. ctx.Data["PageIsOrgTeamsNew"] = true
  109. ctx.Data["Team"] = &models.Team{}
  110. if ctx.HasError() {
  111. ctx.HTML(200, TEAM_NEW)
  112. return
  113. }
  114. // Validate permission level.
  115. var auth models.AuthorizeType
  116. switch form.Permission {
  117. case "read":
  118. auth = models.ORG_READABLE
  119. case "write":
  120. auth = models.ORG_WRITABLE
  121. case "admin":
  122. auth = models.ORG_ADMIN
  123. default:
  124. ctx.Error(401)
  125. return
  126. }
  127. org := ctx.Org.Organization
  128. t := &models.Team{
  129. OrgId: org.Id,
  130. Name: form.TeamName,
  131. Description: form.Description,
  132. Authorize: auth,
  133. }
  134. if err := models.NewTeam(t); err != nil {
  135. switch err {
  136. case models.ErrTeamNameIllegal:
  137. ctx.Data["Err_TeamName"] = true
  138. ctx.RenderWithErr(ctx.Tr("form.illegal_team_name"), TEAM_NEW, &form)
  139. case models.ErrTeamAlreadyExist:
  140. ctx.Data["Err_TeamName"] = true
  141. ctx.RenderWithErr(ctx.Tr("form.team_name_been_taken"), TEAM_NEW, &form)
  142. default:
  143. ctx.Handle(500, "NewTeam", err)
  144. }
  145. return
  146. }
  147. log.Trace("Team created: %s/%s", org.Name, t.Name)
  148. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + t.LowerName)
  149. }
  150. func TeamMembers(ctx *middleware.Context) {
  151. ctx.Data["Title"] = ctx.Org.Team.Name
  152. ctx.Data["PageIsOrgTeams"] = true
  153. if err := ctx.Org.Team.GetMembers(); err != nil {
  154. ctx.Handle(500, "GetMembers", err)
  155. return
  156. }
  157. ctx.HTML(200, TEAM_MEMBERS)
  158. }
  159. func EditTeam(ctx *middleware.Context) {
  160. ctx.Data["Title"] = ctx.Org.Organization.FullName
  161. ctx.Data["PageIsOrgTeams"] = true
  162. ctx.Data["team_name"] = ctx.Org.Team.Name
  163. ctx.Data["desc"] = ctx.Org.Team.Description
  164. ctx.HTML(200, TEAM_NEW)
  165. }
  166. func EditTeamPost(ctx *middleware.Context, form auth.CreateTeamForm) {
  167. t := ctx.Org.Team
  168. ctx.Data["Title"] = ctx.Org.Organization.FullName
  169. ctx.Data["PageIsOrgTeams"] = true
  170. ctx.Data["team_name"] = t.Name
  171. ctx.Data["desc"] = t.Description
  172. if ctx.HasError() {
  173. ctx.HTML(200, TEAM_NEW)
  174. return
  175. }
  176. isAuthChanged := false
  177. if !t.IsOwnerTeam() {
  178. // Validate permission level.
  179. var auth models.AuthorizeType
  180. switch form.Permission {
  181. case "read":
  182. auth = models.ORG_READABLE
  183. case "write":
  184. auth = models.ORG_WRITABLE
  185. case "admin":
  186. auth = models.ORG_ADMIN
  187. default:
  188. ctx.Error(401)
  189. return
  190. }
  191. t.Name = form.TeamName
  192. if t.Authorize != auth {
  193. isAuthChanged = true
  194. t.Authorize = auth
  195. }
  196. }
  197. t.Description = form.Description
  198. if err := models.UpdateTeam(t, isAuthChanged); err != nil {
  199. if err == models.ErrTeamNameIllegal {
  200. ctx.Data["Err_TeamName"] = true
  201. ctx.RenderWithErr(ctx.Tr("form.illegal_team_name"), TEAM_NEW, &form)
  202. } else {
  203. ctx.Handle(500, "UpdateTeam", err)
  204. }
  205. return
  206. }
  207. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + t.LowerName)
  208. }
  209. func DeleteTeam(ctx *middleware.Context) {
  210. if err := models.DeleteTeam(ctx.Org.Team); err != nil {
  211. ctx.Handle(500, "DeleteTeam", err)
  212. return
  213. }
  214. ctx.Flash.Success(ctx.Tr("org.teams.delete_team_success"))
  215. ctx.Redirect(ctx.Org.OrgLink + "/teams")
  216. }