func Explore(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("explore") ctx.Data["PageIsExploreRepositories"] = true page := ctx.QueryInt("page") if page <= 1 { page = 1 } ctx.Data["Page"] = paginater.New(int(models.CountRepositories()), setting.ExplorePagingNum, page, 5) repos, err := models.GetRecentUpdatedRepositories(page) if err != nil { ctx.Handle(500, "GetRecentUpdatedRepositories", err) return } for _, repo := range repos { if err = repo.GetOwner(); err != nil { ctx.Handle(500, "GetOwner", fmt.Errorf("%d: %v", repo.ID, err)) return } } ctx.Data["Repos"] = repos ctx.HTML(200, EXPLORE_REPOS) }
func Stars(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("repos.stars") page := ctx.QueryInt("page") if page <= 0 { page = 1 } ctx.Data["Page"] = paginater.New(ctx.Repo.Repository.NumStars, models.ItemsPerPage, page, 5) stars, err := ctx.Repo.Repository.GetStars(ctx.QueryInt("page")) if err != nil { ctx.Handle(500, "GetStars", err) return } if (ctx.QueryInt("page")-1)*models.ItemsPerPage > ctx.Repo.Repository.NumStars { ctx.Handle(404, "ctx.Repo.Repository.NumStars", nil) return } ctx.Data["Stars"] = stars ctx.HTML(200, STARS) }
func Commits(ctx *middleware.Context) { ctx.Data["PageIsCommits"] = true commitsCount, err := ctx.Repo.Commit.CommitsCount() if err != nil { ctx.Handle(500, "GetCommitsCount", err) return } page := ctx.QueryInt("page") if page <= 1 { page = 1 } ctx.Data["Page"] = paginater.New(int(commitsCount), git.CommitsRangeSize, page, 5) // Both `git log branchName` and `git log commitId` work. commits, err := ctx.Repo.Commit.CommitsByRange(page) if err != nil { ctx.Handle(500, "CommitsByRange", err) return } commits = RenderIssueLinks(commits, ctx.Repo.RepoLink) commits = models.ValidateCommitsWithEmails(commits) ctx.Data["Commits"] = commits ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name ctx.Data["CommitCount"] = commitsCount ctx.Data["Branch"] = ctx.Repo.BranchName ctx.HTML(200, COMMITS) }
func showOrgProfile(ctx *context.Context) { ctx.SetParams(":org", ctx.Params(":username")) context.HandleOrgAssignment(ctx) if ctx.Written() { return } org := ctx.Org.Organization ctx.Data["Title"] = org.FullName page := ctx.QueryInt("page") if page <= 0 { page = 1 } var ( repos []*models.Repository count int64 err error ) if ctx.IsSigned && !ctx.User.IsAdmin { repos, count, err = org.GetUserRepositories(ctx.User.ID, page, setting.UI.User.RepoPagingNum) if err != nil { ctx.Handle(500, "GetUserRepositories", err) return } ctx.Data["Repos"] = repos } else { showPrivate := ctx.IsSigned && ctx.User.IsAdmin repos, err = models.GetUserRepositories(org.ID, showPrivate, page, setting.UI.User.RepoPagingNum) if err != nil { ctx.Handle(500, "GetRepositories", err) return } ctx.Data["Repos"] = repos count = models.CountUserRepositories(org.ID, showPrivate) } ctx.Data["Page"] = paginater.New(int(count), setting.UI.User.RepoPagingNum, page, 5) if err := org.GetMembers(); err != nil { ctx.Handle(500, "GetMembers", err) return } ctx.Data["Members"] = org.Members ctx.Data["Teams"] = org.Teams ctx.HTML(200, ORG_HOME) }
func RenderRepoSearch(ctx *context.Context, counter func() int64, ranger func(int, int) ([]*models.Repository, error), pagingNum int, orderBy string, tplName base.TplName) { page := ctx.QueryInt("page") if page <= 1 { page = 1 } var ( repos []*models.Repository count int64 err error ) keyword := ctx.Query("q") if len(keyword) == 0 { repos, err = ranger(page, pagingNum) if err != nil { ctx.Handle(500, "ranger", err) return } count = counter() } else { repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ Keyword: keyword, OrderBy: orderBy, Page: page, PageSize: pagingNum, }) if err != nil { ctx.Handle(500, "SearchRepositoryByName", err) return } } ctx.Data["Keyword"] = keyword ctx.Data["Total"] = count ctx.Data["Page"] = paginater.New(int(count), pagingNum, page, 5) for _, repo := range repos { if err = repo.GetOwner(); err != nil { ctx.Handle(500, "GetOwner", fmt.Errorf("%d: %v", repo.ID, err)) return } } ctx.Data["Repos"] = repos ctx.HTML(200, tplName) }
func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { page := ctx.QueryInt("page") if page <= 0 { page = 1 } var ( repos []*models.Repository count int64 err error ) keyword := ctx.Query("q") if len(keyword) == 0 { repos, err = opts.Ranger(page, opts.PageSize) if err != nil { ctx.Handle(500, "opts.Ranger", err) return } count = opts.Counter(opts.Private) } else { repos, count, err = models.SearchRepositoryByName(&models.SearchRepoOptions{ Keyword: keyword, OrderBy: opts.OrderBy, Private: opts.Private, Page: page, PageSize: opts.PageSize, }) if err != nil { ctx.Handle(500, "SearchRepositoryByName", err) return } } ctx.Data["Keyword"] = keyword ctx.Data["Total"] = count ctx.Data["Page"] = paginater.New(int(count), opts.PageSize, page, 5) for _, repo := range repos { if err = repo.GetOwner(); err != nil { ctx.Handle(500, "GetOwner", fmt.Errorf("%d: %v", repo.ID, err)) return } } ctx.Data["Repos"] = repos ctx.HTML(200, opts.TplName) }
func renderItems(ctx *middleware.Context, total int, getter func(page int) ([]*models.User, error)) { page := ctx.QueryInt("page") if page <= 0 { page = 1 } pager := paginater.New(total, models.ItemsPerPage, page, 5) ctx.Data["Page"] = pager items, err := getter(pager.Current()) if err != nil { ctx.Handle(500, "getter", err) return } ctx.Data["Watchers"] = items ctx.HTML(200, WATCHERS) }
func RenderUserCards(ctx *context.Context, total int, getter func(page int) ([]*models.User, error), tpl base.TplName) { page := ctx.QueryInt("page") if page <= 0 { page = 1 } pager := paginater.New(total, models.ItemsPerPage, page, 5) ctx.Data["Page"] = pager items, err := getter(pager.Current()) if err != nil { ctx.Handle(500, "getter", err) return } ctx.Data["Cards"] = items ctx.HTML(200, tpl) }
func Milestones(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("repo.milestones") ctx.Data["PageIsIssueList"] = true ctx.Data["PageIsMilestones"] = true isShowClosed := ctx.Query("state") == "closed" openCount, closedCount := models.MilestoneStats(ctx.Repo.Repository.ID) ctx.Data["OpenCount"] = openCount ctx.Data["ClosedCount"] = closedCount page := ctx.QueryInt("page") if page <= 1 { page = 1 } var total int if !isShowClosed { total = int(openCount) } else { total = int(closedCount) } ctx.Data["Page"] = paginater.New(total, setting.IssuePagingNum, page, 5) miles, err := models.GetMilestones(ctx.Repo.Repository.ID, page, isShowClosed) if err != nil { ctx.Handle(500, "GetMilestones", err) return } for _, m := range miles { m.RenderedContent = string(base.RenderMarkdown([]byte(m.Content), ctx.Repo.RepoLink, ctx.Repo.Repository.ComposeMetas())) m.CalOpenIssues() } ctx.Data["Milestones"] = miles if isShowClosed { ctx.Data["State"] = "closed" } else { ctx.Data["State"] = "open" } ctx.Data["IsShowClosed"] = isShowClosed ctx.HTML(200, MILESTONE) }
func Index(c *middleware.Context) { var ( p = c.ParamsInt(":p") ) sites, e := models.SiteList(p) if e != nil { color.Red("%s", e) } cnt, e := models.SiteCount() if e != nil { color.Red("%s", e) } c.Data["sites"] = sites c.Data["sites_count"] = cnt c.Data["paginater"] = paginater.New(int(cnt), 10, p, 5) c.HTML(200, "catalog/index") }
func AllFeed(c *middleware.Context) { p := c.ParamsInt(":p") if p < 1 { p = 1 } feed, e := models.GetFeed(p) if e != nil { color.Red("%s", e) } cnt, e := models.FeedCount() if e != nil { color.Red("%s", e) } c.Data["feed"] = feed c.Data["paginater"] = paginater.New(int(cnt), 10, p, 5) c.HTML(200, "catalog/feed") }
func RenderUserSearch(ctx *context.Context, userType models.UserType, counter func() int64, ranger func(int, int) ([]*models.User, error), pagingNum int, orderBy string, tplName base.TplName) { page := ctx.QueryInt("page") if page <= 1 { page = 1 } var ( users []*models.User count int64 err error ) keyword := ctx.Query("q") if len(keyword) == 0 { users, err = ranger(page, pagingNum) if err != nil { ctx.Handle(500, "ranger", err) return } count = counter() } else { users, count, err = models.SearchUserByName(&models.SearchUserOptions{ Keyword: keyword, Type: userType, OrderBy: orderBy, Page: page, PageSize: pagingNum, }) if err != nil { ctx.Handle(500, "SearchUserByName", err) return } } ctx.Data["Keyword"] = keyword ctx.Data["Total"] = count ctx.Data["Page"] = paginater.New(int(count), pagingNum, page, 5) ctx.Data["Users"] = users ctx.HTML(200, tplName) }
func (ctx *APIContext) SetLinkHeader(total, pageSize int) { page := paginater.New(total, pageSize, ctx.QueryInt("page"), 0) links := make([]string, 0, 4) if page.HasNext() { links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"next\"", setting.AppUrl, ctx.Req.URL.Path[1:], page.Next())) } if !page.IsLast() { links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"last\"", setting.AppUrl, ctx.Req.URL.Path[1:], page.TotalPages())) } if !page.IsFirst() { links = append(links, fmt.Sprintf("<%s%s?page=1>; rel=\"first\"", setting.AppUrl, ctx.Req.URL.Path[1:])) } if page.HasPrevious() { links = append(links, fmt.Sprintf("<%s%s?page=%d>; rel=\"prev\"", setting.AppUrl, ctx.Req.URL.Path[1:], page.Previous())) } if len(links) > 0 { ctx.Header().Set("Link", strings.Join(links, ",")) } }
func FileHistory(ctx *middleware.Context) { ctx.Data["IsRepoToolbarCommits"] = true fileName := ctx.Repo.TreeName if len(fileName) == 0 { Commits(ctx) return } branchName := ctx.Repo.BranchName commitsCount, err := ctx.Repo.GitRepo.FileCommitsCount(branchName, fileName) if err != nil { ctx.Handle(500, "FileCommitsCount", err) return } else if commitsCount == 0 { ctx.Handle(404, "FileCommitsCount", nil) return } page := ctx.QueryInt("page") if page <= 1 { page = 1 } ctx.Data["Page"] = paginater.New(int(commitsCount), git.CommitsRangeSize, page, 5) commits, err := ctx.Repo.GitRepo.CommitsByFileAndRange(branchName, fileName, page) if err != nil { ctx.Handle(500, "CommitsByFileAndRange", err) return } commits = RenderIssueLinks(commits, ctx.Repo.RepoLink) commits = models.ValidateCommitsWithEmails(commits) ctx.Data["Commits"] = commits ctx.Data["Username"] = ctx.Repo.Owner.Name ctx.Data["Reponame"] = ctx.Repo.Repository.Name ctx.Data["FileName"] = fileName ctx.Data["CommitCount"] = commitsCount ctx.Data["Branch"] = branchName ctx.HTML(200, COMMITS) }
func Feed(c *middleware.Context) { sid := c.ParamsInt64(":id") p := c.ParamsInt(":p") if p < 1 { p = 1 } feed, e := models.GetSiteFeed(sid, p) if e != nil { color.Red("%s", e) } cnt, e := models.SiteFeedCount(sid) if e != nil { color.Red("%s", e) } c.Data["feed"] = feed c.Data["paginater"] = paginater.New(int(cnt), 10, p, 5) c.Data["SiteId"] = sid c.HTML(200, "catalog/feed") }
func RenderUserSearch(ctx *context.Context, opts *UserSearchOptions) { page := ctx.QueryInt("page") if page <= 1 { page = 1 } var ( users []*models.User count int64 err error ) keyword := ctx.Query("q") if len(keyword) == 0 { users, err = opts.Ranger(page, opts.PageSize) if err != nil { ctx.Handle(500, "opts.Ranger", err) return } count = opts.Counter() } else { users, count, err = models.SearchUserByName(&models.SearchUserOptions{ Keyword: keyword, Type: opts.Type, OrderBy: opts.OrderBy, Page: page, PageSize: opts.PageSize, }) if err != nil { ctx.Handle(500, "SearchUserByName", err) return } } ctx.Data["Keyword"] = keyword ctx.Data["Total"] = count ctx.Data["Page"] = paginater.New(int(count), opts.PageSize, page, 5) ctx.Data["Users"] = users ctx.HTML(200, opts.TplName) }
func Users(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("admin.users") ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminUsers"] = true total := models.CountUsers() page := ctx.QueryInt("page") if page <= 1 { page = 1 } ctx.Data["Page"] = paginater.New(int(total), setting.AdminUserPagingNum, page, 5) users, err := models.Users(page, setting.AdminUserPagingNum) if err != nil { ctx.Handle(500, "Users", err) return } ctx.Data["Users"] = users ctx.Data["Total"] = total ctx.HTML(200, USERS) }
func Repositories(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("admin.repositories") ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminRepositories"] = true total := models.CountRepositories() page := ctx.QueryInt("page") if page <= 1 { page = 1 } ctx.Data["Page"] = paginater.New(int(total), setting.AdminRepoPagingNum, page, 5) repos, err := models.RepositoriesWithUsers(page, setting.AdminRepoPagingNum) if err != nil { ctx.Handle(500, "RepositoriesWithUsers", err) return } ctx.Data["Repos"] = repos ctx.Data["Total"] = total ctx.HTML(200, REPOS) }
func Notices(ctx *context.Context) { ctx.Data["Title"] = ctx.Tr("admin.notices") ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminNotices"] = true total := models.CountNotices() page := ctx.QueryInt("page") if page <= 1 { page = 1 } ctx.Data["Page"] = paginater.New(int(total), setting.AdminNoticePagingNum, page, 5) notices, err := models.Notices(page, setting.AdminNoticePagingNum) if err != nil { ctx.Handle(500, "Notices", err) return } ctx.Data["Notices"] = notices ctx.Data["Total"] = total ctx.HTML(200, NOTICES) }
func Organizations(ctx *middleware.Context) { ctx.Data["Title"] = ctx.Tr("admin.organizations") ctx.Data["PageIsAdmin"] = true ctx.Data["PageIsAdminOrganizations"] = true total := models.CountOrganizations() page := ctx.QueryInt("page") if page <= 1 { page = 1 } ctx.Data["Page"] = paginater.New(int(total), setting.AdminOrgPagingNum, page, 5) orgs, err := models.Organizations(page, setting.AdminOrgPagingNum) if err != nil { ctx.Handle(500, "Organizations", err) return } ctx.Data["Orgs"] = orgs ctx.Data["Total"] = total ctx.HTML(200, ORGS) }
func Profile(ctx *context.Context) { uname := ctx.Params(":username") // Special handle for FireFox requests favicon.ico. if uname == "favicon.ico" { ctx.ServeFile(path.Join(setting.StaticRootPath, "public/img/favicon.png")) return } else if strings.HasSuffix(uname, ".png") { ctx.Error(404) return } isShowKeys := false if strings.HasSuffix(uname, ".keys") { isShowKeys = true } ctxUser := GetUserByName(ctx, strings.TrimSuffix(uname, ".keys")) if ctx.Written() { return } // Show SSH keys. if isShowKeys { ShowSSHKeys(ctx, ctxUser.ID) return } if ctxUser.IsOrganization() { showOrgProfile(ctx) return } ctx.Data["Title"] = ctxUser.DisplayName() ctx.Data["PageIsUserProfile"] = true ctx.Data["Owner"] = ctxUser orgs, err := models.GetOrgsByUserID(ctxUser.ID, ctx.IsSigned && (ctx.User.IsAdmin || ctx.User.ID == ctxUser.ID)) if err != nil { ctx.Handle(500, "GetOrgsByUserIDDesc", err) return } ctx.Data["Orgs"] = orgs tab := ctx.Query("tab") ctx.Data["TabName"] = tab switch tab { case "activity": retrieveFeeds(ctx, ctxUser, -1, 0, true) if ctx.Written() { return } default: page := ctx.QueryInt("page") if page <= 0 { page = 1 } ctx.Data["Repos"], err = models.GetUserRepositories(ctxUser.ID, ctx.IsSigned && ctx.User.ID == ctxUser.ID, page, setting.UI.User.RepoPagingNum) if err != nil { ctx.Handle(500, "GetRepositories", err) return } ctx.Data["Page"] = paginater.New(ctxUser.NumRepos, setting.UI.User.RepoPagingNum, page, 5) } ctx.HTML(200, PROFILE) }
func Issues(ctx *middleware.Context) { isPullList := ctx.Params(":type") == "pulls" if isPullList { ctx.Data["Title"] = ctx.Tr("pull_requests") ctx.Data["PageIsPulls"] = true } else { ctx.Data["Title"] = ctx.Tr("issues") ctx.Data["PageIsIssues"] = true } ctxUser := getDashboardContextUser(ctx) if ctx.Written() { return } // Organization does not have view type and filter mode. var ( viewType string sortType = ctx.Query("sort") filterMode = models.FM_ALL assigneeID int64 posterID int64 ) if ctxUser.IsOrganization() { viewType = "all" } else { viewType = ctx.Query("type") types := []string{"assigned", "created_by"} if !com.IsSliceContainsStr(types, viewType) { viewType = "all" } switch viewType { case "assigned": filterMode = models.FM_ASSIGN assigneeID = ctxUser.Id case "created_by": filterMode = models.FM_CREATE posterID = ctxUser.Id } } repoID := ctx.QueryInt64("repo") isShowClosed := ctx.Query("state") == "closed" // Get repositories. repos, err := models.GetRepositories(ctxUser.Id, true) if err != nil { ctx.Handle(500, "GetRepositories", err) return } allCount := 0 repoIDs := make([]int64, 0, len(repos)) showRepos := make([]*models.Repository, 0, len(repos)) for _, repo := range repos { if (isPullList && repo.NumPulls == 0) || (!isPullList && repo.NumIssues == 0) { continue } repoIDs = append(repoIDs, repo.ID) if isPullList { allCount += repo.NumOpenPulls repo.NumOpenIssues = repo.NumOpenPulls repo.NumClosedIssues = repo.NumClosedPulls } else { allCount += repo.NumOpenIssues } if filterMode != models.FM_ALL { // Calculate repository issue count with filter mode. numOpen, numClosed := repo.IssueStats(ctxUser.Id, filterMode, isPullList) repo.NumOpenIssues, repo.NumClosedIssues = int(numOpen), int(numClosed) } if repo.ID == repoID || (isShowClosed && repo.NumClosedIssues > 0) || (!isShowClosed && repo.NumOpenIssues > 0) { showRepos = append(showRepos, repo) } } ctx.Data["Repos"] = showRepos issueStats := models.GetUserIssueStats(repoID, ctxUser.Id, repoIDs, filterMode, isPullList) issueStats.AllCount = int64(allCount) page := ctx.QueryInt("page") if page <= 1 { page = 1 } var total int if !isShowClosed { total = int(issueStats.OpenCount) } else { total = int(issueStats.ClosedCount) } ctx.Data["Page"] = paginater.New(total, setting.IssuePagingNum, page, 5) // Get issues. issues, err := models.Issues(&models.IssuesOptions{ UserID: ctxUser.Id, AssigneeID: assigneeID, RepoID: repoID, PosterID: posterID, RepoIDs: repoIDs, Page: page, IsClosed: isShowClosed, IsPull: isPullList, SortType: sortType, }) if err != nil { ctx.Handle(500, "Issues: %v", err) return } // Get posters and repository. for i := range issues { issues[i].Repo, err = models.GetRepositoryByID(issues[i].RepoID) if err != nil { ctx.Handle(500, "GetRepositoryByID", fmt.Errorf("[#%d]%v", issues[i].ID, err)) return } if err = issues[i].Repo.GetOwner(); err != nil { ctx.Handle(500, "GetOwner", fmt.Errorf("[#%d]%v", issues[i].ID, err)) return } if err = issues[i].GetPoster(); err != nil { ctx.Handle(500, "GetPoster", fmt.Errorf("[#%d]%v", issues[i].ID, err)) return } } ctx.Data["Issues"] = issues ctx.Data["IssueStats"] = issueStats ctx.Data["ViewType"] = viewType ctx.Data["SortType"] = sortType ctx.Data["RepoID"] = repoID 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"] = 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" } // 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") isShowClosed := ctx.Query("state") == "closed" issueStats := models.GetIssueStats(repo.ID, uid, com.StrTo(selectLabels).MustInt64(), milestoneID, isShowClosed, filterMode) page := ctx.QueryInt("page") if page <= 1 { page = 1 } var total int if !isShowClosed { total = int(issueStats.OpenCount) } else { total = int(issueStats.ClosedCount) } ctx.Data["Page"] = paginater.New(total, setting.IssuePagingNum, page, 5) // Get issues. issues, err := models.Issues(uid, assigneeID, repo.ID, posterID, milestoneID, page, isShowClosed, filterMode == models.FM_MENTION, selectLabels, ctx.Query("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. miles, err := models.GetAllRepoMilestones(repo.ID) if err != nil { ctx.Handle(500, "GetAllRepoMilestones: %v", err) return } ctx.Data["Milestones"] = miles ctx.Data["IssueStats"] = issueStats ctx.Data["SelectLabels"] = com.StrTo(selectLabels).MustInt64() ctx.Data["ViewType"] = viewType ctx.Data["MilestoneID"] = milestoneID ctx.Data["IsShowClosed"] = isShowClosed if isShowClosed { ctx.Data["State"] = "closed" } else { ctx.Data["State"] = "open" } 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) }