Skip to content

Commit 527c4ac

Browse files
committed
Move FCP dashboard to an overview, rather than a list of team members.
Closes #90.
1 parent 47ae741 commit 527c4ac

File tree

6 files changed

+119
-47
lines changed

6 files changed

+119
-47
lines changed

front/app/routes/fcp-user.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import ENV from 'rust-dashboard/config/environment';
33

44
export default Ember.Route.extend({
55
model(params) {
6-
const url = `${ENV.apiBaseURL}nag/` + params.username;
6+
const url = `${ENV.apiBaseURL}fcp/` + params.username;
77

88
return fetch(url)
99
.then(response => response.json())

front/app/routes/fcp.js

+50-2
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,57 @@ import ENV from 'rust-dashboard/config/environment';
33

44
export default Ember.Route.extend({
55
model() {
6-
const url = `${ENV.apiBaseURL}nag/users`;
6+
const url = `${ENV.apiBaseURL}fcp/all`;
77
return fetch(url)
88
.then(response => response.json())
9-
.then(({ users }) => ({ users }));
9+
.then((fcps) => {
10+
var teams = new Map();
11+
12+
// go over each FCP proposal
13+
for (let fcp of fcps) {
14+
15+
var missingReviews = [];
16+
17+
for (let review of fcp.reviews) {
18+
if (!review[1]) {
19+
missingReviews.push(review[0].login);
20+
}
21+
}
22+
23+
missingReviews.sort();
24+
25+
var record = {
26+
disposition: fcp.fcp.disposition,
27+
issue: fcp.issue,
28+
statusComment: fcp.status_comment,
29+
pendingReviewers: missingReviews
30+
};
31+
32+
// insert this record for all the teams
33+
for (let label of fcp.issue.labels) {
34+
35+
// we only care about team labels
36+
if (label.startsWith("T-")) {
37+
38+
if (!teams.has(label)) {
39+
teams.set(label, []);
40+
}
41+
42+
teams.get(label).push(record);
43+
}
44+
}
45+
}
46+
47+
var toReturn = [];
48+
49+
for (let pair of teams) {
50+
toReturn.push({
51+
team: pair[0],
52+
fcps: pair[1]
53+
});
54+
}
55+
56+
return { fcps: toReturn };
57+
});
1058
}
1159
});

front/app/templates/fcp.hbs

+17-20
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,21 @@
11
{{outlet}}
22

3-
<h3>Team Members:</h3>
3+
<h3>FCP/Merge Proposals:</h3>
44

5-
<div class="container">
6-
{{#groups-of
7-
tagName="div"
8-
groupsOf=2
9-
groupTag="div"
10-
groupClass="row"
11-
items=model.users
12-
as |u isFirst isLast|
13-
}}
14-
<div class="six columns">
15-
{{#link-to "fcp_user" u}}
16-
<img style="width:50px; height: auto" src="https://avatars.githubusercontent.com/{{u}}" />
17-
{{/link-to}}
5+
{{#each model.fcps as |f| }}
6+
<h5><code>{{ f.team }}</code></h5>
187

19-
{{#link-to "fcp_user" u}}
20-
<strong>{{u}}</strong>
21-
{{/link-to}}
22-
</div>
23-
{{/groups-of}}
24-
</div>
8+
<ul>
9+
{{#each f.fcps as |fcp| }}
10+
<li>
11+
<a
12+
href="https://github.com/{{ fcp.issue.repository }}/issues/{{ fcp.issue.number }}#issuecomment-{{ fcp.statusComment.id }}"
13+
target="_blank">
14+
{{ fcp.issue.repository }} #{{ fcp.issue.number }}</a>: waiting for
15+
{{#each fcp.pendingReviewers as |r| }}
16+
<a href="/fcp/{{r}}">{{ r }}</a>&nbsp;
17+
{{/each}}
18+
</li>
19+
{{/each}}
20+
</ul>
21+
{{/each}}

src/reports/nag.rs

+45-13
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,56 @@
1-
use diesel::expression::dsl::*;
21
use diesel::prelude::*;
3-
use diesel::select;
4-
use diesel::types::VarChar;
52

63
use DB_POOL;
7-
use domain::github::{GitHubUser, Issue};
4+
use domain::github::{GitHubUser, Issue, IssueComment};
85
use domain::rfcbot::{FcpProposal, FcpReviewRequest};
96
use error::DashResult;
107

11-
pub fn all_team_members() -> DashResult<Vec<String>> {
12-
let conn = try!(DB_POOL.get());
8+
#[derive(Serialize)]
9+
pub struct FcpWithInfo {
10+
fcp: FcpProposal,
11+
reviews: Vec<(GitHubUser, bool)>,
12+
issue: Issue,
13+
status_comment: IssueComment,
14+
}
15+
16+
pub fn all_fcps() -> DashResult<Vec<FcpWithInfo>> {
17+
use domain::schema::{fcp_proposal, fcp_review_request, githubuser, issue, issuecomment};
18+
19+
let conn = &*DB_POOL.get()?;
20+
21+
let proposals = fcp_proposal::table.filter(fcp_proposal::fcp_start.is_null())
22+
.load::<FcpProposal>(conn)?;
23+
24+
let mut all_fcps = Vec::new();
25+
26+
for fcp in proposals {
27+
let reviews = fcp_review_request::table.filter(fcp_review_request::fk_proposal.eq(fcp.id))
28+
.load::<FcpReviewRequest>(conn)?;
1329

14-
// waiting on associations to get this into proper typed queries
30+
let mut reviews_with_users = Vec::new();
31+
32+
for review in reviews {
33+
let user = githubuser::table.filter(githubuser::id.eq(review.fk_reviewer)).first(conn)?;
34+
reviews_with_users.push((user, review.reviewed));
35+
}
36+
37+
let status_comment =
38+
issuecomment::table.filter(issuecomment::id.eq(fcp.fk_bot_tracking_comment))
39+
.first::<IssueComment>(conn)?;
40+
41+
let issue = issue::table.filter(issue::id.eq(fcp.fk_issue)).first::<Issue>(conn)?;
42+
43+
let fcp_with_info = FcpWithInfo {
44+
fcp: fcp,
45+
reviews: reviews_with_users,
46+
issue: issue,
47+
status_comment: status_comment,
48+
};
49+
50+
all_fcps.push(fcp_with_info);
51+
}
1552

16-
Ok(try!(select(sql::<VarChar>("\
17-
DISTINCT u.login \
18-
FROM githubuser u, memberships m \
19-
WHERE u.id = m.fk_member \
20-
ORDER BY u.login"))
21-
.load(&*conn)))
53+
Ok(all_fcps)
2254
}
2355

2456
#[derive(Queryable, Serialize)]

src/server/handlers.rs

+4-9
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
use std::collections::BTreeMap;
21
use std::error::Error;
32
use std::fmt;
43

@@ -12,17 +11,13 @@ use urlencoded::{UrlDecodingError, UrlEncodedQuery};
1211
use error::DashError;
1312
use reports;
1413

15-
pub fn team_members(_: &mut Request) -> IronResult<Response> {
16-
let members = try!(reports::nag::all_team_members());
14+
pub fn list_fcps(_: &mut Request) -> IronResult<Response> {
15+
let nag_report = reports::nag::all_fcps()?;
1716

18-
let mut resp = BTreeMap::new();
19-
resp.insert("users", members);
20-
21-
Ok(Response::with((status::Ok,
22-
try!(ser::to_string(&resp).map_err(|e| {
17+
Ok(Response::with((status::Ok, ser::to_string(&nag_report).map_err(|e| {
2318
let e: DashError = e.into();
2419
e
25-
})))))
20+
})?)))
2621
}
2722

2823
pub fn member_nags(req: &mut Request) -> IronResult<Response> {

src/server/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ pub fn serve() {
1515
mount.mount("/releases/", router!(get "/" => handlers::releases));
1616
mount.mount("/hot-issues/", router!(get "/" => handlers::hot_issues));
1717

18-
mount.mount("/nag/",
18+
mount.mount("/fcp/",
1919
router!(
20-
get "/users" => handlers::team_members,
20+
get "/all" => handlers::list_fcps,
2121
get "/:username" => handlers::member_nags
2222
));
2323

0 commit comments

Comments
 (0)