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")