mirror of
https://github.com/go-gitea/gitea
synced 2025-07-22 18:28:37 +00:00
Fix counts on issues dashboard (#2215)
* Fix counts on issues dashboard * setupSess -> setupSession * Unit test * Load repo owners for issues
This commit is contained in:
@@ -270,94 +270,77 @@ func Issues(ctx *context.Context) {
|
||||
userRepoIDs = []int64{-1}
|
||||
}
|
||||
|
||||
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,
|
||||
})
|
||||
opts := &models.IssuesOptions{
|
||||
RepoID: repoID,
|
||||
IsClosed: util.OptionalBoolOf(isShowClosed),
|
||||
IsPull: util.OptionalBoolOf(isPullList),
|
||||
SortType: sortType,
|
||||
}
|
||||
|
||||
switch filterMode {
|
||||
case models.FilterModeAll:
|
||||
opts.RepoIDs = userRepoIDs
|
||||
case models.FilterModeAssign:
|
||||
opts.AssigneeID = ctxUser.ID
|
||||
case models.FilterModeCreate:
|
||||
opts.PosterID = ctxUser.ID
|
||||
case models.FilterModeMention:
|
||||
opts.MentionedID = ctxUser.ID
|
||||
}
|
||||
|
||||
counts, err := models.CountIssuesByRepo(opts)
|
||||
if err != nil {
|
||||
ctx.Handle(500, "CountIssuesByRepo", err)
|
||||
return
|
||||
}
|
||||
|
||||
opts.Page = page
|
||||
opts.PageSize = setting.UI.IssuePagingNum
|
||||
issues, err := models.Issues(opts)
|
||||
if err != nil {
|
||||
ctx.Handle(500, "Issues", err)
|
||||
return
|
||||
}
|
||||
|
||||
showRepos, err := models.IssueList(issues).LoadRepositories()
|
||||
if err != nil {
|
||||
ctx.Handle(500, "LoadRepositories", fmt.Errorf("%v", err))
|
||||
return
|
||||
showReposMap := make(map[int64]*models.Repository, len(counts))
|
||||
for repoID := range counts {
|
||||
repo, err := models.GetRepositoryByID(repoID)
|
||||
if err != nil {
|
||||
ctx.Handle(500, "GetRepositoryByID", err)
|
||||
return
|
||||
}
|
||||
showReposMap[repoID] = repo
|
||||
}
|
||||
|
||||
if repoID > 0 {
|
||||
var theRepo *models.Repository
|
||||
for _, repo := range showRepos {
|
||||
if repo.ID == repoID {
|
||||
theRepo = repo
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if theRepo == nil {
|
||||
theRepo, err = models.GetRepositoryByID(repoID)
|
||||
if _, ok := showReposMap[repoID]; !ok {
|
||||
repo, err := models.GetRepositoryByID(repoID)
|
||||
if err != nil {
|
||||
ctx.Handle(500, "GetRepositoryByID", fmt.Errorf("[#%d]%v", repoID, err))
|
||||
ctx.Handle(500, "GetRepositoryByID", fmt.Errorf("[%d]%v", repoID, err))
|
||||
return
|
||||
}
|
||||
showRepos = append(showRepos, theRepo)
|
||||
showReposMap[repoID] = repo
|
||||
}
|
||||
|
||||
repo := showReposMap[repoID]
|
||||
|
||||
// Check if user has access to given repository.
|
||||
if !theRepo.IsOwnedBy(ctxUser.ID) && !theRepo.HasAccess(ctxUser) {
|
||||
ctx.Handle(404, "Issues", fmt.Errorf("#%d", repoID))
|
||||
if !repo.IsOwnedBy(ctxUser.ID) && !repo.HasAccess(ctxUser) {
|
||||
ctx.Status(404)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
err = models.RepositoryList(showRepos).LoadAttributes()
|
||||
if err != nil {
|
||||
showRepos := models.RepositoryListOfMap(showReposMap)
|
||||
if err = showRepos.LoadAttributes(); err != nil {
|
||||
ctx.Handle(500, "LoadAttributes", fmt.Errorf("%v", err))
|
||||
return
|
||||
}
|
||||
|
||||
for _, issue := range issues {
|
||||
issue.Repo = showReposMap[issue.RepoID]
|
||||
}
|
||||
|
||||
issueStats := models.GetUserIssueStats(repoID, ctxUser.ID, userRepoIDs, filterMode, isPullList)
|
||||
|
||||
var total int
|
||||
@@ -369,6 +352,7 @@ func Issues(ctx *context.Context) {
|
||||
|
||||
ctx.Data["Issues"] = issues
|
||||
ctx.Data["Repos"] = showRepos
|
||||
ctx.Data["Counts"] = counts
|
||||
ctx.Data["Page"] = paginater.New(total, setting.UI.IssuePagingNum, page, 5)
|
||||
ctx.Data["IssueStats"] = issueStats
|
||||
ctx.Data["ViewType"] = viewType
|
||||
|
33
routers/user/home_test.go
Normal file
33
routers/user/home_test.go
Normal file
@@ -0,0 +1,33 @@
|
||||
// Copyright 2017 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package user
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/models"
|
||||
"code.gitea.io/gitea/modules/test"
|
||||
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestIssues(t *testing.T) {
|
||||
setting.UI.IssuePagingNum = 1
|
||||
assert.NoError(t, models.LoadFixtures())
|
||||
|
||||
ctx := test.MockContext(t)
|
||||
ctx.User = models.AssertExistsAndLoadBean(t, &models.User{ID: 2}).(*models.User)
|
||||
ctx.SetParams(":type", "issues")
|
||||
ctx.Req.Form.Set("state", "closed")
|
||||
Issues(ctx)
|
||||
assert.EqualValues(t, http.StatusOK, ctx.Resp.Status())
|
||||
|
||||
assert.EqualValues(t, map[int64]int64{1: 1, 2: 1}, ctx.Data["Counts"])
|
||||
assert.EqualValues(t, true, ctx.Data["IsShowClosed"])
|
||||
assert.Len(t, ctx.Data["Issues"], 1)
|
||||
assert.Len(t, ctx.Data["Repos"], 2)
|
||||
}
|
33
routers/user/main_test.go
Normal file
33
routers/user/main_test.go
Normal file
@@ -0,0 +1,33 @@
|
||||
// Copyright 2017 The Gitea Authors. All rights reserved.
|
||||
// Use of this source code is governed by a MIT-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package user
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/models"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
|
||||
_ "github.com/mattn/go-sqlite3" // for the test engine
|
||||
)
|
||||
|
||||
func TestMain(m *testing.M) {
|
||||
if err := models.CreateTestEngine("../../models/fixtures/"); err != nil {
|
||||
fmt.Printf("Error creating test engine: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
setting.AppURL = "https://try.gitea.io/"
|
||||
setting.RunUser = "runuser"
|
||||
setting.SSH.Port = 3000
|
||||
setting.SSH.Domain = "try.gitea.io"
|
||||
setting.RepoRootPath = filepath.Join(os.TempDir(), "repos")
|
||||
setting.AppDataPath = filepath.Join(os.TempDir(), "appdata")
|
||||
|
||||
os.Exit(m.Run())
|
||||
}
|
Reference in New Issue
Block a user