diff options
-rw-r--r-- | models/issue.go | 12 | ||||
-rw-r--r-- | routers/repo/issue.go | 25 |
2 files changed, 34 insertions, 3 deletions
diff --git a/models/issue.go b/models/issue.go index 525e75f2c3..a84fb0541e 100644 --- a/models/issue.go +++ b/models/issue.go @@ -338,6 +338,18 @@ func UpdateIssueUserPairsByStatus(iid int64, isClosed bool) error { return err } +// UpdateIssueUserPairByAssignee updates issue-user pair for assigning. +func UpdateIssueUserPairByAssignee(aid, iid int64) error { + rawSql := "UPDATE `issue_user` SET is_assigned = ? WHERE issue_id = ?" + if _, err := orm.Exec(rawSql, false, iid); err != nil { + return err + } + + rawSql = "UPDATE `issue_user` SET is_assigned = true WHERE uid = ? AND issue_id = ?" + _, err := orm.Exec(rawSql, true, aid, iid) + return err +} + // UpdateIssueUserPairByRead updates issue-user pair for reading. func UpdateIssueUserPairByRead(uid, iid int64) error { rawSql := "UPDATE `issue_user` SET is_read = ? WHERE uid = ? AND issue_id = ?" diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 3d25f06ae5..1f681c39fd 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -141,6 +141,10 @@ func CreateIssuePost(ctx *middleware.Context, params martini.Params, form auth.C return } + // Only collaborators can assign. + if !ctx.Repo.IsOwner { + form.AssigneeId = 0 + } issue := &models.Issue{ Index: int64(ctx.Repo.Repository.NumIssues) + 1, Name: form.IssueName, @@ -220,13 +224,28 @@ func ViewIssue(ctx *middleware.Context, params martini.Params) { issue, err := models.GetIssueByIndex(ctx.Repo.Repository.Id, idx) if err != nil { if err == models.ErrIssueNotExist { - ctx.Handle(404, "issue.ViewIssue", err) + ctx.Handle(404, "issue.ViewIssue(GetIssueByIndex)", err) } else { - ctx.Handle(200, "issue.ViewIssue", err) + ctx.Handle(500, "issue.ViewIssue(GetIssueByIndex)", err) } return } + // Update assignee. + if ctx.Repo.IsOwner { + aid, _ := base.StrTo(ctx.Query("assignneid")).Int64() + if aid > 0 { + // Not check for invalid assignne id and give responsibility to owners. + issue.AssigneeId = aid + if err = models.UpdateIssueUserPairByAssignee(aid, issue.Id); err != nil { + ctx.Handle(500, "issue.ViewIssue(UpdateIssueUserPairByAssignee): %v", err) + return + } + ctx.Redirect(fmt.Sprintf("%s/issues/%d", ctx.Repo.RepoLink, issue.Index)) + return + } + } + // Update issue-user. if err = models.UpdateIssueUserPairByRead(ctx.User.Id, issue.Id); err != nil { ctx.Handle(500, "issue.ViewIssue(UpdateIssueUserPairByRead): %v", err) @@ -254,7 +273,7 @@ func ViewIssue(ctx *middleware.Context, params martini.Params) { for i := range comments { u, err := models.GetUserById(comments[i].PosterId) if err != nil { - ctx.Handle(500, "issue.ViewIssue(get poster of comment): %v", err) + ctx.Handle(500, "issue.ViewIssue(GetUserById.2): %v", err) return } comments[i].Poster = u |