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.0 kB

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