2014-03-22 21:50:50 +04:00
// Copyright 2014 The Gogs Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package repo
import (
2014-03-23 00:00:46 +04:00
"fmt"
2014-03-22 21:50:50 +04:00
"github.com/codegangsta/martini"
"github.com/gogits/gogs/models"
2014-03-23 00:00:46 +04:00
"github.com/gogits/gogs/modules/auth"
2014-03-22 21:50:50 +04:00
"github.com/gogits/gogs/modules/base"
2014-03-23 00:00:46 +04:00
"github.com/gogits/gogs/modules/log"
2014-03-26 05:37:18 +04:00
"github.com/gogits/gogs/modules/mailer"
2014-03-22 21:50:50 +04:00
"github.com/gogits/gogs/modules/middleware"
)
func Issues ( ctx * middleware . Context , params martini . Params ) {
2014-03-23 00:00:46 +04:00
ctx . Data [ "Title" ] = "Issues"
2014-03-22 21:50:50 +04:00
ctx . Data [ "IsRepoToolbarIssues" ] = true
milestoneId , _ := base . StrTo ( params [ "milestone" ] ) . Int ( )
page , _ := base . StrTo ( params [ "page" ] ) . Int ( )
2014-03-25 22:04:57 +04:00
// Get issues.
issues , err := models . GetIssues ( 0 , ctx . Repo . Repository . Id , 0 ,
2014-03-22 21:50:50 +04:00
int64 ( milestoneId ) , page , params [ "state" ] == "closed" , false , params [ "labels" ] , params [ "sortType" ] )
if err != nil {
ctx . Handle ( 200 , "issue.Issues: %v" , err )
return
}
2014-03-25 22:04:57 +04:00
var closedCount int
// Get posters.
for i := range issues {
u , err := models . GetUserById ( issues [ i ] . PosterId )
if err != nil {
ctx . Handle ( 200 , "issue.Issues(get poster): %v" , err )
return
}
if issues [ i ] . IsClosed {
closedCount ++
}
issues [ i ] . Poster = u
}
ctx . Data [ "Issues" ] = issues
ctx . Data [ "IssueCount" ] = len ( issues )
ctx . Data [ "OpenCount" ] = len ( issues ) - closedCount
ctx . Data [ "ClosedCount" ] = closedCount
2014-03-25 20:12:27 +04:00
ctx . HTML ( 200 , "issue/list" )
2014-03-22 21:50:50 +04:00
}
2014-03-22 22:27:03 +04:00
2014-03-23 00:00:46 +04:00
func CreateIssue ( ctx * middleware . Context , params martini . Params , form auth . CreateIssueForm ) {
ctx . Data [ "Title" ] = "Create issue"
2014-03-25 14:27:29 +04:00
ctx . Data [ "IsRepoToolbarIssues" ] = true
2014-03-23 00:00:46 +04:00
if ctx . Req . Method == "GET" {
ctx . HTML ( 200 , "issue/create" )
return
}
if ctx . HasError ( ) {
ctx . HTML ( 200 , "issue/create" )
return
}
2014-03-25 20:12:27 +04:00
issue , err := models . CreateIssue ( ctx . User . Id , ctx . Repo . Repository . Id , form . MilestoneId , form . AssigneeId ,
2014-03-23 00:00:46 +04:00
form . IssueName , form . Labels , form . Content , false )
2014-03-25 22:04:57 +04:00
if err != nil {
ctx . Handle ( 200 , "issue.CreateIssue" , err )
2014-03-23 00:00:46 +04:00
return
}
2014-03-25 22:04:57 +04:00
// Notify watchers.
if err = models . NotifyWatchers ( ctx . User . Id , ctx . Repo . Repository . Id , models . OP_CREATE_ISSUE ,
ctx . User . Name , ctx . Repo . Repository . Name , "" , fmt . Sprintf ( "%d|%s" , issue . Index , issue . Name ) ) ; err != nil {
ctx . Handle ( 200 , "issue.CreateIssue" , err )
return
}
2014-03-26 05:37:18 +04:00
// Mail watchers.
if base . Service . NotifyMail {
if err = mailer . SendNotifyMail ( ctx . User . Id , ctx . Repo . Repository . Id , ctx . User . Name , ctx . Repo . Repository . Name , issue . Name , issue . Content ) ; err != nil {
ctx . Handle ( 200 , "issue.CreateIssue" , err )
return
}
}
2014-03-25 22:04:57 +04:00
log . Trace ( "%d Issue created: %d" , ctx . Repo . Repository . Id , issue . Id )
ctx . Redirect ( fmt . Sprintf ( "/%s/%s/issues/%d" , params [ "username" ] , params [ "reponame" ] , issue . Index ) )
2014-03-23 00:00:46 +04:00
}
func ViewIssue ( ctx * middleware . Context , params martini . Params ) {
2014-03-24 03:09:11 +04:00
index , err := base . StrTo ( params [ "index" ] ) . Int ( )
2014-03-23 00:00:46 +04:00
if err != nil {
2014-03-23 09:12:55 +04:00
ctx . Handle ( 404 , "issue.ViewIssue" , err )
2014-03-23 00:00:46 +04:00
return
}
2014-03-24 03:09:11 +04:00
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . Id , int64 ( index ) )
2014-03-23 00:00:46 +04:00
if err != nil {
if err == models . ErrIssueNotExist {
2014-03-23 09:12:55 +04:00
ctx . Handle ( 404 , "issue.ViewIssue" , err )
2014-03-23 00:00:46 +04:00
} else {
ctx . Handle ( 200 , "issue.ViewIssue" , err )
}
return
}
ctx . Data [ "Title" ] = issue . Name
ctx . Data [ "Issue" ] = issue
ctx . HTML ( 200 , "issue/view" )
2014-03-22 22:27:03 +04:00
}
2014-03-24 03:09:11 +04:00
func UpdateIssue ( ctx * middleware . Context , params martini . Params , form auth . CreateIssueForm ) {
if ! ctx . Repo . IsOwner {
ctx . Handle ( 404 , "issue.UpdateIssue" , nil )
return
}
index , err := base . StrTo ( params [ "index" ] ) . Int ( )
if err != nil {
ctx . Handle ( 404 , "issue.UpdateIssue" , err )
return
}
issue , err := models . GetIssueByIndex ( ctx . Repo . Repository . Id , int64 ( index ) )
if err != nil {
if err == models . ErrIssueNotExist {
ctx . Handle ( 404 , "issue.UpdateIssue" , err )
} else {
ctx . Handle ( 200 , "issue.UpdateIssue" , err )
}
return
}
issue . Name = form . IssueName
issue . MilestoneId = form . MilestoneId
issue . AssigneeId = form . AssigneeId
issue . Labels = form . Labels
issue . Content = form . Content
if err = models . UpdateIssue ( issue ) ; err != nil {
ctx . Handle ( 200 , "issue.UpdateIssue" , err )
return
}
ctx . Data [ "Title" ] = issue . Name
ctx . Data [ "Issue" ] = issue
}