mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08: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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user