mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2025-06-01 04:12:10 +00:00
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
This commit is contained in:
parent
3a91ac51a9
commit
7a9a5c8a69
4 changed files with 181 additions and 123 deletions
|
@ -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)
|
||||
|
||||
if isPullList {
|
||||
allCount += repo.NumOpenPulls
|
||||
repo.NumOpenIssues = repo.NumOpenPulls
|
||||
repo.NumClosedIssues = repo.NumClosedPulls
|
||||
} else {
|
||||
allCount += repo.NumOpenIssues
|
||||
}
|
||||
|
||||
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 repo.ID == repoID ||
|
||||
(isShowClosed && repo.NumClosedIssues > 0) ||
|
||||
(!isShowClosed && repo.NumOpenIssues > 0) {
|
||||
showRepos = append(showRepos, repo)
|
||||
}
|
||||
}
|
||||
ctx.Data["Repos"] = showRepos
|
||||
if len(repoIDs) == 0 {
|
||||
repoIDs = []int64{-1}
|
||||
userRepoIDs = append(userRepoIDs, repo.ID)
|
||||
}
|
||||
|
||||
issueStats := models.GetUserIssueStats(repoID, ctxUser.ID, repoIDs, filterMode, isPullList)
|
||||
issueStats.AllCount = int64(allCount)
|
||||
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,
|
||||
})
|
||||
|
||||
page := ctx.QueryInt("page")
|
||||
if page <= 1 {
|
||||
page = 1
|
||||
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 err = repo.GetOwner(); err != nil {
|
||||
ctx.Handle(500, "GetOwner", fmt.Errorf("[#%d]%v", repoID, err))
|
||||
return
|
||||
}
|
||||
|
||||
// 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)
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
// 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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue