aboutsummaryrefslogtreecommitdiffstats
path: root/routers/user/home.go
diff options
context:
space:
mode:
authorLunny Xiao <xiaolunwen@gmail.com>2017-02-14 22:15:18 +0800
committerGitHub <noreply@github.com>2017-02-14 22:15:18 +0800
commit7a9a5c8a69c2a3ba107a4dbc199f052d58262033 (patch)
treea6940099182c4427ff010fc2368aeabb67b57ff6 /routers/user/home.go
parent3a91ac51a93aa6e352896048ce37c01227b42055 (diff)
downloadgitea-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.go172
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 {