diff --git a/partner/tba.go b/partner/tba.go
index d61386e..8404678 100644
--- a/partner/tba.go
+++ b/partner/tba.go
@@ -146,6 +146,12 @@ type TbaMediaItem struct {
Type string `json:"type"`
}
+type TbaPublishedAward struct {
+ Name string `json:"name_str"`
+ TeamKey string `json:"team_key"`
+ Awardee string `json:"awardee"`
+}
+
var habLevelMapping = []string{"None", "HabLevel1", "HabLevel2", "HabLevel3"}
var bayStatusMapping = []string{"None", "Panel", "PanelAndCargo", "Cargo"}
var sandstormBonusMapping = map[bool]string{false: "None", true: "CrossedHabLineInSandstorm"}
@@ -593,3 +599,34 @@ func createTbaScoringBreakdown(match *model.Match, matchResult *model.MatchResul
return &breakdown
}
+
+// Uploads the awards to The Blue Alliance.
+func (client *TbaClient) PublishAwards(database *model.Database) error {
+ awards, err := database.GetAllAwards()
+ if err != nil {
+ return err
+ }
+
+ // Build a JSON array of TBA-format award models.
+ tbaAwards := make([]TbaPublishedAward, len(awards))
+ for i, award := range awards {
+ tbaAwards[i].Name = award.AwardName
+ tbaAwards[i].TeamKey = getTbaTeam(award.TeamId)
+ tbaAwards[i].Awardee = award.PersonName
+ }
+ jsonBody, err := json.Marshal(tbaAwards)
+ if err != nil {
+ return err
+ }
+
+ resp, err := client.postRequest("awards", "update", jsonBody)
+ if err != nil {
+ return err
+ }
+ if resp.StatusCode != 200 {
+ defer resp.Body.Close()
+ body, _ := ioutil.ReadAll(resp.Body)
+ return fmt.Errorf("Got status code %d from TBA: %s", resp.StatusCode, body)
+ }
+ return nil
+}
diff --git a/partner/tba_test.go b/partner/tba_test.go
index 17bf3d3..39c6934 100644
--- a/partner/tba_test.go
+++ b/partner/tba_test.go
@@ -125,6 +125,27 @@ func TestPublishingErrors(t *testing.T) {
assert.NotNil(t, client.PublishAlliances(database))
}
+func TestPublishAwards(t *testing.T) {
+ database := setupTestDb(t)
+
+ database.CreateAward(&model.Award{0, model.JudgedAward, "Saftey Award", 254, ""})
+ database.CreateAward(&model.Award{0, model.JudgedAward, "Spirt Award", 0, "Bob Dorough"})
+
+ // Mock the TBA server.
+ tbaServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ assert.Contains(t, r.URL.String(), "event/my_event_code")
+ var reader bytes.Buffer
+ reader.ReadFrom(r.Body)
+ assert.Equal(t, "[{\"name_str\":\"Saftey Award\",\"team_key\":\"frc254\",\"awardee\":\"\"},"+
+ "{\"name_str\":\"Spirt Award\",\"team_key\":\"frc0\",\"awardee\":\"Bob Dorough\"}]", reader.String())
+ }))
+ defer tbaServer.Close()
+ client := NewTbaClient("my_event_code", "my_secret_id", "my_secret")
+ client.BaseUrl = tbaServer.URL
+
+ assert.Nil(t, client.PublishAwards(database))
+}
+
func setupTestDb(t *testing.T) *model.Database {
return model.SetupTestDb(t, "partner")
}
diff --git a/templates/setup_awards.html b/templates/setup_awards.html
index f4d98d2..c6d449b 100644
--- a/templates/setup_awards.html
+++ b/templates/setup_awards.html
@@ -54,6 +54,36 @@
{{end}}
Winner and Finalist awards will be automatically generated once the playoff tournament is complete.
+ {{if .EventSettings.TbaPublishingEnabled}}
+
+
+
+
+
+
+ {{end}}
+
+
+
+
+
+
+
+
+
Are you sure you want to publish the awards to The Blue Alliance? This will overwrite any existing award
+ data.
+
+
diff --git a/tournament/awards.go b/tournament/awards.go
index bb02785..ab57cc7 100644
--- a/tournament/awards.go
+++ b/tournament/awards.go
@@ -125,7 +125,7 @@ func CreateOrUpdateWinnerAndFinalistAwards(database *model.Database, winnerAllia
}
// Create the finalist awards first since they're usually presented first.
- finalistAward := model.Award{AwardName: "Event Finalist", Type: model.FinalistAward,
+ finalistAward := model.Award{AwardName: "Finalist", Type: model.FinalistAward,
TeamId: finalistAllianceTeams[0].TeamId}
if err = CreateOrUpdateAward(database, &finalistAward, true); err != nil {
return err
@@ -139,7 +139,7 @@ func CreateOrUpdateWinnerAndFinalistAwards(database *model.Database, winnerAllia
}
// Create the winner awards.
- winnerAward := model.Award{AwardName: "Event Winner", Type: model.WinnerAward,
+ winnerAward := model.Award{AwardName: "Winner", Type: model.WinnerAward,
TeamId: winnerAllianceTeams[0].TeamId}
if err = CreateOrUpdateAward(database, &winnerAward, true); err != nil {
return err
diff --git a/tournament/awards_test.go b/tournament/awards_test.go
index 2873b59..5fb7a2d 100644
--- a/tournament/awards_test.go
+++ b/tournament/awards_test.go
@@ -54,7 +54,7 @@ func TestCreateOrUpdateAwardWithoutIntro(t *testing.T) {
otherLowerThird := model.LowerThird{TopText: "Marco", BottomText: "Polo"}
database.CreateLowerThird(&otherLowerThird)
- award := model.Award{0, model.WinnerAward, "Event Winner", 0, "Bob Dorough"}
+ award := model.Award{0, model.WinnerAward, "Winner", 0, "Bob Dorough"}
err := CreateOrUpdateAward(database, &award, false)
assert.Nil(t, err)
award2, _ := database.GetAwardById(award.Id)
@@ -62,7 +62,7 @@ func TestCreateOrUpdateAwardWithoutIntro(t *testing.T) {
lowerThirds, _ := database.GetAllLowerThirds()
if assert.Equal(t, 2, len(lowerThirds)) {
assert.Equal(t, otherLowerThird, lowerThirds[0])
- assert.Equal(t, "Event Winner", lowerThirds[1].TopText)
+ assert.Equal(t, "Winner", lowerThirds[1].TopText)
assert.Equal(t, "Bob Dorough", lowerThirds[1].BottomText)
}
@@ -74,7 +74,7 @@ func TestCreateOrUpdateAwardWithoutIntro(t *testing.T) {
lowerThirds, _ = database.GetAllLowerThirds()
if assert.Equal(t, 2, len(lowerThirds)) {
assert.Equal(t, otherLowerThird, lowerThirds[0])
- assert.Equal(t, "Event Winner", lowerThirds[1].TopText)
+ assert.Equal(t, "Winner", lowerThirds[1].TopText)
assert.Equal(t, "Bob Dorough – Team 254, Teh Chezy Pofs", lowerThirds[1].BottomText)
}
@@ -102,22 +102,22 @@ func TestCreateOrUpdateWinnerAndFinalistAwards(t *testing.T) {
assert.Nil(t, err)
awards, _ := database.GetAllAwards()
if assert.Equal(t, 6, len(awards)) {
- assert.Equal(t, model.Award{1, model.FinalistAward, "Event Finalist", 1, ""}, awards[0])
- assert.Equal(t, model.Award{2, model.FinalistAward, "Event Finalist", 10, ""}, awards[1])
- assert.Equal(t, model.Award{3, model.FinalistAward, "Event Finalist", 100, ""}, awards[2])
- assert.Equal(t, model.Award{4, model.WinnerAward, "Event Winner", 2, ""}, awards[3])
- assert.Equal(t, model.Award{5, model.WinnerAward, "Event Winner", 20, ""}, awards[4])
- assert.Equal(t, model.Award{6, model.WinnerAward, "Event Winner", 200, ""}, awards[5])
+ assert.Equal(t, model.Award{1, model.FinalistAward, "Finalist", 1, ""}, awards[0])
+ assert.Equal(t, model.Award{2, model.FinalistAward, "Finalist", 10, ""}, awards[1])
+ assert.Equal(t, model.Award{3, model.FinalistAward, "Finalist", 100, ""}, awards[2])
+ assert.Equal(t, model.Award{4, model.WinnerAward, "Winner", 2, ""}, awards[3])
+ assert.Equal(t, model.Award{5, model.WinnerAward, "Winner", 20, ""}, awards[4])
+ assert.Equal(t, model.Award{6, model.WinnerAward, "Winner", 200, ""}, awards[5])
}
lowerThirds, _ := database.GetAllLowerThirds()
if assert.Equal(t, 8, len(lowerThirds)) {
- assert.Equal(t, "Event Finalist", lowerThirds[0].TopText)
+ assert.Equal(t, "Finalist", lowerThirds[0].TopText)
assert.Equal(t, "", lowerThirds[0].BottomText)
- assert.Equal(t, "Event Finalist", lowerThirds[1].TopText)
+ assert.Equal(t, "Finalist", lowerThirds[1].TopText)
assert.Equal(t, "Team 1, ", lowerThirds[1].BottomText)
- assert.Equal(t, "Event Winner", lowerThirds[4].TopText)
+ assert.Equal(t, "Winner", lowerThirds[4].TopText)
assert.Equal(t, "", lowerThirds[4].BottomText)
- assert.Equal(t, "Event Winner", lowerThirds[5].TopText)
+ assert.Equal(t, "Winner", lowerThirds[5].TopText)
assert.Equal(t, "Team 2, ", lowerThirds[5].BottomText)
}
@@ -125,22 +125,22 @@ func TestCreateOrUpdateWinnerAndFinalistAwards(t *testing.T) {
assert.Nil(t, err)
awards, _ = database.GetAllAwards()
if assert.Equal(t, 6, len(awards)) {
- assert.Equal(t, model.Award{1, model.FinalistAward, "Event Finalist", 2, ""}, awards[0])
- assert.Equal(t, model.Award{2, model.FinalistAward, "Event Finalist", 20, ""}, awards[1])
- assert.Equal(t, model.Award{3, model.FinalistAward, "Event Finalist", 200, ""}, awards[2])
- assert.Equal(t, model.Award{4, model.WinnerAward, "Event Winner", 1, ""}, awards[3])
- assert.Equal(t, model.Award{5, model.WinnerAward, "Event Winner", 10, ""}, awards[4])
- assert.Equal(t, model.Award{6, model.WinnerAward, "Event Winner", 100, ""}, awards[5])
+ assert.Equal(t, model.Award{1, model.FinalistAward, "Finalist", 2, ""}, awards[0])
+ assert.Equal(t, model.Award{2, model.FinalistAward, "Finalist", 20, ""}, awards[1])
+ assert.Equal(t, model.Award{3, model.FinalistAward, "Finalist", 200, ""}, awards[2])
+ assert.Equal(t, model.Award{4, model.WinnerAward, "Winner", 1, ""}, awards[3])
+ assert.Equal(t, model.Award{5, model.WinnerAward, "Winner", 10, ""}, awards[4])
+ assert.Equal(t, model.Award{6, model.WinnerAward, "Winner", 100, ""}, awards[5])
}
lowerThirds, _ = database.GetAllLowerThirds()
if assert.Equal(t, 8, len(lowerThirds)) {
- assert.Equal(t, "Event Finalist", lowerThirds[0].TopText)
+ assert.Equal(t, "Finalist", lowerThirds[0].TopText)
assert.Equal(t, "", lowerThirds[0].BottomText)
- assert.Equal(t, "Event Finalist", lowerThirds[1].TopText)
+ assert.Equal(t, "Finalist", lowerThirds[1].TopText)
assert.Equal(t, "Team 2, ", lowerThirds[1].BottomText)
- assert.Equal(t, "Event Winner", lowerThirds[4].TopText)
+ assert.Equal(t, "Winner", lowerThirds[4].TopText)
assert.Equal(t, "", lowerThirds[4].BottomText)
- assert.Equal(t, "Event Winner", lowerThirds[5].TopText)
+ assert.Equal(t, "Winner", lowerThirds[5].TopText)
assert.Equal(t, "Team 1, ", lowerThirds[5].BottomText)
}
}
diff --git a/web/setup_awards.go b/web/setup_awards.go
index 5205843..65d1210 100644
--- a/web/setup_awards.go
+++ b/web/setup_awards.go
@@ -73,3 +73,17 @@ func (web *Web) awardsPostHandler(w http.ResponseWriter, r *http.Request) {
http.Redirect(w, r, "/setup/awards", 303)
}
+
+// Publishes the awards to the web.
+func (web *Web) awardsPublishHandler(w http.ResponseWriter, r *http.Request) {
+ if !web.userIsAdmin(w, r) {
+ return
+ }
+
+ err := web.arena.TbaClient.PublishAwards(web.arena.Database)
+ if err != nil {
+ http.Error(w, "Failed to publish awards: "+err.Error(), 500)
+ return
+ }
+ http.Redirect(w, r, "/setup/awards", 303)
+}
diff --git a/web/setup_awards_test.go b/web/setup_awards_test.go
index 269be7b..a54a15a 100644
--- a/web/setup_awards_test.go
+++ b/web/setup_awards_test.go
@@ -33,3 +33,14 @@ func TestSetupAwards(t *testing.T) {
assert.Equal(t, 200, recorder.Code)
assert.Contains(t, recorder.Body.String(), "Englebert")
}
+
+func TestSetupAwardsPublish(t *testing.T) {
+ web := setupTestWeb(t)
+
+ web.arena.TbaClient.BaseUrl = "fakeurl"
+ web.arena.EventSettings.TbaPublishingEnabled = true
+
+ recorder := web.postHttpResponse("/setup/awards/publish", "")
+ assert.Equal(t, 500, recorder.Code)
+ assert.Contains(t, recorder.Body.String(), "Failed to publish awards")
+}
diff --git a/web/web.go b/web/web.go
index c1bf52d..9675c97 100644
--- a/web/web.go
+++ b/web/web.go
@@ -145,6 +145,7 @@ func (web *Web) newHandler() http.Handler {
router.HandleFunc("/reports/csv/wpa_keys", web.wpaKeysCsvReportHandler).Methods("GET")
router.HandleFunc("/setup/awards", web.awardsGetHandler).Methods("GET")
router.HandleFunc("/setup/awards", web.awardsPostHandler).Methods("POST")
+ router.HandleFunc("/setup/awards/publish", web.awardsPublishHandler).Methods("POST")
router.HandleFunc("/setup/db/clear", web.clearDbHandler).Methods("POST")
router.HandleFunc("/setup/db/restore", web.restoreDbHandler).Methods("POST")
router.HandleFunc("/setup/db/save", web.saveDbHandler).Methods("GET")