mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 08:30:25 +08:00 
			
		
		
		
	Added create issue
This commit is contained in:
		
							
								
								
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								gogs.go
									
									
									
									
									
								
							@@ -19,7 +19,7 @@ import (
 | 
				
			|||||||
// Test that go1.2 tag above is included in builds. main.go refers to this definition.
 | 
					// Test that go1.2 tag above is included in builds. main.go refers to this definition.
 | 
				
			||||||
const go12tag = true
 | 
					const go12tag = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const APP_VER = "0.1.7.0324"
 | 
					const APP_VER = "0.1.7.0325"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func init() {
 | 
					func init() {
 | 
				
			||||||
	base.AppVer = APP_VER
 | 
						base.AppVer = APP_VER
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,9 +17,8 @@ import (
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type CreateIssueForm struct {
 | 
					type CreateIssueForm struct {
 | 
				
			||||||
	IssueName   string `form:"name" binding:"Required;MaxSize(50)"`
 | 
						IssueName   string `form:"title" binding:"Required;MaxSize(50)"`
 | 
				
			||||||
	RepoId      int64  `form:"repoid" binding:"Required"`
 | 
						MilestoneId int64  `form:"milestoneid"`
 | 
				
			||||||
	MilestoneId int64  `form:"milestoneid" binding:"Required"`
 | 
					 | 
				
			||||||
	AssigneeId  int64  `form:"assigneeid"`
 | 
						AssigneeId  int64  `form:"assigneeid"`
 | 
				
			||||||
	Labels      string `form:"labels"`
 | 
						Labels      string `form:"labels"`
 | 
				
			||||||
	Content     string `form:"content"`
 | 
						Content     string `form:"content"`
 | 
				
			||||||
@@ -27,9 +26,7 @@ type CreateIssueForm struct {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func (f *CreateIssueForm) Name(field string) string {
 | 
					func (f *CreateIssueForm) Name(field string) string {
 | 
				
			||||||
	names := map[string]string{
 | 
						names := map[string]string{
 | 
				
			||||||
		"IssueName":   "Issue name",
 | 
							"IssueName": "Issue name",
 | 
				
			||||||
		"RepoId":      "Repository ID",
 | 
					 | 
				
			||||||
		"MilestoneId": "Milestone ID",
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return names[field]
 | 
						return names[field]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,8 +30,9 @@ import (
 | 
				
			|||||||
	"sync"
 | 
						"sync"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/gogits/gogs/modules/log"
 | 
					 | 
				
			||||||
	"github.com/nfnt/resize"
 | 
						"github.com/nfnt/resize"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/gogits/gogs/modules/log"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
var (
 | 
					var (
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -102,7 +102,10 @@ func CreateTimeLimitCode(data string, minutes int, startInf interface{}) string
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
// AvatarLink returns avatar link by given e-mail.
 | 
					// AvatarLink returns avatar link by given e-mail.
 | 
				
			||||||
func AvatarLink(email string) string {
 | 
					func AvatarLink(email string) string {
 | 
				
			||||||
	return "/avatar/" + EncodeMd5(email)
 | 
						if Service.EnableCacheAvatar {
 | 
				
			||||||
 | 
							return "/avatar/" + EncodeMd5(email)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return "http://1.gravatar.com/avatar/" + EncodeMd5(email)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Seconds-based time units
 | 
					// Seconds-based time units
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -76,6 +76,11 @@ func RepoAssignment(redirect bool) martini.Handler {
 | 
				
			|||||||
		ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", base.RunUser, base.Domain, user.LowerName, repo.LowerName)
 | 
							ctx.Repo.CloneLink.SSH = fmt.Sprintf("%s@%s:%s/%s.git", base.RunUser, base.Domain, user.LowerName, repo.LowerName)
 | 
				
			||||||
		ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s://%s/%s/%s.git", scheme, base.Domain, user.LowerName, repo.LowerName)
 | 
							ctx.Repo.CloneLink.HTTPS = fmt.Sprintf("%s://%s/%s/%s.git", scheme, base.Domain, user.LowerName, repo.LowerName)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if len(params["branchname"]) == 0 {
 | 
				
			||||||
 | 
								params["branchname"] = "master"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx.Data["Branchname"] = params["branchname"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		ctx.Data["IsRepositoryValid"] = true
 | 
							ctx.Data["IsRepositoryValid"] = true
 | 
				
			||||||
		ctx.Data["Repository"] = repo
 | 
							ctx.Data["Repository"] = repo
 | 
				
			||||||
		ctx.Data["Owner"] = user
 | 
							ctx.Data["Owner"] = user
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,11 +26,6 @@ func Branches(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ctx.Data["Username"] = params["username"]
 | 
						ctx.Data["Username"] = params["username"]
 | 
				
			||||||
	ctx.Data["Reponame"] = params["reponame"]
 | 
						ctx.Data["Reponame"] = params["reponame"]
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if len(params["branchname"]) == 0 {
 | 
					 | 
				
			||||||
		params["branchname"] = "master"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ctx.Data["Branchname"] = params["branchname"]
 | 
					 | 
				
			||||||
	ctx.Data["Branches"] = brs
 | 
						ctx.Data["Branches"] = brs
 | 
				
			||||||
	ctx.Data["IsRepoToolbarBranches"] = true
 | 
						ctx.Data["IsRepoToolbarBranches"] = true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,12 +30,7 @@ func Issues(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
		ctx.Handle(200, "issue.Issues: %v", err)
 | 
							ctx.Handle(200, "issue.Issues: %v", err)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						ctx.HTML(200, "issue/list")
 | 
				
			||||||
	if len(params["branchname"]) == 0 {
 | 
					 | 
				
			||||||
		params["branchname"] = "master"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ctx.Data["Branchname"] = params["branchname"]
 | 
					 | 
				
			||||||
	ctx.HTML(200, "issue/repo")
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func CreateIssue(ctx *middleware.Context, params martini.Params, form auth.CreateIssueForm) {
 | 
					func CreateIssue(ctx *middleware.Context, params martini.Params, form auth.CreateIssueForm) {
 | 
				
			||||||
@@ -57,10 +52,10 @@ func CreateIssue(ctx *middleware.Context, params martini.Params, form auth.Creat
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	issue, err := models.CreateIssue(ctx.User.Id, form.RepoId, form.MilestoneId, form.AssigneeId,
 | 
						issue, err := models.CreateIssue(ctx.User.Id, ctx.Repo.Repository.Id, form.MilestoneId, form.AssigneeId,
 | 
				
			||||||
		form.IssueName, form.Labels, form.Content, false)
 | 
							form.IssueName, form.Labels, form.Content, false)
 | 
				
			||||||
	if err == nil {
 | 
						if err == nil {
 | 
				
			||||||
		log.Trace("%s Issue created: %d", form.RepoId, issue.Id)
 | 
							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))
 | 
							ctx.Redirect(fmt.Sprintf("/%s/%s/issues/%d", params["username"], params["reponame"], issue.Index))
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,10 +12,5 @@ import (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func Pulls(ctx *middleware.Context, params martini.Params) {
 | 
					func Pulls(ctx *middleware.Context, params martini.Params) {
 | 
				
			||||||
	ctx.Data["IsRepoToolbarPulls"] = true
 | 
						ctx.Data["IsRepoToolbarPulls"] = true
 | 
				
			||||||
	if len(params["branchname"]) == 0 {
 | 
					 | 
				
			||||||
		params["branchname"] = "master"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.Data["Branchname"] = params["branchname"]
 | 
					 | 
				
			||||||
	ctx.HTML(200, "repo/pulls")
 | 
						ctx.HTML(200, "repo/pulls")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,10 +57,6 @@ func Single(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(params["branchname"]) == 0 {
 | 
					 | 
				
			||||||
		params["branchname"] = "master"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get tree path
 | 
						// Get tree path
 | 
				
			||||||
	treename := params["_1"]
 | 
						treename := params["_1"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -177,7 +173,6 @@ func Single(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	ctx.Data["Username"] = params["username"]
 | 
						ctx.Data["Username"] = params["username"]
 | 
				
			||||||
	ctx.Data["Reponame"] = params["reponame"]
 | 
						ctx.Data["Reponame"] = params["reponame"]
 | 
				
			||||||
	ctx.Data["Branchname"] = params["branchname"]
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	var treenames []string
 | 
						var treenames []string
 | 
				
			||||||
	Paths := make([]string, 0)
 | 
						Paths := make([]string, 0)
 | 
				
			||||||
@@ -216,10 +211,6 @@ func SingleDownload(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(params["branchname"]) == 0 {
 | 
					 | 
				
			||||||
		params["branchname"] = "master"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	// Get tree path
 | 
						// Get tree path
 | 
				
			||||||
	treename := params["_1"]
 | 
						treename := params["_1"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -290,11 +281,6 @@ func Setting(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
		title = t
 | 
							title = t
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if len(params["branchname"]) == 0 {
 | 
					 | 
				
			||||||
		params["branchname"] = "master"
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ctx.Data["Branchname"] = params["branchname"]
 | 
					 | 
				
			||||||
	ctx.Data["Title"] = title + " - settings"
 | 
						ctx.Data["Title"] = title + " - settings"
 | 
				
			||||||
	ctx.HTML(200, "repo/setting")
 | 
						ctx.HTML(200, "repo/setting")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								serve.go
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								serve.go
									
									
									
									
									
								
							@@ -249,8 +249,8 @@ func runServ(k *cli.Context) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if refname == "" {
 | 
						if refname == "" {
 | 
				
			||||||
		println("No find any reference name:", b.String())
 | 
							println("Not found any reference name:", b.String())
 | 
				
			||||||
		log.Error("No find any reference name: " + b.String())
 | 
							log.Error("Not found any reference name: " + b.String())
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -267,7 +267,6 @@ func runServ(k *cli.Context) {
 | 
				
			|||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if ref, ok = refs[refname]; !ok {
 | 
							if ref, ok = refs[refname]; !ok {
 | 
				
			||||||
			log.Error("unknow reference name -", refname, "-", b.String())
 | 
					 | 
				
			||||||
			log.Error("unknow reference name -", refname, "-", b.String())
 | 
								log.Error("unknow reference name -", refname, "-", b.String())
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,13 +4,14 @@
 | 
				
			|||||||
{{template "repo/toolbar" .}}
 | 
					{{template "repo/toolbar" .}}
 | 
				
			||||||
<div id="body" class="container">
 | 
					<div id="body" class="container">
 | 
				
			||||||
    <div id="issue">
 | 
					    <div id="issue">
 | 
				
			||||||
        <form class="form" action="#" method="post" id="issue-create-form">
 | 
					        <form class="form" action="/{{.RepositoryLink}}/issues/new" method="post" id="issue-create-form">
 | 
				
			||||||
 | 
					            {{.CsrfTokenHtml}}
 | 
				
			||||||
            <div class="col-md-1">
 | 
					            <div class="col-md-1">
 | 
				
			||||||
                <img class="avatar" src="http://tp2.sinaimg.cn/5068084885/50/40050297589/1" alt=""/>
 | 
					                <img class="avatar" src="{{.SignedUser.AvatarLink}}" alt=""/>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="col-md-8 panel panel-default">
 | 
					            <div class="col-md-8 panel panel-default">
 | 
				
			||||||
                <div class="form-group panel-body">
 | 
					                <div class="form-group panel-body">
 | 
				
			||||||
                    <input class="form-control input-lg" type="text" name="title" required="required" placeholder="Title"/>
 | 
					                    <input class="form-control input-lg" type="text" name="title" required="required" placeholder="Title" value="{{.title}}" />
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
                <div class="form-group panel-body">
 | 
					                <div class="form-group panel-body">
 | 
				
			||||||
                    <div class="md-help pull-right"><!-- todo help link -->
 | 
					                    <div class="md-help pull-right"><!-- todo help link -->
 | 
				
			||||||
@@ -23,7 +24,7 @@
 | 
				
			|||||||
                    <div class="tab-content">
 | 
					                    <div class="tab-content">
 | 
				
			||||||
                        <div class="tab-pane" id="issue-textarea">
 | 
					                        <div class="tab-pane" id="issue-textarea">
 | 
				
			||||||
                            <div class="form-group">
 | 
					                            <div class="form-group">
 | 
				
			||||||
                                <textarea class="form-control" name="content" id="issue-content" rows="10" placeholder="Write some content"></textarea>
 | 
					                                <textarea class="form-control" name="content" id="issue-content" rows="10" placeholder="Write some content">{{.content}}</textarea>
 | 
				
			||||||
                            </div>
 | 
					                            </div>
 | 
				
			||||||
                        </div>
 | 
					                        </div>
 | 
				
			||||||
                        <div class="tab-pane" id="issue-preview">preview</div>
 | 
					                        <div class="tab-pane" id="issue-preview">preview</div>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,6 +18,11 @@
 | 
				
			|||||||
                    <a class="btn btn-default issue-close" href="#">Close 128</a>
 | 
					                    <a class="btn btn-default issue-close" href="#">Close 128</a>
 | 
				
			||||||
                </div>
 | 
					                </div>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
 | 
					            <div class="issues list-group">
 | 
				
			||||||
 | 
					                {{range .Issues}}
 | 
				
			||||||
 | 
					                <div class="list-group-item issue-item" id="{{.Id}}"></div>
 | 
				
			||||||
 | 
					                {{end}}
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
            <div class="issues list-group">
 | 
					            <div class="issues list-group">
 | 
				
			||||||
                <div class="list-group-item unread issue-item" id="issue-id">
 | 
					                <div class="list-group-item unread issue-item" id="issue-id">
 | 
				
			||||||
                    <span class="number pull-right">#123</span>
 | 
					                    <span class="number pull-right">#123</span>
 | 
				
			||||||
@@ -2,7 +2,7 @@
 | 
				
			|||||||
    <div class="container">
 | 
					    <div class="container">
 | 
				
			||||||
        <div class="row">
 | 
					        <div class="row">
 | 
				
			||||||
            <div class="col-md-7">
 | 
					            <div class="col-md-7">
 | 
				
			||||||
                <h3 class="name"><i class="fa fa-book fa-lg"></i><a href="{{.Owner.HomeLink}}">{{.Owner.Name}}</a> / {{.Repository.Name}}</h3>
 | 
					                <h3 class="name"><i class="fa fa-book fa-lg"></i><a href="{{.Owner.HomeLink}}">{{.Owner.Name}}</a> / <a href="/{{.Owner.Name}}/{{.Repository.Name}}">{{.Repository.Name}}</a></h3>
 | 
				
			||||||
                <p class="desc">{{.Repository.Description}}{{if .Repository.Website}} <a href="{{.Repository.Website}}">{{.Repository.Website}}</a>{{end}}</p>
 | 
					                <p class="desc">{{.Repository.Description}}{{if .Repository.Website}} <a href="{{.Repository.Website}}">{{.Repository.Website}}</a>{{end}}</p>
 | 
				
			||||||
            </div>
 | 
					            </div>
 | 
				
			||||||
            <div class="col-md-5 actions text-right clone-group-btn">
 | 
					            <div class="col-md-5 actions text-right clone-group-btn">
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								web.go
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								web.go
									
									
									
									
									
								
							@@ -90,7 +90,7 @@ func runWeb(*cli.Context) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// Routers.
 | 
						// Routers.
 | 
				
			||||||
	m.Get("/", ignSignIn, routers.Home)
 | 
						m.Get("/", ignSignIn, routers.Home)
 | 
				
			||||||
	m.Get("/install",routers.Install)
 | 
						m.Get("/install", routers.Install)
 | 
				
			||||||
	m.Get("/issues", reqSignIn, user.Issues)
 | 
						m.Get("/issues", reqSignIn, user.Issues)
 | 
				
			||||||
	m.Get("/pulls", reqSignIn, user.Pulls)
 | 
						m.Get("/pulls", reqSignIn, user.Pulls)
 | 
				
			||||||
	m.Get("/stars", reqSignIn, user.Stars)
 | 
						m.Get("/stars", reqSignIn, user.Stars)
 | 
				
			||||||
@@ -142,13 +142,13 @@ func runWeb(*cli.Context) {
 | 
				
			|||||||
		r.Post("/settings", repo.SettingPost)
 | 
							r.Post("/settings", repo.SettingPost)
 | 
				
			||||||
		r.Get("/settings", repo.Setting)
 | 
							r.Get("/settings", repo.Setting)
 | 
				
			||||||
		r.Get("/action/:action", repo.Action)
 | 
							r.Get("/action/:action", repo.Action)
 | 
				
			||||||
 | 
							r.Any("/issues/new", binding.BindIgnErr(auth.CreateIssueForm{}), repo.CreateIssue)
 | 
				
			||||||
 | 
							r.Post("/issues/:index", binding.BindIgnErr(auth.CreateIssueForm{}), repo.UpdateIssue)
 | 
				
			||||||
	}, reqSignIn, middleware.RepoAssignment(true))
 | 
						}, reqSignIn, middleware.RepoAssignment(true))
 | 
				
			||||||
	m.Group("/:username/:reponame", func(r martini.Router) {
 | 
						m.Group("/:username/:reponame", func(r martini.Router) {
 | 
				
			||||||
		r.Get("/commits/:branchname", repo.Commits)
 | 
							r.Get("/commits/:branchname", repo.Commits)
 | 
				
			||||||
		r.Get("/issues", repo.Issues)
 | 
							r.Get("/issues", repo.Issues)
 | 
				
			||||||
		r.Any("/issues/new", binding.BindIgnErr(auth.CreateIssueForm{}), repo.CreateIssue)
 | 
					 | 
				
			||||||
		r.Get("/issues/:index", repo.ViewIssue)
 | 
							r.Get("/issues/:index", repo.ViewIssue)
 | 
				
			||||||
		r.Post("/issues/:index", binding.BindIgnErr(auth.CreateIssueForm{}), repo.UpdateIssue)
 | 
					 | 
				
			||||||
		r.Get("/pulls", repo.Pulls)
 | 
							r.Get("/pulls", repo.Pulls)
 | 
				
			||||||
		r.Get("/branches", repo.Branches)
 | 
							r.Get("/branches", repo.Branches)
 | 
				
			||||||
		r.Get("/src/:branchname", repo.Single)
 | 
							r.Get("/src/:branchname", repo.Single)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user