diff options
Diffstat (limited to 'routers')
-rw-r--r-- | routers/repo/issue.go | 23 | ||||
-rw-r--r-- | routers/user/home.go | 172 |
2 files changed, 110 insertions, 85 deletions
diff --git a/routers/repo/issue.go b/routers/repo/issue.go index e9b60175f3..a06f21b859 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -10,7 +10,6 @@ import ( "fmt" "io" "io/ioutil" - "net/url" "strings" "time" @@ -108,37 +107,17 @@ func Issues(ctx *context.Context) { viewType := ctx.Query("type") sortType := ctx.Query("sort") - types := []string{"assigned", "created_by", "mentioned"} + types := []string{"all", "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 mentionedID int64 forceEmpty bool ) - switch viewType { - case "assigned": - if assigneeID > 0 && ctx.User.ID != assigneeID { - // two different assignees, must be empty - forceEmpty = true - } else { - assigneeID = ctx.User.ID - } - case "created_by": - posterID = ctx.User.ID - case "mentioned": - mentionedID = ctx.User.ID - } repo := ctx.Repo.Repository selectLabels := ctx.Query("labels") diff --git a/routers/user/home.go b/routers/user/home.go index f5f6a0950d..00c417cb91 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -183,34 +183,39 @@ func Issues(ctx *context.Context) { viewType string sortType = ctx.Query("sort") filterMode = models.FilterModeAll - assigneeID int64 - posterID int64 ) + if ctxUser.IsOrganization() { viewType = "all" } else { viewType = ctx.Query("type") - types := []string{"assigned", "created_by"} + types := []string{"all", "assigned", "created_by"} if !com.IsSliceContainsStr(types, viewType) { viewType = "all" } switch viewType { + case "all": + filterMode = models.FilterModeAll case "assigned": filterMode = models.FilterModeAssign - assigneeID = ctxUser.ID case "created_by": filterMode = models.FilterModeCreate - posterID = ctxUser.ID } } + page := ctx.QueryInt("page") + if page <= 1 { + page = 1 + } + repoID := ctx.QueryInt64("repo") isShowClosed := ctx.Query("state") == "closed" // Get repositories. var err error var repos []*models.Repository + userRepoIDs := make([]int64, 0, len(repos)) if ctxUser.IsOrganization() { env, err := ctxUser.AccessibleReposEnv(ctx.User.ID) if err != nil { @@ -230,9 +235,6 @@ func Issues(ctx *context.Context) { repos = ctxUser.Repos } - 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 && @@ -240,85 +242,129 @@ func Issues(ctx *context.Context) { continue } - repoIDs = append(repoIDs, repo.ID) + userRepoIDs = append(userRepoIDs, repo.ID) + } - if isPullList { - allCount += repo.NumOpenPulls - repo.NumOpenIssues = repo.NumOpenPulls - repo.NumClosedIssues = repo.NumClosedPulls - } else { - allCount += repo.NumOpenIssues + var issues []*models.Issue + switch filterMode { + case models.FilterModeAll: + // Get all issues from repositories from this user. + issues, err = models.Issues(&models.IssuesOptions{ + RepoIDs: userRepoIDs, + RepoID: repoID, + Page: page, + IsClosed: util.OptionalBoolOf(isShowClosed), + IsPull: util.OptionalBoolOf(isPullList), + SortType: sortType, + }) + + case models.FilterModeAssign: + // Get all issues assigned to this user. + issues, err = models.Issues(&models.IssuesOptions{ + RepoID: repoID, + AssigneeID: ctxUser.ID, + Page: page, + IsClosed: util.OptionalBoolOf(isShowClosed), + IsPull: util.OptionalBoolOf(isPullList), + SortType: sortType, + }) + + case models.FilterModeCreate: + // Get all issues created by this user. + issues, err = models.Issues(&models.IssuesOptions{ + RepoID: repoID, + PosterID: ctxUser.ID, + Page: page, + IsClosed: util.OptionalBoolOf(isShowClosed), + IsPull: util.OptionalBoolOf(isPullList), + SortType: sortType, + }) + case models.FilterModeMention: + // Get all issues created by this user. + issues, err = models.Issues(&models.IssuesOptions{ + RepoID: repoID, + MentionedID: ctxUser.ID, + Page: page, + IsClosed: util.OptionalBoolOf(isShowClosed), + IsPull: util.OptionalBoolOf(isPullList), + SortType: sortType, + }) + } + + if err != nil { + ctx.Handle(500, "Issues", err) + return + } + + showRepos := make([]*models.Repository, 0, len(issues)) + showReposSet := make(map[int64]bool) + + if repoID > 0 { + repo, err := models.GetRepositoryByID(repoID) + if err != nil { + ctx.Handle(500, "GetRepositoryByID", fmt.Errorf("[#%d]%v", repoID, err)) + return } - if filterMode != models.FilterModeAll { - // Calculate repository issue count with filter mode. - numOpen, numClosed := repo.IssueStats(ctxUser.ID, filterMode, isPullList) - repo.NumOpenIssues, repo.NumClosedIssues = int(numOpen), int(numClosed) + if err = repo.GetOwner(); err != nil { + ctx.Handle(500, "GetOwner", fmt.Errorf("[#%d]%v", repoID, err)) + return } - if repo.ID == repoID || - (isShowClosed && repo.NumClosedIssues > 0) || - (!isShowClosed && repo.NumOpenIssues > 0) { - showRepos = append(showRepos, repo) + // Check if user has access to given repository. + if !repo.IsOwnedBy(ctxUser.ID) && !repo.HasAccess(ctxUser) { + ctx.Handle(404, "Issues", fmt.Errorf("#%d", repoID)) + return } + + showReposSet[repoID] = true + showRepos = append(showRepos, repo) } - ctx.Data["Repos"] = showRepos - if len(repoIDs) == 0 { - repoIDs = []int64{-1} - } - issueStats := models.GetUserIssueStats(repoID, ctxUser.ID, repoIDs, filterMode, isPullList) - issueStats.AllCount = int64(allCount) + for _, issue := range issues { + // Get Repository data. + issue.Repo, err = models.GetRepositoryByID(issue.RepoID) + if err != nil { + ctx.Handle(500, "GetRepositoryByID", fmt.Errorf("[#%d]%v", issue.RepoID, err)) + return + } + + // Get Owner data. + if err = issue.Repo.GetOwner(); err != nil { + ctx.Handle(500, "GetOwner", fmt.Errorf("[#%d]%v", issue.RepoID, err)) + return + } - page := ctx.QueryInt("page") - if page <= 1 { - page = 1 + // Append repo to list of shown repos + if filterMode == models.FilterModeAll { + // Use a map to make sure we don't add the same Repository twice. + _, ok := showReposSet[issue.RepoID] + if !ok { + showReposSet[issue.RepoID] = true + // Append to list of shown Repositories. + showRepos = append(showRepos, issue.Repo) + } + } } + issueStats := models.GetUserIssueStats(repoID, ctxUser.ID, userRepoIDs, filterMode, isPullList) + var total int if !isShowClosed { total = int(issueStats.OpenCount) } else { total = int(issueStats.ClosedCount) } - ctx.Data["Page"] = paginater.New(total, setting.UI.IssuePagingNum, page, 5) - - // Get issues. - issues, err := models.Issues(&models.IssuesOptions{ - AssigneeID: assigneeID, - RepoID: repoID, - PosterID: posterID, - RepoIDs: repoIDs, - Page: page, - IsClosed: util.OptionalBoolOf(isShowClosed), - IsPull: util.OptionalBoolOf(isPullList), - SortType: sortType, - }) - if err != nil { - ctx.Handle(500, "Issues", 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 - } - } ctx.Data["Issues"] = issues - + ctx.Data["Repos"] = showRepos + ctx.Data["Page"] = paginater.New(total, setting.UI.IssuePagingNum, page, 5) 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 { |