diff --git a/models/issue.go b/models/issue.go index 8c135faa8df3d..a4d3d1abdd528 100644 --- a/models/issue.go +++ b/models/issue.go @@ -1090,6 +1090,7 @@ type IssuesOptions struct { AssigneeID int64 PosterID int64 MentionedID int64 + ReviewPendingID int64 MilestoneIDs []int64 ProjectID int64 ProjectBoardID int64 @@ -1176,6 +1177,12 @@ func (opts *IssuesOptions) setupSession(sess *xorm.Session) { And("issue_user.uid = ?", opts.MentionedID) } + if opts.ReviewPendingID > 0 { + sess.Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id"). + And("r.reviewer_id = ?", opts.ReviewPendingID). + And("r.type = ?", ReviewTypePending) + } + if len(opts.MilestoneIDs) > 0 { sess.In("issue.milestone_id", opts.MilestoneIDs) } @@ -1359,6 +1366,7 @@ type IssueStats struct { AssignCount int64 CreateCount int64 MentionCount int64 + ReviewPendingCount int64 } // Filter modes. @@ -1367,6 +1375,7 @@ const ( FilterModeAssign FilterModeCreate FilterModeMention + FilterModeReviewPending ) func parseCountResult(results []map[string][]byte) int64 { @@ -1381,14 +1390,15 @@ func parseCountResult(results []map[string][]byte) int64 { // IssueStatsOptions contains parameters accepted by GetIssueStats. type IssueStatsOptions struct { - RepoID int64 - Labels string - MilestoneID int64 - AssigneeID int64 - MentionedID int64 - PosterID int64 - IsPull util.OptionalBool - IssueIDs []int64 + RepoID int64 + Labels string + MilestoneID int64 + AssigneeID int64 + MentionedID int64 + PosterID int64 + ReviewPendingID int64 + IsPull util.OptionalBool + IssueIDs []int64 } // GetIssueStats returns issue statistic information by given conditions. @@ -1417,6 +1427,7 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) { accum.AssignCount += stats.AssignCount accum.CreateCount += stats.CreateCount accum.OpenCount += stats.MentionCount + accum.ReviewPendingCount += stats.ReviewPendingCount i = chunk } return accum, nil @@ -1468,6 +1479,12 @@ func getIssueStatsChunk(opts *IssueStatsOptions, issueIDs []int64) (*IssueStats, And("issue_user.is_mentioned = ?", true) } + if opts.ReviewPendingID > 0 { + sess.Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id"). + And("r.reviewer_id = ?", opts.ReviewPendingID). + And("r.type = ?", ReviewTypePending) + } + switch opts.IsPull { case util.OptionalBoolTrue: sess.And("issue.is_pull=?", true) @@ -1573,6 +1590,23 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) { if err != nil { return nil, err } + case FilterModeReviewPending: + stats.OpenCount, err = x.Where(cond).And("issue.is_closed = ?", false). + Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id"). + And("r.reviewer_id = ?", opts.UserID). + And("r.type = ?", ReviewTypePending). + Count(new(Issue)) + if err != nil { + return nil, err + } + stats.ClosedCount, err = x.Where(cond).And("issue.is_closed = ?", true). + Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id"). + And("r.reviewer_id = ?", opts.UserID). + And("r.type = ?", ReviewTypePending). + Count(new(Issue)) + if err != nil { + return nil, err + } } cond = cond.And(builder.Eq{"issue.is_closed": opts.IsClosed}) @@ -1606,6 +1640,15 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) { return nil, err } + stats.ReviewPendingCount, err = x.Where(cond). + Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id"). + And("r.reviewer_id = ?", opts.UserID). + And("r.type = ?", ReviewTypePending). + Count(new(Issue)) + if err != nil { + return nil, err + } + return stats, nil } diff --git a/options/locale/locale_en-US.ini b/options/locale/locale_en-US.ini index 016211c7f8027..8851022f3f36c 100644 --- a/options/locale/locale_en-US.ini +++ b/options/locale/locale_en-US.ini @@ -1018,6 +1018,7 @@ issues.filter_type.all_issues = All issues issues.filter_type.assigned_to_you = Assigned to you issues.filter_type.created_by_you = Created by you issues.filter_type.mentioning_you = Mentioning you +issues.filter_type.review_pending = Review pending issues.filter_sort = Sort issues.filter_sort.latest = Newest issues.filter_sort.oldest = Oldest diff --git a/routers/repo/issue.go b/routers/repo/issue.go index 159cc5b9f01a9..e3bad958bed9d 100644 --- a/routers/repo/issue.go +++ b/routers/repo/issue.go @@ -113,16 +113,17 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti var err error viewType := ctx.Query("type") sortType := ctx.Query("sort") - types := []string{"all", "your_repositories", "assigned", "created_by", "mentioned"} + types := []string{"all", "your_repositories", "assigned", "created_by", "mentioned", "review_pending"} if !com.IsSliceContainsStr(types, viewType) { viewType = "all" } var ( - assigneeID = ctx.QueryInt64("assignee") - posterID int64 - mentionedID int64 - forceEmpty bool + assigneeID = ctx.QueryInt64("assignee") + posterID int64 + mentionedID int64 + reviewPendingID int64 + forceEmpty bool ) if ctx.IsSigned { @@ -133,6 +134,8 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti mentionedID = ctx.User.ID case "assigned": assigneeID = ctx.User.ID + case "review_pending": + reviewPendingID = ctx.User.ID } } @@ -169,14 +172,15 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti issueStats = &models.IssueStats{} } else { issueStats, err = models.GetIssueStats(&models.IssueStatsOptions{ - RepoID: repo.ID, - Labels: selectLabels, - MilestoneID: milestoneID, - AssigneeID: assigneeID, - MentionedID: mentionedID, - PosterID: posterID, - IsPull: isPullOption, - IssueIDs: issueIDs, + RepoID: repo.ID, + Labels: selectLabels, + MilestoneID: milestoneID, + AssigneeID: assigneeID, + MentionedID: mentionedID, + PosterID: posterID, + ReviewPendingID: reviewPendingID, + IsPull: isPullOption, + IssueIDs: issueIDs, }) if err != nil { ctx.ServerError("GetIssueStats", err) @@ -217,17 +221,18 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti Page: pager.Paginater.Current(), PageSize: setting.UI.IssuePagingNum, }, - RepoIDs: []int64{repo.ID}, - AssigneeID: assigneeID, - PosterID: posterID, - MentionedID: mentionedID, - MilestoneIDs: mileIDs, - ProjectID: projectID, - IsClosed: util.OptionalBoolOf(isShowClosed), - IsPull: isPullOption, - LabelIDs: labelIDs, - SortType: sortType, - IssueIDs: issueIDs, + RepoIDs: []int64{repo.ID}, + AssigneeID: assigneeID, + PosterID: posterID, + MentionedID: mentionedID, + ReviewPendingID: reviewPendingID, + MilestoneIDs: mileIDs, + ProjectID: projectID, + IsClosed: util.OptionalBoolOf(isShowClosed), + IsPull: isPullOption, + LabelIDs: labelIDs, + SortType: sortType, + IssueIDs: issueIDs, }) if err != nil { ctx.ServerError("Issues", err) diff --git a/routers/user/home.go b/routers/user/home.go index 779971ca97d40..8364be310ccd7 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -374,6 +374,8 @@ func Issues(ctx *context.Context) { filterMode = models.FilterModeCreate case "mentioned": filterMode = models.FilterModeMention + case "review_pending": + filterMode = models.FilterModeReviewPending case "your_repositories": // filterMode already set to All default: viewType = "your_repositories" @@ -452,6 +454,8 @@ func Issues(ctx *context.Context) { opts.PosterID = ctxUser.ID case models.FilterModeMention: opts.MentionedID = ctxUser.ID + case models.FilterModeReviewPending: + opts.ReviewPendingID = ctxUser.ID } var forceEmpty bool diff --git a/templates/repo/issue/list.tmpl b/templates/repo/issue/list.tmpl index 49adcd08bfd8d..a25338608c9a3 100644 --- a/templates/repo/issue/list.tmpl +++ b/templates/repo/issue/list.tmpl @@ -96,6 +96,9 @@ {{.i18n.Tr "repo.issues.filter_type.assigned_to_you"}} {{.i18n.Tr "repo.issues.filter_type.created_by_you"}} {{.i18n.Tr "repo.issues.filter_type.mentioning_you"}} + {{if .PageIsPullList}} + {{.i18n.Tr "repo.issues.filter_type.review_pending"}} + {{end}} {{end}} diff --git a/templates/repo/issue/milestone_issues.tmpl b/templates/repo/issue/milestone_issues.tmpl index 9958efc07dcbd..ae884196392f8 100644 --- a/templates/repo/issue/milestone_issues.tmpl +++ b/templates/repo/issue/milestone_issues.tmpl @@ -94,6 +94,7 @@ {{.i18n.Tr "repo.issues.filter_type.assigned_to_you"}} {{.i18n.Tr "repo.issues.filter_type.created_by_you"}} {{.i18n.Tr "repo.issues.filter_type.mentioning_you"}} + {{.i18n.Tr "repo.issues.filter_type.review_pending"}} {{end}} diff --git a/templates/user/dashboard/issues.tmpl b/templates/user/dashboard/issues.tmpl index 93ec2ed005ba3..1fdd1f6f79a3c 100644 --- a/templates/user/dashboard/issues.tmpl +++ b/templates/user/dashboard/issues.tmpl @@ -22,6 +22,12 @@ {{.i18n.Tr "repo.issues.filter_type.mentioning_you"}} {{CountFmt .IssueStats.MentionCount}} + {{if .PageIsPulls}} + + {{.i18n.Tr "repo.issues.filter_type.review_pending"}} + {{CountFmt .IssueStats.ReviewPendingCount}} + + {{end}} {{end}}