summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--models/issue.go7
-rw-r--r--routers/web/user/home.go51
2 files changed, 53 insertions, 5 deletions
diff --git a/models/issue.go b/models/issue.go
index 53ee585dc0..79771ce15c 100644
--- a/models/issue.go
+++ b/models/issue.go
@@ -1603,6 +1603,7 @@ const (
FilterModeCreate
FilterModeMention
FilterModeReviewRequested
+ FilterModeYourRepositories
)
func parseCountResult(results []map[string][]byte) int64 {
@@ -1747,6 +1748,7 @@ type UserIssueStatsOptions struct {
IssueIDs []int64
IsArchived util.OptionalBool
LabelIDs []int64
+ RepoCond builder.Cond
Org *Organization
Team *Team
}
@@ -1764,6 +1766,9 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
if len(opts.IssueIDs) > 0 {
cond = cond.And(builder.In("issue.id", opts.IssueIDs))
}
+ if opts.RepoCond != nil {
+ cond = cond.And(opts.RepoCond)
+ }
if opts.UserID > 0 {
cond = cond.And(issuePullAccessibleRepoCond("issue.repo_id", opts.UserID, opts.Org, opts.Team, opts.IsPull))
@@ -1785,7 +1790,7 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
}
switch opts.FilterMode {
- case FilterModeAll:
+ case FilterModeAll, FilterModeYourRepositories:
stats.OpenCount, err = sess(cond).
And("issue.is_closed = ?", false).
Count(new(Issue))
diff --git a/routers/web/user/home.go b/routers/web/user/home.go
index 0878e8d528..d3810f887d 100644
--- a/routers/web/user/home.go
+++ b/routers/web/user/home.go
@@ -362,7 +362,7 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
var (
viewType string
sortType = ctx.FormString("sort")
- filterMode = models.FilterModeAll
+ filterMode int
)
// --------------------------------------------------------------------------------
@@ -388,8 +388,10 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
filterMode = models.FilterModeMention
case "review_requested":
filterMode = models.FilterModeReviewRequested
- case "your_repositories": // filterMode already set to All
+ case "your_repositories":
+ fallthrough
default:
+ filterMode = models.FilterModeYourRepositories
viewType = "your_repositories"
}
@@ -419,6 +421,30 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
User: ctx.Doer,
}
+ // Search all repositories which
+ //
+ // As user:
+ // - Owns the repository.
+ // - Have collaborator permissions in repository.
+ //
+ // As org:
+ // - Owns the repository.
+ //
+ // As team:
+ // - Team org's owns the repository.
+ // - Team has read permission to repository.
+ repoOpts := &models.SearchRepoOptions{
+ Actor: ctx.Doer,
+ OwnerID: ctx.Doer.ID,
+ Private: true,
+ AllPublic: false,
+ AllLimited: false,
+ }
+
+ if ctxUser.IsOrganization() && ctx.Org.Team != nil {
+ repoOpts.TeamID = ctx.Org.Team.ID
+ }
+
switch filterMode {
case models.FilterModeAll:
case models.FilterModeAssign:
@@ -429,6 +455,19 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
opts.MentionedID = ctx.Doer.ID
case models.FilterModeReviewRequested:
opts.ReviewRequestedID = ctx.Doer.ID
+ case models.FilterModeYourRepositories:
+ if ctxUser.IsOrganization() && ctx.Org.Team != nil {
+ // Fixes a issue whereby the user's ID would be used
+ // to check if it's in the team(which possible isn't the case).
+ opts.User = nil
+ }
+ userRepoIDs, _, err := models.SearchRepositoryIDs(repoOpts)
+ if err != nil {
+ ctx.ServerError("models.SearchRepositoryIDs: %v", err)
+ return
+ }
+
+ opts.RepoIDs = userRepoIDs
}
// keyword holds the search term entered into the search field.
@@ -560,8 +599,12 @@ func buildIssueOverview(ctx *context.Context, unitType unit.Type) {
Org: org,
Team: team,
}
- if len(repoIDs) > 0 {
- statsOpts.RepoIDs = repoIDs
+ if filterMode == models.FilterModeYourRepositories {
+ statsOpts.RepoCond = models.SearchRepositoryCondition(repoOpts)
+ }
+ // Detect when we only should search by team.
+ if opts.User == nil {
+ statsOpts.UserID = 0
}
issueStats, err = models.GetUserIssueStats(statsOpts)
if err != nil {