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.

issue.go 6.2 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
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
11 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  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 repo
  5. import (
  6. "fmt"
  7. "github.com/codegangsta/martini"
  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/mailer"
  13. "github.com/gogits/gogs/modules/middleware"
  14. )
  15. func Issues(ctx *middleware.Context) {
  16. ctx.Data["Title"] = "Issues"
  17. ctx.Data["IsRepoToolbarIssues"] = true
  18. ctx.Data["IsRepoToolbarIssuesList"] = true
  19. milestoneId, _ := base.StrTo(ctx.Query("milestone")).Int()
  20. page, _ := base.StrTo(ctx.Query("page")).Int()
  21. // Get issues.
  22. issues, err := models.GetIssues(0, ctx.Repo.Repository.Id, 0,
  23. int64(milestoneId), page, ctx.Query("state") == "closed", false, ctx.Query("labels"), ctx.Query("sortType"))
  24. if err != nil {
  25. ctx.Handle(200, "issue.Issues: %v", err)
  26. return
  27. }
  28. // Get posters.
  29. for i := range issues {
  30. u, err := models.GetUserById(issues[i].PosterId)
  31. if err != nil {
  32. ctx.Handle(200, "issue.Issues(get poster): %v", err)
  33. return
  34. }
  35. issues[i].Poster = u
  36. }
  37. ctx.Data["Issues"] = issues
  38. ctx.Data["IssueCount"] = ctx.Repo.Repository.NumIssues
  39. ctx.Data["OpenCount"] = ctx.Repo.Repository.NumIssues - ctx.Repo.Repository.NumClosedIssues
  40. ctx.Data["ClosedCount"] = ctx.Repo.Repository.NumClosedIssues
  41. ctx.Data["IsShowClosed"] = ctx.Query("state") == "closed"
  42. ctx.HTML(200, "issue/list")
  43. }
  44. func CreateIssue(ctx *middleware.Context, params martini.Params, form auth.CreateIssueForm) {
  45. ctx.Data["Title"] = "Create issue"
  46. ctx.Data["IsRepoToolbarIssues"] = true
  47. ctx.Data["IsRepoToolbarIssuesList"] = false
  48. if ctx.Req.Method == "GET" {
  49. ctx.HTML(200, "issue/create")
  50. return
  51. }
  52. if ctx.HasError() {
  53. ctx.HTML(200, "issue/create")
  54. return
  55. }
  56. issue, err := models.CreateIssue(ctx.User.Id, ctx.Repo.Repository.Id, form.MilestoneId, form.AssigneeId,
  57. ctx.Repo.Repository.NumIssues, form.IssueName, form.Labels, form.Content, false)
  58. if err != nil {
  59. ctx.Handle(200, "issue.CreateIssue", err)
  60. return
  61. }
  62. // Notify watchers.
  63. if err = models.NotifyWatchers(&models.Action{ActUserId: ctx.User.Id, ActUserName: ctx.User.Name,
  64. OpType: models.OP_CREATE_ISSUE, Content: fmt.Sprintf("%d|%s", issue.Index, issue.Name),
  65. RepoId: ctx.Repo.Repository.Id, RepoName: ctx.Repo.Repository.Name, RefName: ""}); err != nil {
  66. ctx.Handle(200, "issue.CreateIssue", err)
  67. return
  68. }
  69. // Mail watchers.
  70. if base.Service.NotifyMail {
  71. if err = mailer.SendNotifyMail(ctx.User.Id, ctx.Repo.Repository.Id, ctx.User.Name, ctx.Repo.Repository.Name, issue.Name, issue.Content); err != nil {
  72. ctx.Handle(200, "issue.CreateIssue", err)
  73. return
  74. }
  75. }
  76. log.Trace("%d Issue created: %d", ctx.Repo.Repository.Id, issue.Id)
  77. ctx.Redirect(fmt.Sprintf("/%s/%s/issues/%d", params["username"], params["reponame"], issue.Index))
  78. }
  79. func ViewIssue(ctx *middleware.Context, params martini.Params) {
  80. index, err := base.StrTo(params["index"]).Int()
  81. if err != nil {
  82. ctx.Handle(404, "issue.ViewIssue", err)
  83. return
  84. }
  85. issue, err := models.GetIssueByIndex(ctx.Repo.Repository.Id, int64(index))
  86. if err != nil {
  87. if err == models.ErrIssueNotExist {
  88. ctx.Handle(404, "issue.ViewIssue", err)
  89. } else {
  90. ctx.Handle(200, "issue.ViewIssue", err)
  91. }
  92. return
  93. }
  94. // Get posters.
  95. u, err := models.GetUserById(issue.PosterId)
  96. if err != nil {
  97. ctx.Handle(200, "issue.ViewIssue(get poster): %v", err)
  98. return
  99. }
  100. issue.Poster = u
  101. issue.Content = string(base.RenderMarkdown([]byte(issue.Content), ""))
  102. // Get comments.
  103. comments, err := models.GetIssueComments(issue.Id)
  104. if err != nil {
  105. ctx.Handle(200, "issue.ViewIssue(get comments): %v", err)
  106. return
  107. }
  108. // Get posters.
  109. for i := range comments {
  110. u, err := models.GetUserById(comments[i].PosterId)
  111. if err != nil {
  112. ctx.Handle(200, "issue.ViewIssue(get poster): %v", err)
  113. return
  114. }
  115. comments[i].Poster = u
  116. comments[i].Content = string(base.RenderMarkdown([]byte(comments[i].Content), ""))
  117. }
  118. ctx.Data["Title"] = issue.Name
  119. ctx.Data["Issue"] = issue
  120. ctx.Data["Comments"] = comments
  121. ctx.Data["IsRepoToolbarIssues"] = true
  122. ctx.Data["IsRepoToolbarIssuesList"] = false
  123. ctx.HTML(200, "issue/view")
  124. }
  125. func UpdateIssue(ctx *middleware.Context, params martini.Params, form auth.CreateIssueForm) {
  126. index, err := base.StrTo(params["index"]).Int()
  127. if err != nil {
  128. ctx.Handle(404, "issue.UpdateIssue", err)
  129. return
  130. }
  131. issue, err := models.GetIssueByIndex(ctx.Repo.Repository.Id, int64(index))
  132. if err != nil {
  133. if err == models.ErrIssueNotExist {
  134. ctx.Handle(404, "issue.UpdateIssue", err)
  135. } else {
  136. ctx.Handle(200, "issue.UpdateIssue(get issue)", err)
  137. }
  138. return
  139. }
  140. if ctx.User.Id != issue.PosterId {
  141. ctx.Handle(404, "issue.UpdateIssue", nil)
  142. return
  143. }
  144. issue.Name = form.IssueName
  145. issue.MilestoneId = form.MilestoneId
  146. issue.AssigneeId = form.AssigneeId
  147. issue.Labels = form.Labels
  148. issue.Content = form.Content
  149. if err = models.UpdateIssue(issue); err != nil {
  150. ctx.Handle(200, "issue.UpdateIssue(update issue)", err)
  151. return
  152. }
  153. ctx.Data["Title"] = issue.Name
  154. ctx.Data["Issue"] = issue
  155. }
  156. func Comment(ctx *middleware.Context, params martini.Params) {
  157. index, err := base.StrTo(ctx.Query("issueIndex")).Int()
  158. if err != nil {
  159. ctx.Handle(404, "issue.Comment", err)
  160. return
  161. }
  162. issue, err := models.GetIssueByIndex(ctx.Repo.Repository.Id, int64(index))
  163. if err != nil {
  164. if err == models.ErrIssueNotExist {
  165. ctx.Handle(404, "issue.Comment", err)
  166. } else {
  167. ctx.Handle(200, "issue.Comment(get issue)", err)
  168. }
  169. return
  170. }
  171. content := ctx.Query("content")
  172. if len(content) == 0 {
  173. ctx.Handle(404, "issue.Comment", err)
  174. return
  175. }
  176. switch params["action"] {
  177. case "new":
  178. if err = models.CreateComment(ctx.User.Id, issue.Id, 0, 0, content); err != nil {
  179. ctx.Handle(500, "issue.Comment(create comment)", err)
  180. return
  181. }
  182. log.Trace("%s Comment created: %d", ctx.Req.RequestURI, issue.Id)
  183. default:
  184. ctx.Handle(404, "issue.Comment", err)
  185. return
  186. }
  187. ctx.Redirect(fmt.Sprintf("/%s/%s/issues/%d", ctx.User.Name, ctx.Repo.Repository.Name, index))
  188. }