mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Finish milestone
This commit is contained in:
		@@ -190,6 +190,7 @@ func runWeb(*cli.Context) {
 | 
				
			|||||||
		r.Post("/issues/milestones/new", bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost)
 | 
							r.Post("/issues/milestones/new", bindIgnErr(auth.CreateMilestoneForm{}), repo.NewMilestonePost)
 | 
				
			||||||
		r.Get("/issues/milestones/:index/edit", repo.UpdateMilestone)
 | 
							r.Get("/issues/milestones/:index/edit", repo.UpdateMilestone)
 | 
				
			||||||
		r.Post("/issues/milestones/:index/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.UpdateMilestonePost)
 | 
							r.Post("/issues/milestones/:index/edit", bindIgnErr(auth.CreateMilestoneForm{}), repo.UpdateMilestonePost)
 | 
				
			||||||
 | 
							r.Get("/issues/milestones/:index/:action", repo.UpdateMilestone)
 | 
				
			||||||
		r.Post("/comment/:action", repo.Comment)
 | 
							r.Post("/comment/:action", repo.Comment)
 | 
				
			||||||
		r.Get("/releases/new", repo.ReleasesNew)
 | 
							r.Get("/releases/new", repo.ReleasesNew)
 | 
				
			||||||
	}, reqSignIn, middleware.RepoAssignment(true))
 | 
						}, reqSignIn, middleware.RepoAssignment(true))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -471,6 +471,64 @@ func UpdateMilestone(m *Milestone) error {
 | 
				
			|||||||
	return err
 | 
						return err
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ChangeMilestoneStatus changes the milestone open/closed status.
 | 
				
			||||||
 | 
					func ChangeMilestoneStatus(m *Milestone, isClosed bool) (err error) {
 | 
				
			||||||
 | 
						repo, err := GetRepositoryById(m.RepoId)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sess := orm.NewSession()
 | 
				
			||||||
 | 
						defer sess.Close()
 | 
				
			||||||
 | 
						if err = sess.Begin(); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						m.IsClosed = isClosed
 | 
				
			||||||
 | 
						if _, err = sess.Id(m.Id).AllCols().Update(m); err != nil {
 | 
				
			||||||
 | 
							sess.Rollback()
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if isClosed {
 | 
				
			||||||
 | 
							repo.NumClosedMilestones++
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							repo.NumClosedMilestones--
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if _, err = sess.Id(repo.Id).Update(repo); err != nil {
 | 
				
			||||||
 | 
							sess.Rollback()
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return sess.Commit()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// DeleteMilestone deletes a milestone.
 | 
				
			||||||
 | 
					func DeleteMilestone(m *Milestone) (err error) {
 | 
				
			||||||
 | 
						sess := orm.NewSession()
 | 
				
			||||||
 | 
						defer sess.Close()
 | 
				
			||||||
 | 
						if err = sess.Begin(); err != nil {
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if _, err = sess.Delete(m); err != nil {
 | 
				
			||||||
 | 
							sess.Rollback()
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rawSql := "UPDATE `repository` SET num_milestones = num_milestones - 1 WHERE id = ?"
 | 
				
			||||||
 | 
						if _, err = sess.Exec(rawSql, m.RepoId); err != nil {
 | 
				
			||||||
 | 
							sess.Rollback()
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						rawSql = "UPDATE `issue` SET milestone_id = 0 WHERE milestone_id = ?"
 | 
				
			||||||
 | 
						if _, err = sess.Exec(rawSql, m.Id); err != nil {
 | 
				
			||||||
 | 
							sess.Rollback()
 | 
				
			||||||
 | 
							return err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return sess.Commit()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Issue types.
 | 
					// Issue types.
 | 
				
			||||||
const (
 | 
					const (
 | 
				
			||||||
	IT_PLAIN  = iota // Pure comment.
 | 
						IT_PLAIN  = iota // Pure comment.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -567,6 +567,34 @@ func UpdateMilestone(ctx *middleware.Context, params martini.Params) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						action := params["action"]
 | 
				
			||||||
 | 
						if len(action) > 0 {
 | 
				
			||||||
 | 
							switch action {
 | 
				
			||||||
 | 
							case "open":
 | 
				
			||||||
 | 
								if mile.IsClosed {
 | 
				
			||||||
 | 
									if err = models.ChangeMilestoneStatus(mile, false); err != nil {
 | 
				
			||||||
 | 
										ctx.Handle(500, "issue.UpdateMilestone(ChangeMilestoneStatus)", err)
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							case "close":
 | 
				
			||||||
 | 
								if !mile.IsClosed {
 | 
				
			||||||
 | 
									if err = models.ChangeMilestoneStatus(mile, true); err != nil {
 | 
				
			||||||
 | 
										ctx.Handle(500, "issue.UpdateMilestone(ChangeMilestoneStatus)", err)
 | 
				
			||||||
 | 
										return
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							case "delete":
 | 
				
			||||||
 | 
								if err = models.DeleteMilestone(mile); err != nil {
 | 
				
			||||||
 | 
									ctx.Handle(500, "issue.UpdateMilestone(DeleteMilestone)", err)
 | 
				
			||||||
 | 
									return
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							ctx.Redirect(ctx.Repo.RepoLink + "/issues/milestones")
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mile.DeadlineString = mile.Deadline.UTC().Format("01/02/2006")
 | 
						mile.DeadlineString = mile.Deadline.UTC().Format("01/02/2006")
 | 
				
			||||||
	if mile.DeadlineString == "12/31/9999" {
 | 
						if mile.DeadlineString == "12/31/9999" {
 | 
				
			||||||
		mile.DeadlineString = ""
 | 
							mile.DeadlineString = ""
 | 
				
			||||||
@@ -583,16 +611,16 @@ func UpdateMilestonePost(ctx *middleware.Context, params martini.Params, form au
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	idx, _ := base.StrTo(params["index"]).Int64()
 | 
						idx, _ := base.StrTo(params["index"]).Int64()
 | 
				
			||||||
	if idx == 0 {
 | 
						if idx == 0 {
 | 
				
			||||||
		ctx.Handle(404, "issue.UpdateMilestone", nil)
 | 
							ctx.Handle(404, "issue.UpdateMilestonePost", nil)
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mile, err := models.GetMilestoneByIndex(ctx.Repo.Repository.Id, idx)
 | 
						mile, err := models.GetMilestoneByIndex(ctx.Repo.Repository.Id, idx)
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		if err == models.ErrMilestoneNotExist {
 | 
							if err == models.ErrMilestoneNotExist {
 | 
				
			||||||
			ctx.Handle(404, "issue.UpdateMilestone(GetMilestoneByIndex)", err)
 | 
								ctx.Handle(404, "issue.UpdateMilestonePost(GetMilestoneByIndex)", err)
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			ctx.Handle(500, "issue.UpdateMilestone(GetMilestoneByIndex)", err)
 | 
								ctx.Handle(500, "issue.UpdateMilestonePost(GetMilestoneByIndex)", err)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		return
 | 
							return
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -23,9 +23,12 @@
 | 
				
			|||||||
                    <span class="issue-close label label-warning">{{.NumOpenIssues}}</span>
 | 
					                    <span class="issue-close label label-warning">{{.NumOpenIssues}}</span>
 | 
				
			||||||
                    <p class="actions pull-right">
 | 
					                    <p class="actions pull-right">
 | 
				
			||||||
                        <a href="{{$.RepoLink}}/issues/milestones/{{.Index}}/edit">Edit</a>
 | 
					                        <a href="{{$.RepoLink}}/issues/milestones/{{.Index}}/edit">Edit</a>
 | 
				
			||||||
                        <!-- <a href="#">Open</a>
 | 
					                        {{if .IsClosed}}
 | 
				
			||||||
                        <a href="#">Close</a> -->
 | 
					                        <a href="{{$.RepoLink}}/issues/milestones/{{.Index}}/open">Open</a>
 | 
				
			||||||
                        <!-- <a class="text-danger" href="#">Delete</a> -->
 | 
					                        {{else}}
 | 
				
			||||||
 | 
					                        <a href="{{$.RepoLink}}/issues/milestones/{{.Index}}/close">Close</a>
 | 
				
			||||||
 | 
					                        {{end}}
 | 
				
			||||||
 | 
					                        <a class="text-danger" href="{{$.RepoLink}}/issues/milestones/{{.Index}}/delete">Delete</a>
 | 
				
			||||||
                        <a href="{{$.RepoLink}}/issues?milestone={{.Index}}{{if .IsClosed}}&state=closed{{end}}">Issues</a>
 | 
					                        <a href="{{$.RepoLink}}/issues?milestone={{.Index}}{{if .IsClosed}}&state=closed{{end}}">Issues</a>
 | 
				
			||||||
                    </p>
 | 
					                    </p>
 | 
				
			||||||
                    <hr/>
 | 
					                    <hr/>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user