func Issues(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("repo.issues") ctx.Data["PageIsIssueList"] = true viewType := ctx.Query("type") types := []string{"assigned", "created_by", "mentioned"} if !com.IsSliceContainsStr(types, viewType) { viewType = "all" } isShowClosed := ctx.Query("state") == "closed" // Must sign in to see issues about you. if viewType != "all" && !ctx.IsSigned { ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) ctx.Redirect(setting.AppSubUrl + "/user/login") return } var assigneeID, posterID int64 filterMode := models.FM_ALL switch viewType { case "assigned": assigneeID = ctx.User.Id filterMode = models.FM_ASSIGN case "created_by": posterID = ctx.User.Id filterMode = models.FM_CREATE case "mentioned": filterMode = models.FM_MENTION } var uid int64 = -1 if ctx.IsSigned { uid = ctx.User.Id } repo := ctx.Repo.Repository selectLabels := ctx.Query("labels") milestoneID := ctx.QueryInt64("milestone") issueStats := models.GetIssueStats(repo.Id, uid, com.StrTo(selectLabels).MustInt64(), isShowClosed, filterMode) page := ctx.QueryInt("page") if page <= 1 { page = 1 } else { ctx.Data["PreviousPage"] = page - 1 } if (!isShowClosed && int(issueStats.OpenCount) > setting.IssuePagingNum*page) || (isShowClosed && int(issueStats.ClosedCount) > setting.IssuePagingNum*page) { ctx.Data["NextPage"] = page + 1 } // Get issues. issues, err := models.GetIssues(uid, assigneeID, repo.Id, posterID, milestoneID, page, isShowClosed, filterMode == models.FM_MENTION, selectLabels, ctx.Query("sortType")) if err != nil { ctx.Handle(500, "GetIssues: %v", err) return } // Get issue-user pairs. pairs, err := models.GetIssueUserPairs(repo.Id, posterID, isShowClosed) if err != nil { ctx.Handle(500, "GetIssueUserPairs: %v", err) return } // Get posters. for i := range issues { if err = issues[i].GetPoster(); err != nil { ctx.Handle(500, "GetPoster", fmt.Errorf("[#%d]%v", issues[i].ID, err)) return } if err = issues[i].GetLabels(); err != nil { ctx.Handle(500, "GetLabels", fmt.Errorf("[#%d]%v", issues[i].ID, err)) return } if !ctx.IsSigned { issues[i].IsRead = true continue } // Check read status. idx := models.PairsContains(pairs, issues[i].ID, ctx.User.Id) if idx > -1 { issues[i].IsRead = pairs[idx].IsRead } else { issues[i].IsRead = true } } ctx.Data["IssueStats"] = issueStats ctx.Data["SelectLabels"] = com.StrTo(selectLabels).MustInt64() ctx.Data["ViewType"] = viewType ctx.Data["Issues"] = issues ctx.Data["IsShowClosed"] = isShowClosed if isShowClosed { ctx.Data["State"] = "closed" ctx.Data["ShowCount"] = issueStats.ClosedCount } else { ctx.Data["State"] = "open" ctx.Data["ShowCount"] = issueStats.OpenCount } ctx.HTML(200, ISSUES) }
func Issues(ctx *middleware.Context) { isPullList := ctx.Params(":type") == "pulls" if isPullList { ctx.Data["Title"] = ctx.Tr("repo.pulls") ctx.Data["PageIsPullList"] = true ctx.Data["HasForkedRepo"] = ctx.IsSigned && ctx.User.HasForkedRepo(ctx.Repo.Repository.ID) } else { MustEnableIssues(ctx) if ctx.Written() { return } ctx.Data["Title"] = ctx.Tr("repo.issues") ctx.Data["PageIsIssueList"] = true } viewType := ctx.Query("type") sortType := ctx.Query("sort") types := []string{"assigned", "created_by", "mentioned"} if !com.IsSliceContainsStr(types, viewType) { viewType = "all" } // Must sign in to see issues about you. if viewType != "all" && !ctx.IsSigned { ctx.SetCookie("redirect_to", "/"+url.QueryEscape(setting.AppSubUrl+ctx.Req.RequestURI), 0, setting.AppSubUrl) ctx.Redirect(setting.AppSubUrl + "/user/login") return } var ( assigneeID = ctx.QueryInt64("assignee") posterID int64 ) filterMode := models.FM_ALL switch viewType { case "assigned": filterMode = models.FM_ASSIGN assigneeID = ctx.User.Id case "created_by": filterMode = models.FM_CREATE posterID = ctx.User.Id case "mentioned": filterMode = models.FM_MENTION } var uid int64 = -1 if ctx.IsSigned { uid = ctx.User.Id } repo := ctx.Repo.Repository selectLabels := ctx.Query("labels") milestoneID := ctx.QueryInt64("milestone") isShowClosed := ctx.Query("state") == "closed" issueStats := models.GetIssueStats(&models.IssueStatsOptions{ RepoID: repo.ID, UserID: uid, LabelID: com.StrTo(selectLabels).MustInt64(), MilestoneID: milestoneID, AssigneeID: assigneeID, FilterMode: filterMode, IsPull: isPullList, }) page := ctx.QueryInt("page") if page <= 1 { page = 1 } var total int if !isShowClosed { total = int(issueStats.OpenCount) } else { total = int(issueStats.ClosedCount) } pager := paginater.New(total, setting.IssuePagingNum, page, 5) ctx.Data["Page"] = pager // Get issues. issues, err := models.Issues(&models.IssuesOptions{ UserID: uid, AssigneeID: assigneeID, RepoID: repo.ID, PosterID: posterID, MilestoneID: milestoneID, Page: pager.Current(), IsClosed: isShowClosed, IsMention: filterMode == models.FM_MENTION, IsPull: isPullList, Labels: selectLabels, SortType: sortType, }) if err != nil { ctx.Handle(500, "Issues: %v", err) return } // Get issue-user relations. pairs, err := models.GetIssueUsers(repo.ID, posterID, isShowClosed) if err != nil { ctx.Handle(500, "GetIssueUsers: %v", err) return } // Get posters. for i := range issues { if err = issues[i].GetPoster(); err != nil { ctx.Handle(500, "GetPoster", fmt.Errorf("[#%d]%v", issues[i].ID, err)) return } if err = issues[i].GetLabels(); err != nil { ctx.Handle(500, "GetLabels", fmt.Errorf("[#%d]%v", issues[i].ID, err)) return } if !ctx.IsSigned { issues[i].IsRead = true continue } // Check read status. idx := models.PairsContains(pairs, issues[i].ID, ctx.User.Id) if idx > -1 { issues[i].IsRead = pairs[idx].IsRead } else { issues[i].IsRead = true } } ctx.Data["Issues"] = issues // Get milestones. ctx.Data["Milestones"], err = models.GetAllRepoMilestones(repo.ID) if err != nil { ctx.Handle(500, "GetAllRepoMilestones: %v", err) return } // Get assignees. ctx.Data["Assignees"], err = repo.GetAssignees() if err != nil { ctx.Handle(500, "GetAssignees: %v", err) return } ctx.Data["IssueStats"] = issueStats ctx.Data["SelectLabels"] = com.StrTo(selectLabels).MustInt64() ctx.Data["ViewType"] = viewType ctx.Data["SortType"] = sortType ctx.Data["MilestoneID"] = milestoneID ctx.Data["AssigneeID"] = assigneeID ctx.Data["IsShowClosed"] = isShowClosed if isShowClosed { ctx.Data["State"] = "closed" } else { ctx.Data["State"] = "open" } ctx.HTML(200, ISSUES) }
func Issues(ctx *middleware.Context) { ctx.Data["Title"] = "Issues" ctx.Data["IsRepoToolbarIssues"] = true ctx.Data["IsRepoToolbarIssuesList"] = true viewType := ctx.Query("type") types := []string{"assigned", "created_by", "mentioned"} if !com.IsSliceContainsStr(types, viewType) { viewType = "all" } isShowClosed := ctx.Query("state") == "closed" if viewType != "all" && !ctx.IsSigned { ctx.SetCookie("redirect_to", "/"+url.QueryEscape(ctx.Req.RequestURI)) ctx.Redirect("/user/login") return } var assigneeId, posterId int64 var filterMode int switch viewType { case "assigned": assigneeId = ctx.User.Id filterMode = models.FM_ASSIGN case "created_by": posterId = ctx.User.Id filterMode = models.FM_CREATE case "mentioned": filterMode = models.FM_MENTION } 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 } selectLabels := ctx.Query("labels") labels, err := models.GetLabels(ctx.Repo.Repository.Id) if err != nil { ctx.Handle(500, "issue.Issues(GetLabels): %v", err) return } for _, l := range labels { l.CalOpenIssues() } ctx.Data["Labels"] = labels page, _ := base.StrTo(ctx.Query("page")).Int() // Get issues. issues, err := models.GetIssues(assigneeId, ctx.Repo.Repository.Id, posterId, mid, page, isShowClosed, selectLabels, ctx.Query("sortType")) if err != nil { ctx.Handle(500, "issue.Issues(GetIssues): %v", err) return } // Get issue-user pairs. pairs, err := models.GetIssueUserPairs(ctx.Repo.Repository.Id, posterId, isShowClosed) if err != nil { ctx.Handle(500, "issue.Issues(GetIssueUserPairs): %v", err) return } // Get posters. for i := range issues { if err = issues[i].GetLabels(); err != nil { ctx.Handle(500, "issue.Issues(GetLabels)", fmt.Errorf("[#%d]%v", issues[i].Id, err)) return } idx := models.PairsContains(pairs, issues[i].Id) if filterMode == models.FM_MENTION && (idx == -1 || !pairs[idx].IsMentioned) { continue } if idx > -1 { issues[i].IsRead = pairs[idx].IsRead } else { issues[i].IsRead = true } if err = issues[i].GetPoster(); err != nil { ctx.Handle(500, "issue.Issues(GetPoster)", fmt.Errorf("[#%d]%v", issues[i].Id, err)) return } } var uid int64 = -1 if ctx.User != nil { uid = ctx.User.Id } issueStats := models.GetIssueStats(ctx.Repo.Repository.Id, uid, isShowClosed, filterMode) ctx.Data["IssueStats"] = issueStats ctx.Data["SelectLabels"], _ = base.StrTo(selectLabels).Int64() ctx.Data["ViewType"] = viewType ctx.Data["Issues"] = issues ctx.Data["IsShowClosed"] = isShowClosed if isShowClosed { ctx.Data["State"] = "closed" ctx.Data["ShowCount"] = issueStats.ClosedCount } else { ctx.Data["ShowCount"] = issueStats.OpenCount } ctx.HTML(200, ISSUES) }