Skip to content

Commit 8d0a527

Browse files
committed
Add review requested filter on pull request overview #13682
fix formatting
1 parent cd607b5 commit 8d0a527

File tree

7 files changed

+100
-32
lines changed

7 files changed

+100
-32
lines changed

models/issue.go

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1090,6 +1090,7 @@ type IssuesOptions struct {
10901090
AssigneeID int64
10911091
PosterID int64
10921092
MentionedID int64
1093+
ReviewRequestedID int64
10931094
MilestoneIDs []int64
10941095
ProjectID int64
10951096
ProjectBoardID int64
@@ -1176,6 +1177,13 @@ func (opts *IssuesOptions) setupSession(sess *xorm.Session) {
11761177
And("issue_user.uid = ?", opts.MentionedID)
11771178
}
11781179

1180+
if opts.ReviewRequestedID > 0 {
1181+
sess.Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1182+
And("r.reviewer_id = ?", opts.ReviewRequestedID).
1183+
And("r.type = ?", ReviewTypeRequest).
1184+
And("r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id)")
1185+
}
1186+
11791187
if len(opts.MilestoneIDs) > 0 {
11801188
sess.In("issue.milestone_id", opts.MilestoneIDs)
11811189
}
@@ -1359,6 +1367,7 @@ type IssueStats struct {
13591367
AssignCount int64
13601368
CreateCount int64
13611369
MentionCount int64
1370+
ReviewRequestedCount int64
13621371
}
13631372

13641373
// Filter modes.
@@ -1367,6 +1376,7 @@ const (
13671376
FilterModeAssign
13681377
FilterModeCreate
13691378
FilterModeMention
1379+
FilterModeReviewRequested
13701380
)
13711381

13721382
func parseCountResult(results []map[string][]byte) int64 {
@@ -1381,14 +1391,15 @@ func parseCountResult(results []map[string][]byte) int64 {
13811391

13821392
// IssueStatsOptions contains parameters accepted by GetIssueStats.
13831393
type IssueStatsOptions struct {
1384-
RepoID int64
1385-
Labels string
1386-
MilestoneID int64
1387-
AssigneeID int64
1388-
MentionedID int64
1389-
PosterID int64
1390-
IsPull util.OptionalBool
1391-
IssueIDs []int64
1394+
RepoID int64
1395+
Labels string
1396+
MilestoneID int64
1397+
AssigneeID int64
1398+
MentionedID int64
1399+
PosterID int64
1400+
ReviewRequestedID int64
1401+
IsPull util.OptionalBool
1402+
IssueIDs []int64
13921403
}
13931404

13941405
// GetIssueStats returns issue statistic information by given conditions.
@@ -1417,6 +1428,7 @@ func GetIssueStats(opts *IssueStatsOptions) (*IssueStats, error) {
14171428
accum.AssignCount += stats.AssignCount
14181429
accum.CreateCount += stats.CreateCount
14191430
accum.OpenCount += stats.MentionCount
1431+
accum.ReviewRequestedCount += stats.ReviewRequestedCount
14201432
i = chunk
14211433
}
14221434
return accum, nil
@@ -1468,6 +1480,13 @@ func getIssueStatsChunk(opts *IssueStatsOptions, issueIDs []int64) (*IssueStats,
14681480
And("issue_user.is_mentioned = ?", true)
14691481
}
14701482

1483+
if opts.ReviewRequestedID > 0 {
1484+
sess.Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1485+
And("r.reviewer_id = ?", opts.ReviewRequestedID).
1486+
And("r.type = ?", ReviewTypeRequest).
1487+
And("r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id)")
1488+
}
1489+
14711490
switch opts.IsPull {
14721491
case util.OptionalBoolTrue:
14731492
sess.And("issue.is_pull=?", true)
@@ -1573,6 +1592,25 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
15731592
if err != nil {
15741593
return nil, err
15751594
}
1595+
case FilterModeReviewRequested:
1596+
stats.OpenCount, err = x.Where(cond).And("issue.is_closed = ?", false).
1597+
Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1598+
And("r.reviewer_id = ?", opts.UserID).
1599+
And("r.type = ?", ReviewTypeRequest).
1600+
And("r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id)").
1601+
Count(new(Issue))
1602+
if err != nil {
1603+
return nil, err
1604+
}
1605+
stats.ClosedCount, err = x.Where(cond).And("issue.is_closed = ?", true).
1606+
Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1607+
And("r.reviewer_id = ?", opts.UserID).
1608+
And("r.type = ?", ReviewTypeRequest).
1609+
And("r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id)").
1610+
Count(new(Issue))
1611+
if err != nil {
1612+
return nil, err
1613+
}
15761614
}
15771615

15781616
cond = cond.And(builder.Eq{"issue.is_closed": opts.IsClosed})
@@ -1606,6 +1644,16 @@ func GetUserIssueStats(opts UserIssueStatsOptions) (*IssueStats, error) {
16061644
return nil, err
16071645
}
16081646

1647+
stats.ReviewRequestedCount, err = x.Where(cond).
1648+
Join("INNER", []string{"review", "r"}, "issue.id = r.issue_id").
1649+
And("r.reviewer_id = ?", opts.UserID).
1650+
And("r.type = ?", ReviewTypeRequest).
1651+
And("r.id in (select max(id) from review where issue_id = r.issue_id and reviewer_id = r.reviewer_id)").
1652+
Count(new(Issue))
1653+
if err != nil {
1654+
return nil, err
1655+
}
1656+
16091657
return stats, nil
16101658
}
16111659

options/locale/locale_en-US.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1023,6 +1023,7 @@ issues.filter_type.all_issues = All issues
10231023
issues.filter_type.assigned_to_you = Assigned to you
10241024
issues.filter_type.created_by_you = Created by you
10251025
issues.filter_type.mentioning_you = Mentioning you
1026+
issues.filter_type.review_requested = Review requested
10261027
issues.filter_sort = Sort
10271028
issues.filter_sort.latest = Newest
10281029
issues.filter_sort.oldest = Oldest

routers/repo/issue.go

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -113,16 +113,17 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti
113113
var err error
114114
viewType := ctx.Query("type")
115115
sortType := ctx.Query("sort")
116-
types := []string{"all", "your_repositories", "assigned", "created_by", "mentioned"}
116+
types := []string{"all", "your_repositories", "assigned", "created_by", "mentioned", "review_requested"}
117117
if !com.IsSliceContainsStr(types, viewType) {
118118
viewType = "all"
119119
}
120120

121121
var (
122-
assigneeID = ctx.QueryInt64("assignee")
123-
posterID int64
124-
mentionedID int64
125-
forceEmpty bool
122+
assigneeID = ctx.QueryInt64("assignee")
123+
posterID int64
124+
mentionedID int64
125+
reviewRequestedID int64
126+
forceEmpty bool
126127
)
127128

128129
if ctx.IsSigned {
@@ -133,6 +134,8 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti
133134
mentionedID = ctx.User.ID
134135
case "assigned":
135136
assigneeID = ctx.User.ID
137+
case "review_requested":
138+
reviewRequestedID = ctx.User.ID
136139
}
137140
}
138141

@@ -169,14 +172,15 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti
169172
issueStats = &models.IssueStats{}
170173
} else {
171174
issueStats, err = models.GetIssueStats(&models.IssueStatsOptions{
172-
RepoID: repo.ID,
173-
Labels: selectLabels,
174-
MilestoneID: milestoneID,
175-
AssigneeID: assigneeID,
176-
MentionedID: mentionedID,
177-
PosterID: posterID,
178-
IsPull: isPullOption,
179-
IssueIDs: issueIDs,
175+
RepoID: repo.ID,
176+
Labels: selectLabels,
177+
MilestoneID: milestoneID,
178+
AssigneeID: assigneeID,
179+
MentionedID: mentionedID,
180+
PosterID: posterID,
181+
ReviewRequestedID: reviewRequestedID,
182+
IsPull: isPullOption,
183+
IssueIDs: issueIDs,
180184
})
181185
if err != nil {
182186
ctx.ServerError("GetIssueStats", err)
@@ -217,17 +221,18 @@ func issues(ctx *context.Context, milestoneID, projectID int64, isPullOption uti
217221
Page: pager.Paginater.Current(),
218222
PageSize: setting.UI.IssuePagingNum,
219223
},
220-
RepoIDs: []int64{repo.ID},
221-
AssigneeID: assigneeID,
222-
PosterID: posterID,
223-
MentionedID: mentionedID,
224-
MilestoneIDs: mileIDs,
225-
ProjectID: projectID,
226-
IsClosed: util.OptionalBoolOf(isShowClosed),
227-
IsPull: isPullOption,
228-
LabelIDs: labelIDs,
229-
SortType: sortType,
230-
IssueIDs: issueIDs,
224+
RepoIDs: []int64{repo.ID},
225+
AssigneeID: assigneeID,
226+
PosterID: posterID,
227+
MentionedID: mentionedID,
228+
ReviewRequestedID: reviewRequestedID,
229+
MilestoneIDs: mileIDs,
230+
ProjectID: projectID,
231+
IsClosed: util.OptionalBoolOf(isShowClosed),
232+
IsPull: isPullOption,
233+
LabelIDs: labelIDs,
234+
SortType: sortType,
235+
IssueIDs: issueIDs,
231236
})
232237
if err != nil {
233238
ctx.ServerError("Issues", err)

routers/user/home.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,8 @@ func Issues(ctx *context.Context) {
374374
filterMode = models.FilterModeCreate
375375
case "mentioned":
376376
filterMode = models.FilterModeMention
377+
case "review_requested":
378+
filterMode = models.FilterModeReviewRequested
377379
case "your_repositories": // filterMode already set to All
378380
default:
379381
viewType = "your_repositories"
@@ -452,6 +454,8 @@ func Issues(ctx *context.Context) {
452454
opts.PosterID = ctxUser.ID
453455
case models.FilterModeMention:
454456
opts.MentionedID = ctxUser.ID
457+
case models.FilterModeReviewRequested:
458+
opts.ReviewRequestedID = ctxUser.ID
455459
}
456460

457461
var forceEmpty bool

templates/repo/issue/list.tmpl

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@
8989
<a class="{{if eq .ViewType "assigned"}}active{{end}} item" href="{{$.Link}}?q={{$.Keyword}}&type=assigned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&assignee={{$.AssigneeID}}">{{.i18n.Tr "repo.issues.filter_type.assigned_to_you"}}</a>
9090
<a class="{{if eq .ViewType "created_by"}}active{{end}} item" href="{{$.Link}}?q={{$.Keyword}}&type=created_by&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&assignee={{$.AssigneeID}}">{{.i18n.Tr "repo.issues.filter_type.created_by_you"}}</a>
9191
<a class="{{if eq .ViewType "mentioned"}}active{{end}} item" href="{{$.Link}}?q={{$.Keyword}}&type=mentioned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&assignee={{$.AssigneeID}}">{{.i18n.Tr "repo.issues.filter_type.mentioning_you"}}</a>
92+
{{if .PageIsPullList}}
93+
<a class="{{if eq .ViewType "review_requested"}}active{{end}} item" href="{{$.Link}}?q={{$.Keyword}}&type=review_requested&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&milestone={{$.MilestoneID}}&assignee={{$.AssigneeID}}">{{.i18n.Tr "repo.issues.filter_type.review_requested"}}</a>
94+
{{end}}
9295
</div>
9396
</div>
9497
{{end}}

templates/repo/issue/milestone_issues.tmpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@
8888
<a class="{{if eq .ViewType "assigned"}}active{{end}} item" href="{{$.Link}}?q={{$.Keyword}}&type=assigned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}">{{.i18n.Tr "repo.issues.filter_type.assigned_to_you"}}</a>
8989
<a class="{{if eq .ViewType "created_by"}}active{{end}} item" href="{{$.Link}}?q={{$.Keyword}}&type=created_by&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}">{{.i18n.Tr "repo.issues.filter_type.created_by_you"}}</a>
9090
<a class="{{if eq .ViewType "mentioned"}}active{{end}} item" href="{{$.Link}}?q={{$.Keyword}}&type=mentioned&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}">{{.i18n.Tr "repo.issues.filter_type.mentioning_you"}}</a>
91+
<a class="{{if eq .ViewType "review_requested"}}active{{end}} item" href="{{$.Link}}?q={{$.Keyword}}&type=review_requested&sort={{$.SortType}}&state={{$.State}}&labels={{.SelectLabels}}&assignee={{$.AssigneeID}}">{{.i18n.Tr "repo.issues.filter_type.review_requested"}}</a>
9192
</div>
9293
</div>
9394
{{end}}

templates/user/dashboard/issues.tmpl

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
{{.i18n.Tr "repo.issues.filter_type.mentioning_you"}}
2323
<strong class="ui right">{{CountFmt .IssueStats.MentionCount}}</strong>
2424
</a>
25+
{{if .PageIsPulls}}
26+
<a class="{{if eq .ViewType "review_requested"}}ui basic blue button{{end}} item" href="{{.Link}}?type=review_requested&repos=[{{range $.RepoIDs}}{{.}}%2C{{end}}]&sort={{$.SortType}}&state={{.State}}">
27+
{{.i18n.Tr "repo.issues.filter_type.review_requested"}}
28+
<strong class="ui right">{{CountFmt .IssueStats.ReviewRequestedCount}}</strong>
29+
</a>
30+
{{end}}
2531
{{end}}
2632
<div class="ui divider"></div>
2733
<a class="{{if not $.RepoIDs}}ui basic blue button{{end}} repo name item" href="{{$.Link}}?type={{$.ViewType}}&sort={{$.SortType}}&state={{$.State}}&q={{$.Keyword}}">

0 commit comments

Comments
 (0)