diff options
author | Lunny Xiao <xiaolunwen@gmail.com> | 2017-02-14 22:15:18 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-14 22:15:18 +0800 |
commit | 7a9a5c8a69c2a3ba107a4dbc199f052d58262033 (patch) | |
tree | a6940099182c4427ff010fc2368aeabb67b57ff6 /routers/user/home.go | |
parent | 3a91ac51a93aa6e352896048ce37c01227b42055 (diff) | |
download | gitea-7a9a5c8a69c2a3ba107a4dbc199f052d58262033.tar.gz gitea-7a9a5c8a69c2a3ba107a4dbc199f052d58262033.zip |
Fix assigned issues dashboard (#920)
* Fix assigned/created issues in dashboard. (#3560)
* Fix assigned/created issues in dashboard.
* Use GetUserIssueStats for getting all Dashboard stats.
* Use gofmt to format the file properly.
* Replace &Issue{} with new(Issue).
* Check if user has access to given repository.
* Remove unnecessary filtering of issues.
* Return 404 error if invalid repository is given.
* Use correct number of issues in paginater.
* fix issues on dashboard
Diffstat (limited to 'routers/user/home.go')
-rw-r--r-- | routers/user/home.go | 172 |
1 files changed, 109 insertions, 63 deletions
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 { |