|  | @@ -53,7 +53,18 @@ func Issues(ctx *middleware.Context) {
 | 
	
		
			
				|  |  |  		filterMode = models.FM_MENTION
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	mid, _ := base.StrTo(ctx.Query("milestone")).Int64()
 | 
	
		
			
				|  |  | +	var mid int64
 | 
	
		
			
				|  |  | +	midx, _ := base.StrTo(ctx.Query("milestone")).Int64()
 | 
	
		
			
				|  |  | +	if midx > 0 {
 | 
	
		
			
				|  |  | +		mile, err := models.GetMilestoneByIndex(ctx.Repo.Repository.Id, midx)
 | 
	
		
			
				|  |  | +		if err != nil {
 | 
	
		
			
				|  |  | +			ctx.Handle(500, "issue.Issues(GetMilestoneByIndex): %v", err)
 | 
	
		
			
				|  |  | +			return
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		mid = mile.Id
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	fmt.Println(mid)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	page, _ := base.StrTo(ctx.Query("page")).Int()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	// Get issues.
 | 
	
	
		
			
				|  | @@ -114,6 +125,19 @@ func CreateIssue(ctx *middleware.Context, params martini.Params) {
 | 
	
		
			
				|  |  |  	ctx.Data["IsRepoToolbarIssues"] = true
 | 
	
		
			
				|  |  |  	ctx.Data["IsRepoToolbarIssuesList"] = false
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	var err error
 | 
	
		
			
				|  |  | +	// Get all milestones.
 | 
	
		
			
				|  |  | +	ctx.Data["OpenMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, false)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		ctx.Handle(500, "issue.ViewIssue(GetMilestones.1): %v", err)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	ctx.Data["ClosedMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, true)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		ctx.Handle(500, "issue.ViewIssue(GetMilestones.2): %v", err)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	us, err := models.GetCollaborators(strings.TrimPrefix(ctx.Repo.RepoLink, "/"))
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		ctx.Handle(500, "issue.CreateIssue(GetCollaborators)", err)
 | 
	
	
		
			
				|  | @@ -128,6 +152,19 @@ func CreateIssuePost(ctx *middleware.Context, params martini.Params, form auth.C
 | 
	
		
			
				|  |  |  	ctx.Data["IsRepoToolbarIssues"] = true
 | 
	
		
			
				|  |  |  	ctx.Data["IsRepoToolbarIssuesList"] = false
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	var err error
 | 
	
		
			
				|  |  | +	// Get all milestones.
 | 
	
		
			
				|  |  | +	ctx.Data["OpenMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, false)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		ctx.Handle(500, "issue.ViewIssue(GetMilestones.1): %v", err)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	ctx.Data["ClosedMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, true)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		ctx.Handle(500, "issue.ViewIssue(GetMilestones.2): %v", err)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	us, err := models.GetCollaborators(strings.TrimPrefix(ctx.Repo.RepoLink, "/"))
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		ctx.Handle(500, "issue.CreateIssue(GetCollaborators)", err)
 | 
	
	
		
			
				|  | @@ -240,12 +277,37 @@ func ViewIssue(ctx *middleware.Context, params martini.Params) {
 | 
	
		
			
				|  |  |  		return
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	us, err := models.GetCollaborators(strings.TrimPrefix(ctx.Repo.RepoLink, "/"))
 | 
	
		
			
				|  |  | +	// Get assigned milestone.
 | 
	
		
			
				|  |  | +	if issue.MilestoneId > 0 {
 | 
	
		
			
				|  |  | +		ctx.Data["Milestone"], err = models.GetMilestoneById(issue.MilestoneId)
 | 
	
		
			
				|  |  | +		if err != nil {
 | 
	
		
			
				|  |  | +			if err == models.ErrMilestoneNotExist {
 | 
	
		
			
				|  |  | +				log.Warn("issue.ViewIssue(GetMilestoneById): %v", err)
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				ctx.Handle(500, "issue.ViewIssue(GetMilestoneById)", err)
 | 
	
		
			
				|  |  | +				return
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Get all milestones.
 | 
	
		
			
				|  |  | +	ctx.Data["OpenMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, false)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		ctx.Handle(500, "issue.ViewIssue(GetMilestones.1): %v", err)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	ctx.Data["ClosedMilestones"], err = models.GetMilestones(ctx.Repo.Repository.Id, true)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		ctx.Handle(500, "issue.ViewIssue(GetMilestones.2): %v", err)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Get all collaborators.
 | 
	
		
			
				|  |  | +	ctx.Data["Collaborators"], err = models.GetCollaborators(strings.TrimPrefix(ctx.Repo.RepoLink, "/"))
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		ctx.Handle(500, "issue.CreateIssue(GetCollaborators)", err)
 | 
	
		
			
				|  |  |  		return
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	ctx.Data["Collaborators"] = us
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	if ctx.IsSigned {
 | 
	
		
			
				|  |  |  		// Update issue-user.
 | 
	
	
		
			
				|  | @@ -331,6 +393,52 @@ func UpdateIssue(ctx *middleware.Context, params martini.Params, form auth.Creat
 | 
	
		
			
				|  |  |  	})
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +func UpdateIssueMilestone(ctx *middleware.Context) {
 | 
	
		
			
				|  |  | +	if !ctx.Repo.IsOwner {
 | 
	
		
			
				|  |  | +		ctx.Error(403)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	issueId, err := base.StrTo(ctx.Query("issue")).Int64()
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		ctx.Error(404)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	issue, err := models.GetIssueById(issueId)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		if err == models.ErrIssueNotExist {
 | 
	
		
			
				|  |  | +			ctx.Handle(404, "issue.UpdateIssueMilestone(GetIssueById)", err)
 | 
	
		
			
				|  |  | +		} else {
 | 
	
		
			
				|  |  | +			ctx.Handle(500, "issue.UpdateIssueMilestone(GetIssueById)", err)
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	oldMid := issue.MilestoneId
 | 
	
		
			
				|  |  | +	mid, _ := base.StrTo(ctx.Query("milestone")).Int64()
 | 
	
		
			
				|  |  | +	if oldMid == mid {
 | 
	
		
			
				|  |  | +		ctx.JSON(200, map[string]interface{}{
 | 
	
		
			
				|  |  | +			"ok": true,
 | 
	
		
			
				|  |  | +		})
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	// Not check for invalid milestone id and give responsibility to owners.
 | 
	
		
			
				|  |  | +	issue.MilestoneId = mid
 | 
	
		
			
				|  |  | +	if err = models.ChangeMilestoneAssign(oldMid, mid, issue.IsClosed); err != nil {
 | 
	
		
			
				|  |  | +		ctx.Handle(500, "issue.UpdateIssueMilestone(ChangeMilestoneAssign)", err)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	} else if err = models.UpdateIssue(issue); err != nil {
 | 
	
		
			
				|  |  | +		ctx.Handle(500, "issue.UpdateIssueMilestone(UpdateIssue)", err)
 | 
	
		
			
				|  |  | +		return
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	ctx.JSON(200, map[string]interface{}{
 | 
	
		
			
				|  |  | +		"ok": true,
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func UpdateAssignee(ctx *middleware.Context) {
 | 
	
		
			
				|  |  |  	if !ctx.Repo.IsOwner {
 | 
	
		
			
				|  |  |  		ctx.Error(403)
 | 
	
	
		
			
				|  | @@ -580,6 +688,7 @@ func UpdateMilestone(ctx *middleware.Context, params martini.Params) {
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  		case "close":
 | 
	
		
			
				|  |  |  			if !mile.IsClosed {
 | 
	
		
			
				|  |  | +				mile.ClosedDate = time.Now()
 | 
	
		
			
				|  |  |  				if err = models.ChangeMilestoneStatus(mile, true); err != nil {
 | 
	
		
			
				|  |  |  					ctx.Handle(500, "issue.UpdateMilestone(ChangeMilestoneStatus)", err)
 | 
	
		
			
				|  |  |  					return
 |