|
@@ -172,35 +172,39 @@ func Issues(ctx *context.Context) {
|
|
|
var (
|
|
|
viewType string
|
|
|
sortType = ctx.Query("sort")
|
|
|
- filterMode = models.FM_ALL
|
|
|
- assigneeID int64
|
|
|
- posterID int64
|
|
|
+ filterMode = models.FM_YOUR_REPOSITORIES
|
|
|
)
|
|
|
if ctxUser.IsOrganization() {
|
|
|
- viewType = "all"
|
|
|
+ viewType = "your_repositories"
|
|
|
} else {
|
|
|
viewType = ctx.Query("type")
|
|
|
- types := []string{"assigned", "created_by"}
|
|
|
+ types := []string{"your_repositories", "assigned", "created_by"}
|
|
|
if !com.IsSliceContainsStr(types, viewType) {
|
|
|
- viewType = "all"
|
|
|
+ viewType = "your_repositories"
|
|
|
}
|
|
|
|
|
|
switch viewType {
|
|
|
+ case "your_repositories":
|
|
|
+ filterMode = models.FM_YOUR_REPOSITORIES
|
|
|
case "assigned":
|
|
|
filterMode = models.FM_ASSIGN
|
|
|
- assigneeID = ctxUser.ID
|
|
|
case "created_by":
|
|
|
filterMode = models.FM_CREATE
|
|
|
- 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() {
|
|
|
repos, _, err = ctxUser.GetUserRepositories(ctx.User.ID, 1, ctxUser.NumRepos)
|
|
|
if err != nil {
|
|
@@ -215,9 +219,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 &&
|
|
@@ -225,83 +226,119 @@ 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.FM_YOUR_REPOSITORIES:
|
|
|
+ // Get all issues from repositories from this user.
|
|
|
+ issues, err = models.Issues(&models.IssuesOptions{
|
|
|
+ RepoIDs: userRepoIDs,
|
|
|
+ RepoID: repoID,
|
|
|
+ Page: page,
|
|
|
+ IsClosed: isShowClosed,
|
|
|
+ IsPull: isPullList,
|
|
|
+ SortType: sortType,
|
|
|
+ })
|
|
|
+
|
|
|
+ case models.FM_ASSIGN:
|
|
|
+ // Get all issues assigned to this user.
|
|
|
+ issues, err = models.Issues(&models.IssuesOptions{
|
|
|
+ RepoID: repoID,
|
|
|
+ AssigneeID: ctxUser.ID,
|
|
|
+ Page: page,
|
|
|
+ IsClosed: isShowClosed,
|
|
|
+ IsPull: isPullList,
|
|
|
+ SortType: sortType,
|
|
|
+ })
|
|
|
+
|
|
|
+ case models.FM_CREATE:
|
|
|
+ // Get all issues created by this user.
|
|
|
+ issues, err = models.Issues(&models.IssuesOptions{
|
|
|
+ RepoID: repoID,
|
|
|
+ PosterID: ctxUser.ID,
|
|
|
+ Page: page,
|
|
|
+ IsClosed: isShowClosed,
|
|
|
+ IsPull: 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.FM_ALL {
|
|
|
- // 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
|
|
|
|
|
|
- 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
|
|
|
+ }
|
|
|
|
|
|
- page := ctx.QueryInt("page")
|
|
|
- if page <= 1 {
|
|
|
- page = 1
|
|
|
+ // 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.FM_YOUR_REPOSITORIES {
|
|
|
+ // 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{
|
|
|
- UserID: ctxUser.ID,
|
|
|
- AssigneeID: assigneeID,
|
|
|
- RepoID: repoID,
|
|
|
- PosterID: posterID,
|
|
|
- RepoIDs: repoIDs,
|
|
|
- Page: page,
|
|
|
- IsClosed: isShowClosed,
|
|
|
- IsPull: 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 {
|