diff --git a/templates/base.html b/templates/base.html index 6ae1609..aba8da0 100755 --- a/templates/base.html +++ b/templates/base.html @@ -56,6 +56,7 @@
  • Qualification Schedule
  • Playoff Schedule
  • Standings
  • +
  • Bracket
  • Backup Teams
  • Playoff Alliance Coupons
  • Team Connection Status
  • diff --git a/templates/bracket_report.html b/templates/bracket_report.html new file mode 100644 index 0000000..52a05a7 --- /dev/null +++ b/templates/bracket_report.html @@ -0,0 +1,23 @@ + + + Bracket Report + + + +
    {{.}}
    + + + diff --git a/web/api.go b/web/api.go index 6afa5de..25f397b 100755 --- a/web/api.go +++ b/web/api.go @@ -13,6 +13,7 @@ import ( "github.com/Team254/cheesy-arena-lite/partner" "github.com/Team254/cheesy-arena-lite/websocket" "github.com/gorilla/mux" + "io" "net/http" "os" "strconv" @@ -226,11 +227,18 @@ func (web *Web) teamAvatarsApiHandler(w http.ResponseWriter, r *http.Request) { } func (web *Web) bracketSvgApiHandler(w http.ResponseWriter, r *http.Request) { - alliances, err := web.arena.Database.GetAllAlliances() - if err != nil { + w.Header().Set("Content-Type", "image/svg+xml") + if err := web.generateBracketSvg(w); err != nil { handleWebErr(w, err) return } +} + +func (web *Web) generateBracketSvg(w io.Writer) error { + alliances, err := web.arena.Database.GetAllAlliances() + if err != nil { + return err + } activeMatch := web.arena.SavedMatch matchups := make(map[string]*allianceMatchup) @@ -282,17 +290,11 @@ func (web *Web) bracketSvgApiHandler(w http.ResponseWriter, r *http.Request) { template, err := web.parseFiles("templates/bracket.svg") if err != nil { - handleWebErr(w, err) - return + return err } data := struct { BracketType string Matchups map[string]*allianceMatchup }{bracketType, matchups} - w.Header().Set("Content-Type", "image/svg+xml") - err = template.ExecuteTemplate(w, "bracket", data) - if err != nil { - handleWebErr(w, err) - return - } + return template.ExecuteTemplate(w, "bracket", data) } diff --git a/web/reports.go b/web/reports.go index 24d3e60..e14c29e 100755 --- a/web/reports.go +++ b/web/reports.go @@ -6,6 +6,7 @@ package web import ( + "bytes" "errors" "fmt" "github.com/Team254/cheesy-arena-lite/game" @@ -588,6 +589,28 @@ func (web *Web) wpaKeysCsvReportHandler(w http.ResponseWriter, r *http.Request) } } +// Generates a PDF-formatted report of the playoff bracket, relying on the browser to convert SVG to PDF (since no +// suitable Go library for doing so appears to exist). +func (web *Web) bracketPdfReportHandler(w http.ResponseWriter, r *http.Request) { + buffer := new(bytes.Buffer) + err := web.generateBracketSvg(buffer) + if err != nil { + handleWebErr(w, err) + return + } + + template, err := web.parseFiles("templates/bracket_report.html") + if err != nil { + handleWebErr(w, err) + return + } + err = template.ExecuteTemplate(w, "bracket_report.html", buffer.String()) + if err != nil { + handleWebErr(w, err) + return + } +} + // Returns the text to display if a team is a surrogate. func surrogateText(isSurrogate bool) string { if isSurrogate { diff --git a/web/reports_test.go b/web/reports_test.go index faae2fc..5a91232 100644 --- a/web/reports_test.go +++ b/web/reports_test.go @@ -21,7 +21,7 @@ func TestRankingsCsvReport(t *testing.T) { recorder := web.getHttpResponse("/reports/csv/rankings") assert.Equal(t, 200, recorder.Code) - assert.Equal(t, "text/plain", recorder.HeaderMap["Content-Type"][0]) + assert.Equal(t, "text/plain", recorder.Header()["Content-Type"][0]) expectedBody := "Rank,TeamId,RankingPoints,AutoPoints,EndgamePoints,TeleopPoints,Wins,Losses,Ties," + "Played\n1,254,20,625,90,554,3,2,1,10\n2,1114,18,700,625,90,1,3,2,10\n\n" assert.Equal(t, expectedBody, recorder.Body.String()) @@ -38,7 +38,7 @@ func TestRankingsPdfReport(t *testing.T) { // Can't really parse the PDF content and check it, so just check that what's sent back is a PDF. recorder := web.getHttpResponse("/reports/pdf/rankings") assert.Equal(t, 200, recorder.Code) - assert.Equal(t, "application/pdf", recorder.HeaderMap["Content-Type"][0]) + assert.Equal(t, "application/pdf", recorder.Header()["Content-Type"][0]) } func TestScheduleCsvReport(t *testing.T) { @@ -58,7 +58,7 @@ func TestScheduleCsvReport(t *testing.T) { recorder := web.getHttpResponse("/reports/csv/schedule/qualification") assert.Equal(t, 200, recorder.Code) - assert.Equal(t, "text/plain", recorder.HeaderMap["Content-Type"][0]) + assert.Equal(t, "text/plain", recorder.Header()["Content-Type"][0]) expectedBody := "Match,Type,Time,Red1,Red1IsSurrogate,Red2,Red2IsSurrogate,Red3,Red3IsSurrogate,Blue1," + "Blue1IsSurrogate,Blue2,Blue2IsSurrogate,Blue3,Blue3IsSurrogate\n1,qualification," + match1Time.String() + ",1,false,2,false,3,false,4,true,5,true,6,true\n2,qualification," + match2Time.String() + @@ -79,7 +79,7 @@ func TestSchedulePdfReport(t *testing.T) { // Can't really parse the PDF content and check it, so just check that what's sent back is a PDF. recorder := web.getHttpResponse("/reports/pdf/schedule/practice") assert.Equal(t, 200, recorder.Code) - assert.Equal(t, "application/pdf", recorder.HeaderMap["Content-Type"][0]) + assert.Equal(t, "application/pdf", recorder.Header()["Content-Type"][0]) } func TestTeamsCsvReport(t *testing.T) { @@ -94,7 +94,7 @@ func TestTeamsCsvReport(t *testing.T) { recorder := web.getHttpResponse("/reports/csv/teams") assert.Equal(t, 200, recorder.Code) - assert.Equal(t, "text/plain", recorder.HeaderMap["Content-Type"][0]) + assert.Equal(t, "text/plain", recorder.Header()["Content-Type"][0]) expectedBody := "Number,Name,Nickname,City,StateProv,Country,RookieYear,RobotName,HasConnected\n254,\"NASA\"," + "\"The Cheesy Poofs\",\"San Jose\",\"CA\",\"USA\",1999,\"Barrage\",false\n1114,\"GM\",\"Simbotics\"," + "\"St. Catharines\",\"ON\",\"Canada\",2003,\"Simbot Evolution\",false\n\n" @@ -111,7 +111,7 @@ func TestTeamsPdfReport(t *testing.T) { // Can't really parse the PDF content and check it, so just check that what's sent back is a PDF. recorder := web.getHttpResponse("/reports/pdf/teams") assert.Equal(t, 200, recorder.Code) - assert.Equal(t, "application/pdf", recorder.HeaderMap["Content-Type"][0]) + assert.Equal(t, "application/pdf", recorder.Header()["Content-Type"][0]) } func TestWpaKeysCsvReport(t *testing.T) { @@ -124,7 +124,16 @@ func TestWpaKeysCsvReport(t *testing.T) { recorder := web.getHttpResponse("/reports/csv/wpa_keys") assert.Equal(t, 200, recorder.Code) - assert.Equal(t, "text/csv", recorder.HeaderMap["Content-Type"][0]) - assert.Equal(t, "attachment; filename=wpa_keys.csv", recorder.HeaderMap["Content-Disposition"][0]) + assert.Equal(t, "text/csv", recorder.Header()["Content-Type"][0]) + assert.Equal(t, "attachment; filename=wpa_keys.csv", recorder.Header()["Content-Disposition"][0]) assert.Equal(t, "254,12345678\r\n1114,9876543210\r\n", recorder.Body.String()) } + +func TestBracketPdfReport(t *testing.T) { + web := setupTestWeb(t) + + recorder := web.getHttpResponse("/reports/pdf/bracket") + assert.Equal(t, 200, recorder.Code) + assert.Equal(t, "text/html; charset=utf-8", recorder.Header()["Content-Type"][0]) + assert.Contains(t, recorder.Body.String(), "Finals") +} diff --git a/web/web.go b/web/web.go index 9978b21..4fb6252 100755 --- a/web/web.go +++ b/web/web.go @@ -151,6 +151,7 @@ func (web *Web) newHandler() http.Handler { router.HandleFunc("/match_review/{matchId}/edit", web.matchReviewEditPostHandler).Methods("POST") router.HandleFunc("/reports/csv/rankings", web.rankingsCsvReportHandler).Methods("GET") router.HandleFunc("/reports/pdf/rankings", web.rankingsPdfReportHandler).Methods("GET") + router.HandleFunc("/reports/pdf/bracket", web.bracketPdfReportHandler).Methods("GET") router.HandleFunc("/reports/csv/backups", web.backupTeamsCsvReportHandler).Methods("GET") router.HandleFunc("/reports/pdf/backups", web.backupsPdfReportHandler).Methods("GET") router.HandleFunc("/reports/pdf/coupons", web.couponsPdfReportHandler).Methods("GET")