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 6.9 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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 err == models.ErrUserNotExist {
  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 err == models.ErrLastOrgOwner {
  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. ctx.Handle(500, "GetRepositoryByName", err)
  113. return
  114. }
  115. err = ctx.Org.Team.AddRepository(repo)
  116. case "remove":
  117. err = ctx.Org.Team.RemoveRepository(com.StrTo(ctx.Query("repoid")).MustInt64())
  118. }
  119. if err != nil {
  120. log.Error(3, "Action(%s): %v", ctx.Params(":action"), err)
  121. ctx.JSON(200, map[string]interface{}{
  122. "ok": false,
  123. "err": err.Error(),
  124. })
  125. return
  126. }
  127. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + ctx.Org.Team.LowerName + "/repositories")
  128. }
  129. func NewTeam(ctx *middleware.Context) {
  130. ctx.Data["Title"] = ctx.Org.Organization.FullName
  131. ctx.Data["PageIsOrgTeams"] = true
  132. ctx.Data["PageIsOrgTeamsNew"] = true
  133. ctx.Data["Team"] = &models.Team{}
  134. ctx.HTML(200, TEAM_NEW)
  135. }
  136. func NewTeamPost(ctx *middleware.Context, form auth.CreateTeamForm) {
  137. ctx.Data["Title"] = ctx.Org.Organization.FullName
  138. ctx.Data["PageIsOrgTeams"] = true
  139. ctx.Data["PageIsOrgTeamsNew"] = true
  140. ctx.Data["Team"] = &models.Team{}
  141. if ctx.HasError() {
  142. ctx.HTML(200, TEAM_NEW)
  143. return
  144. }
  145. // Validate permission level.
  146. var auth models.AuthorizeType
  147. switch form.Permission {
  148. case "read":
  149. auth = models.ORG_READABLE
  150. case "write":
  151. auth = models.ORG_WRITABLE
  152. case "admin":
  153. auth = models.ORG_ADMIN
  154. default:
  155. ctx.Error(401)
  156. return
  157. }
  158. org := ctx.Org.Organization
  159. t := &models.Team{
  160. OrgId: org.Id,
  161. Name: form.TeamName,
  162. Description: form.Description,
  163. Authorize: auth,
  164. }
  165. if err := models.NewTeam(t); err != nil {
  166. switch err {
  167. case models.ErrTeamNameIllegal:
  168. ctx.Data["Err_TeamName"] = true
  169. ctx.RenderWithErr(ctx.Tr("form.illegal_team_name"), TEAM_NEW, &form)
  170. case models.ErrTeamAlreadyExist:
  171. ctx.Data["Err_TeamName"] = true
  172. ctx.RenderWithErr(ctx.Tr("form.team_name_been_taken"), TEAM_NEW, &form)
  173. default:
  174. ctx.Handle(500, "NewTeam", err)
  175. }
  176. return
  177. }
  178. log.Trace("Team created: %s/%s", org.Name, t.Name)
  179. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + t.LowerName)
  180. }
  181. func TeamMembers(ctx *middleware.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, TEAM_MEMBERS)
  189. }
  190. func TeamRepositories(ctx *middleware.Context) {
  191. ctx.Data["Title"] = ctx.Org.Team.Name
  192. ctx.Data["PageIsOrgTeams"] = true
  193. if err := ctx.Org.Team.GetRepositories(); err != nil {
  194. ctx.Handle(500, "GetRepositories", err)
  195. return
  196. }
  197. ctx.HTML(200, TEAM_REPOSITORIES)
  198. }
  199. func EditTeam(ctx *middleware.Context) {
  200. ctx.Data["Title"] = ctx.Org.Organization.FullName
  201. ctx.Data["PageIsOrgTeams"] = true
  202. ctx.Data["team_name"] = ctx.Org.Team.Name
  203. ctx.Data["desc"] = ctx.Org.Team.Description
  204. ctx.HTML(200, TEAM_NEW)
  205. }
  206. func EditTeamPost(ctx *middleware.Context, form auth.CreateTeamForm) {
  207. t := ctx.Org.Team
  208. ctx.Data["Title"] = ctx.Org.Organization.FullName
  209. ctx.Data["PageIsOrgTeams"] = true
  210. ctx.Data["team_name"] = t.Name
  211. ctx.Data["desc"] = t.Description
  212. if ctx.HasError() {
  213. ctx.HTML(200, TEAM_NEW)
  214. return
  215. }
  216. isAuthChanged := false
  217. if !t.IsOwnerTeam() {
  218. // Validate permission level.
  219. var auth models.AuthorizeType
  220. switch form.Permission {
  221. case "read":
  222. auth = models.ORG_READABLE
  223. case "write":
  224. auth = models.ORG_WRITABLE
  225. case "admin":
  226. auth = models.ORG_ADMIN
  227. default:
  228. ctx.Error(401)
  229. return
  230. }
  231. t.Name = form.TeamName
  232. if t.Authorize != auth {
  233. isAuthChanged = true
  234. t.Authorize = auth
  235. }
  236. }
  237. t.Description = form.Description
  238. if err := models.UpdateTeam(t, isAuthChanged); err != nil {
  239. if err == models.ErrTeamNameIllegal {
  240. ctx.Data["Err_TeamName"] = true
  241. ctx.RenderWithErr(ctx.Tr("form.illegal_team_name"), TEAM_NEW, &form)
  242. } else {
  243. ctx.Handle(500, "UpdateTeam", err)
  244. }
  245. return
  246. }
  247. ctx.Redirect(ctx.Org.OrgLink + "/teams/" + t.LowerName)
  248. }
  249. func DeleteTeam(ctx *middleware.Context) {
  250. if err := models.DeleteTeam(ctx.Org.Team); err != nil {
  251. ctx.Handle(500, "DeleteTeam", err)
  252. return
  253. }
  254. ctx.Flash.Success(ctx.Tr("org.teams.delete_team_success"))
  255. ctx.Redirect(ctx.Org.OrgLink + "/teams")
  256. }