Delete Stats object and replace with Stats2023

Deleting the stats object in the database and any functions/files that are using it and replacing it with Stats2023 in the view tab.

Signed-off-by: Emily Markova <emily.markova@gmail.com>
Change-Id: I76f5ad9e3f5d4a6ede60266fdc179e21013d6093
diff --git a/scouting/db/db.go b/scouting/db/db.go
index 3791596..98d8d71 100644
--- a/scouting/db/db.go
+++ b/scouting/db/db.go
@@ -7,7 +7,6 @@
 	"gorm.io/gorm"
 	"gorm.io/gorm/clause"
 	"gorm.io/gorm/logger"
-	"strconv"
 )
 
 type Database struct {
@@ -28,44 +27,6 @@
 	R1scouter, R2scouter, R3scouter, B1scouter, B2scouter, B3scouter string
 }
 
-type Stats struct {
-	TeamNumber       int32  `gorm:"primaryKey"`
-	MatchNumber      int32  `gorm:"primaryKey"`
-	SetNumber        int32  `gorm:"primaryKey"`
-	CompLevel        string `gorm:"primaryKey"`
-	StartingQuadrant int32
-	// This field is for the balls picked up during auto. Use this field
-	// when using this library. Ignore the AutoBallPickedUpX fields below.
-	AutoBallPickedUp [5]bool `gorm:"-:all"`
-	// These fields are internal implementation details. Do not use these.
-	// TODO(phil): Figure out how to use the JSON gorm serializer instead
-	// of manually serializing/deserializing these.
-	AutoBallPickedUp1 bool
-	AutoBallPickedUp2 bool
-	AutoBallPickedUp3 bool
-	AutoBallPickedUp4 bool
-	AutoBallPickedUp5 bool
-	// TODO(phil): Re-order auto and teleop fields so auto comes first.
-	ShotsMissed, UpperGoalShots, LowerGoalShots   int32
-	ShotsMissedAuto, UpperGoalAuto, LowerGoalAuto int32
-	PlayedDefense, DefenseReceivedScore           int32
-	// Climbing level:
-	// 0 -> "NoAttempt"
-	// 1 -> "Failed"
-	// 2 -> "FailedWithPlentyOfTime"
-	// 3 -> "Low"
-	// 4 -> "Medium"
-	// 5 -> "High"
-	// 6 -> "Traversal"
-	Climbing int32
-	// Some non-numerical data that the scout felt worth noting.
-	Comment string
-	// The username of the person who collected these statistics.
-	// "unknown" if submitted without logging in.
-	// Empty if the stats have not yet been collected.
-	CollectedBy string
-}
-
 type Stats2023 struct {
 	TeamNumber                                                     string `gorm:"primaryKey"`
 	MatchNumber                                                    int32  `gorm:"primaryKey"`
@@ -155,7 +116,7 @@
 		return nil, errors.New(fmt.Sprint("Failed to connect to postgres: ", err))
 	}
 
-	err = database.AutoMigrate(&TeamMatch{}, &Shift{}, &Stats{}, &Stats2023{}, &Action{}, &NotesData{}, &Ranking{}, &DriverRankingData{}, &ParsedDriverRankingData{})
+	err = database.AutoMigrate(&TeamMatch{}, &Shift{}, &Stats2023{}, &Action{}, &NotesData{}, &Ranking{}, &DriverRankingData{}, &ParsedDriverRankingData{})
 	if err != nil {
 		database.Delete()
 		return nil, errors.New(fmt.Sprint("Failed to create/migrate tables: ", err))
@@ -197,34 +158,6 @@
 	return result.Error
 }
 
-func (database *Database) AddToStats(s Stats) error {
-	matches, err := database.queryMatches(strconv.Itoa(int(s.TeamNumber)))
-	if err != nil {
-		return err
-	}
-	foundMatch := false
-	for _, match := range matches {
-		if match.MatchNumber == s.MatchNumber {
-			foundMatch = true
-			break
-		}
-	}
-	if !foundMatch {
-		return errors.New(fmt.Sprint(
-			"Failed to find team ", s.TeamNumber,
-			" in match ", s.MatchNumber, " in the schedule."))
-	}
-
-	// Unpack the auto balls array.
-	s.AutoBallPickedUp1 = s.AutoBallPickedUp[0]
-	s.AutoBallPickedUp2 = s.AutoBallPickedUp[1]
-	s.AutoBallPickedUp3 = s.AutoBallPickedUp[2]
-	s.AutoBallPickedUp4 = s.AutoBallPickedUp[3]
-	s.AutoBallPickedUp5 = s.AutoBallPickedUp[4]
-	result := database.Create(&s)
-	return result.Error
-}
-
 func (database *Database) AddToStats2023(s Stats2023) error {
 	matches, err := database.QueryMatchesString(s.TeamNumber)
 	if err != nil {
@@ -298,34 +231,6 @@
 	return actions, result.Error
 }
 
-// Packs the stats. This really just consists of taking the individual auto
-// ball booleans and turning them into an array. The individual booleans are
-// cleared so that they don't affect struct comparisons.
-func packStats(stats *Stats) {
-	stats.AutoBallPickedUp = [5]bool{
-		stats.AutoBallPickedUp1,
-		stats.AutoBallPickedUp2,
-		stats.AutoBallPickedUp3,
-		stats.AutoBallPickedUp4,
-		stats.AutoBallPickedUp5,
-	}
-	stats.AutoBallPickedUp1 = false
-	stats.AutoBallPickedUp2 = false
-	stats.AutoBallPickedUp3 = false
-	stats.AutoBallPickedUp4 = false
-	stats.AutoBallPickedUp5 = false
-}
-
-func (database *Database) ReturnStats() ([]Stats, error) {
-	var stats []Stats
-	result := database.Find(&stats)
-	// Pack the auto balls array.
-	for i := range stats {
-		packStats(&stats[i])
-	}
-	return stats, result.Error
-}
-
 func (database *Database) ReturnStats2023() ([]Stats2023, error) {
 	var stats2023 []Stats2023
 	result := database.Find(&stats2023)
@@ -369,16 +274,6 @@
 	return shifts, result.Error
 }
 
-func (database *Database) QueryStats(teamNumber_ int) ([]Stats, error) {
-	var stats []Stats
-	result := database.Where("team_number = ?", teamNumber_).Find(&stats)
-	// Pack the auto balls array.
-	for i := range stats {
-		packStats(&stats[i])
-	}
-	return stats, result.Error
-}
-
 func (database *Database) QueryActions(teamNumber_ int) ([]Action, error) {
 	var actions []Action
 	result := database.
diff --git a/scouting/db/db_test.go b/scouting/db/db_test.go
index 72c5f86..bd2bb68 100644
--- a/scouting/db/db_test.go
+++ b/scouting/db/db_test.go
@@ -6,7 +6,6 @@
 	"os"
 	"os/exec"
 	"reflect"
-	"strings"
 	"testing"
 	"time"
 
@@ -139,99 +138,6 @@
 	}
 }
 
-func TestAddToStatsDB(t *testing.T) {
-	fixture := createDatabase(t)
-	defer fixture.TearDown()
-
-	correct := []Stats{
-		Stats{
-			TeamNumber: 1236, MatchNumber: 7,
-			StartingQuadrant: 2,
-			AutoBallPickedUp: [5]bool{false, false, false, true, false},
-			ShotsMissed:      9, UpperGoalShots: 5, LowerGoalShots: 4,
-			ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
-			PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
-			Comment: "this is a comment", CollectedBy: "josh",
-		},
-		Stats{
-			TeamNumber: 1001, MatchNumber: 7,
-			StartingQuadrant: 3,
-			AutoBallPickedUp: [5]bool{true, false, true, true, false},
-			ShotsMissed:      6, UpperGoalShots: 9, LowerGoalShots: 9,
-			ShotsMissedAuto: 0, UpperGoalAuto: 0, LowerGoalAuto: 0,
-			PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
-			Comment: "another comment", CollectedBy: "rupert",
-		},
-		Stats{
-			TeamNumber: 777, MatchNumber: 7,
-			StartingQuadrant: 4,
-			AutoBallPickedUp: [5]bool{false, true, true, true, false},
-			ShotsMissed:      5, UpperGoalShots: 7, LowerGoalShots: 12,
-			ShotsMissedAuto: 0, UpperGoalAuto: 4, LowerGoalAuto: 0,
-			PlayedDefense: 0, DefenseReceivedScore: 3, Climbing: 0,
-			Comment: "and another", CollectedBy: "felix",
-		},
-		Stats{
-			TeamNumber: 1000, MatchNumber: 7,
-			StartingQuadrant: 1,
-			AutoBallPickedUp: [5]bool{false, false, false, false, false},
-			ShotsMissed:      12, UpperGoalShots: 6, LowerGoalShots: 10,
-			ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
-			PlayedDefense: 0, DefenseReceivedScore: 1, Climbing: 0,
-			Comment: "and another one", CollectedBy: "thea",
-		},
-		Stats{
-			TeamNumber: 4321, MatchNumber: 7,
-			StartingQuadrant: 2,
-			AutoBallPickedUp: [5]bool{true, false, false, false, false},
-			ShotsMissed:      14, UpperGoalShots: 12, LowerGoalShots: 3,
-			ShotsMissedAuto: 0, UpperGoalAuto: 7, LowerGoalAuto: 0,
-			PlayedDefense: 0, DefenseReceivedScore: 0, Climbing: 0,
-			Comment: "more comment", CollectedBy: "amy",
-		},
-		Stats{
-			TeamNumber: 1234, MatchNumber: 7,
-			StartingQuadrant: 3,
-			AutoBallPickedUp: [5]bool{false, false, false, false, true},
-			ShotsMissed:      3, UpperGoalShots: 4, LowerGoalShots: 0,
-			ShotsMissedAuto: 0, UpperGoalAuto: 9, LowerGoalAuto: 0,
-			PlayedDefense: 0, DefenseReceivedScore: 5, Climbing: 0,
-			Comment: "final comment", CollectedBy: "beth",
-		},
-	}
-	matches := []TeamMatch{
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 1, TeamNumber: "1236"},
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 2, TeamNumber: "1001"},
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 3, TeamNumber: "777"},
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 1, TeamNumber: "1000"},
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 2, TeamNumber: "4321"},
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 3, TeamNumber: "1234"},
-	}
-
-	for _, match := range matches {
-		err := fixture.db.AddToMatch(match)
-		check(t, err, "Failed to add match")
-	}
-
-	for i := 0; i < len(correct); i++ {
-		err := fixture.db.AddToStats(correct[i])
-		check(t, err, "Failed to add stats to DB")
-	}
-
-	got, err := fixture.db.ReturnStats()
-	check(t, err, "Failed ReturnStats()")
-
-	if !reflect.DeepEqual(correct, got) {
-		t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
-	}
-}
-
 func TestAddToStats2023DB(t *testing.T) {
 	fixture := createDatabase(t)
 	defer fixture.TearDown()
@@ -403,55 +309,6 @@
 	}
 }
 
-func TestAddDuplicateStats(t *testing.T) {
-	fixture := createDatabase(t)
-	defer fixture.TearDown()
-
-	stats := Stats{
-		TeamNumber: 1236, MatchNumber: 7,
-		SetNumber: 1, CompLevel: "qual",
-		StartingQuadrant: 2,
-		AutoBallPickedUp: [5]bool{false, false, false, true, false},
-		ShotsMissed:      9, UpperGoalShots: 5, LowerGoalShots: 4,
-		ShotsMissedAuto: 3, UpperGoalAuto: 2, LowerGoalAuto: 1,
-		PlayedDefense: 2, DefenseReceivedScore: 0, Climbing: 3,
-		Comment: "this is a comment", CollectedBy: "josh",
-	}
-
-	matches := []TeamMatch{
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 1, TeamNumber: "1236"},
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 2, TeamNumber: "1001"},
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 3, TeamNumber: "777"},
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 1, TeamNumber: "1000"},
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 2, TeamNumber: "4321"},
-		TeamMatch{MatchNumber: 7, SetNumber: 1, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 3, TeamNumber: "1234"},
-	}
-
-	for _, match := range matches {
-		err := fixture.db.AddToMatch(match)
-		check(t, err, "Failed to add match")
-	}
-
-	// Add stats. This should succeed.
-	err := fixture.db.AddToStats(stats)
-	check(t, err, "Failed to add stats to DB")
-
-	// Try again. It should fail this time.
-	err = fixture.db.AddToStats(stats)
-	if err == nil {
-		t.Fatal("Failed to get error when adding duplicate stats.")
-	}
-	if !strings.Contains(err.Error(), "ERROR: duplicate key value violates unique constraint") {
-		t.Fatal("Expected error message to be complain about duplicate key value, but got ", err)
-	}
-}
-
 func TestDeleteFromStats(t *testing.T) {
 	fixture := createDatabase(t)
 	defer fixture.TearDown()
@@ -621,104 +478,6 @@
 	}
 }
 
-func TestQueryStatsDB(t *testing.T) {
-	fixture := createDatabase(t)
-	defer fixture.TearDown()
-
-	testDatabase := []Stats{
-		Stats{
-			TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			StartingQuadrant: 1,
-			AutoBallPickedUp: [5]bool{false, false, false, false, false},
-			ShotsMissed:      2, UpperGoalShots: 2, LowerGoalShots: 2,
-			ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
-			PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2},
-		Stats{
-			TeamNumber: 1234, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			StartingQuadrant: 2,
-			AutoBallPickedUp: [5]bool{false, false, false, false, true},
-			ShotsMissed:      4, UpperGoalShots: 4, LowerGoalShots: 4,
-			ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
-			PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
-		},
-		Stats{
-			TeamNumber: 1233, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			StartingQuadrant: 3,
-			AutoBallPickedUp: [5]bool{false, false, false, false, false},
-			ShotsMissed:      3, UpperGoalShots: 3, LowerGoalShots: 3,
-			ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
-			PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
-		},
-		Stats{
-			TeamNumber: 1232, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			StartingQuadrant: 2,
-			AutoBallPickedUp: [5]bool{true, false, false, false, true},
-			ShotsMissed:      5, UpperGoalShots: 5, LowerGoalShots: 5,
-			ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
-			PlayedDefense: 7, DefenseReceivedScore: 2, Climbing: 1,
-		},
-		Stats{
-			TeamNumber: 1231, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			StartingQuadrant: 3,
-			AutoBallPickedUp: [5]bool{false, false, true, false, false},
-			ShotsMissed:      6, UpperGoalShots: 6, LowerGoalShots: 6,
-			ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
-			PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 1,
-		},
-		Stats{
-			TeamNumber: 1239, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			StartingQuadrant: 4,
-			AutoBallPickedUp: [5]bool{false, true, true, false, false},
-			ShotsMissed:      7, UpperGoalShots: 7, LowerGoalShots: 7,
-			ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
-			PlayedDefense: 7, DefenseReceivedScore: 5, Climbing: 1,
-		},
-	}
-
-	matches := []TeamMatch{
-		TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
-		TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 2, TeamNumber: "1234"},
-		TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 3, TeamNumber: "1233"},
-		TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 1, TeamNumber: "1232"},
-		TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 2, TeamNumber: "1231"},
-		TeamMatch{MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 3, TeamNumber: "1239"},
-	}
-
-	for _, match := range matches {
-		err := fixture.db.AddToMatch(match)
-		check(t, err, "Failed to add match")
-	}
-
-	for i := 0; i < len(testDatabase); i++ {
-		err := fixture.db.AddToStats(testDatabase[i])
-		check(t, err, fmt.Sprint("Failed to add stats ", i))
-	}
-
-	correct := []Stats{
-		Stats{
-			TeamNumber: 1235, MatchNumber: 94, SetNumber: 2, CompLevel: "quals",
-			StartingQuadrant: 1,
-			AutoBallPickedUp: [5]bool{false, false, false, false, false},
-			ShotsMissed:      2, UpperGoalShots: 2, LowerGoalShots: 2,
-			ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
-			PlayedDefense: 2, DefenseReceivedScore: 1, Climbing: 2,
-		},
-	}
-
-	got, err := fixture.db.QueryStats(1235)
-	check(t, err, "Failed QueryStats()")
-
-	if !reflect.DeepEqual(correct, got) {
-		t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
-	}
-}
-
 func TestQueryRankingsDB(t *testing.T) {
 	fixture := createDatabase(t)
 	defer fixture.TearDown()
@@ -898,93 +657,6 @@
 	}
 }
 
-func TestReturnStatsDB(t *testing.T) {
-	fixture := createDatabase(t)
-	defer fixture.TearDown()
-
-	correct := []Stats{
-		Stats{
-			TeamNumber: 1235, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			StartingQuadrant: 1,
-			AutoBallPickedUp: [5]bool{false, false, false, false, false},
-			ShotsMissed:      2, UpperGoalShots: 2, LowerGoalShots: 2,
-			ShotsMissedAuto: 2, UpperGoalAuto: 2, LowerGoalAuto: 2,
-			PlayedDefense: 2, DefenseReceivedScore: 3, Climbing: 2},
-		Stats{
-			TeamNumber: 1236, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			StartingQuadrant: 2,
-			AutoBallPickedUp: [5]bool{false, false, false, false, true},
-			ShotsMissed:      4, UpperGoalShots: 4, LowerGoalShots: 4,
-			ShotsMissedAuto: 4, UpperGoalAuto: 4, LowerGoalAuto: 4,
-			PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 2,
-		},
-		Stats{
-			TeamNumber: 1237, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			StartingQuadrant: 3,
-			AutoBallPickedUp: [5]bool{false, false, false, false, false},
-			ShotsMissed:      3, UpperGoalShots: 3, LowerGoalShots: 3,
-			ShotsMissedAuto: 3, UpperGoalAuto: 3, LowerGoalAuto: 3,
-			PlayedDefense: 3, DefenseReceivedScore: 0, Climbing: 3,
-		},
-		Stats{
-			TeamNumber: 1238, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			StartingQuadrant: 2,
-			AutoBallPickedUp: [5]bool{true, false, false, false, true},
-			ShotsMissed:      5, UpperGoalShots: 5, LowerGoalShots: 5,
-			ShotsMissedAuto: 5, UpperGoalAuto: 5, LowerGoalAuto: 5,
-			PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
-		},
-		Stats{
-			TeamNumber: 1239, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			StartingQuadrant: 3,
-			AutoBallPickedUp: [5]bool{false, false, true, false, false},
-			ShotsMissed:      6, UpperGoalShots: 6, LowerGoalShots: 6,
-			ShotsMissedAuto: 6, UpperGoalAuto: 6, LowerGoalAuto: 6,
-			PlayedDefense: 7, DefenseReceivedScore: 4, Climbing: 1,
-		},
-		Stats{
-			TeamNumber: 1233, MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			StartingQuadrant: 4,
-			AutoBallPickedUp: [5]bool{false, true, true, false, false},
-			ShotsMissed:      7, UpperGoalShots: 7, LowerGoalShots: 7,
-			ShotsMissedAuto: 7, UpperGoalAuto: 7, LowerGoalAuto: 3,
-			PlayedDefense: 7, DefenseReceivedScore: 1, Climbing: 1,
-		},
-	}
-
-	matches := []TeamMatch{
-		TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 1, TeamNumber: "1235"},
-		TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 2, TeamNumber: "1236"},
-		TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			Alliance: "R", AlliancePosition: 3, TeamNumber: "1237"},
-		TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 1, TeamNumber: "1238"},
-		TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 2, TeamNumber: "1239"},
-		TeamMatch{MatchNumber: 94, SetNumber: 1, CompLevel: "quals",
-			Alliance: "B", AlliancePosition: 3, TeamNumber: "1233"},
-	}
-
-	for _, match := range matches {
-		err := fixture.db.AddToMatch(match)
-		check(t, err, "Failed to add match")
-	}
-
-	for i := 0; i < len(correct); i++ {
-		err := fixture.db.AddToStats(correct[i])
-		check(t, err, fmt.Sprint("Failed to add stats ", i))
-	}
-
-	got, err := fixture.db.ReturnStats()
-	check(t, err, "Failed ReturnStats()")
-
-	if !reflect.DeepEqual(correct, got) {
-		t.Errorf("Got %#v,\nbut expected %#v.", got, correct)
-	}
-}
-
 func TestReturnStats2023DB(t *testing.T) {
 	fixture := createDatabase(t)
 	defer fixture.TearDown()
diff --git a/scouting/webserver/requests/BUILD b/scouting/webserver/requests/BUILD
index 935d721..2ff8b85 100644
--- a/scouting/webserver/requests/BUILD
+++ b/scouting/webserver/requests/BUILD
@@ -17,16 +17,12 @@
         "//scouting/webserver/requests/messages:request_all_matches_response_go_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_go_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_response_go_fbs",
-        "//scouting/webserver/requests/messages:request_data_scouting_go_fbs",
-        "//scouting/webserver/requests/messages:request_data_scouting_response_go_fbs",
         "//scouting/webserver/requests/messages:request_notes_for_team_go_fbs",
         "//scouting/webserver/requests/messages:request_notes_for_team_response_go_fbs",
         "//scouting/webserver/requests/messages:request_shift_schedule_go_fbs",
         "//scouting/webserver/requests/messages:request_shift_schedule_response_go_fbs",
         "//scouting/webserver/requests/messages:submit_actions_go_fbs",
         "//scouting/webserver/requests/messages:submit_actions_response_go_fbs",
-        "//scouting/webserver/requests/messages:submit_data_scouting_go_fbs",
-        "//scouting/webserver/requests/messages:submit_data_scouting_response_go_fbs",
         "//scouting/webserver/requests/messages:submit_driver_ranking_go_fbs",
         "//scouting/webserver/requests/messages:submit_driver_ranking_response_go_fbs",
         "//scouting/webserver/requests/messages:submit_notes_go_fbs",
@@ -46,7 +42,6 @@
     deps = [
         "//scouting/db",
         "//scouting/webserver/requests/debug",
-        "//scouting/webserver/requests/messages:error_response_go_fbs",
         "//scouting/webserver/requests/messages:request_2023_data_scouting_go_fbs",
         "//scouting/webserver/requests/messages:request_2023_data_scouting_response_go_fbs",
         "//scouting/webserver/requests/messages:request_all_driver_rankings_go_fbs",
@@ -55,14 +50,10 @@
         "//scouting/webserver/requests/messages:request_all_matches_response_go_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_go_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_response_go_fbs",
-        "//scouting/webserver/requests/messages:request_data_scouting_go_fbs",
-        "//scouting/webserver/requests/messages:request_data_scouting_response_go_fbs",
         "//scouting/webserver/requests/messages:request_notes_for_team_go_fbs",
         "//scouting/webserver/requests/messages:request_shift_schedule_go_fbs",
         "//scouting/webserver/requests/messages:request_shift_schedule_response_go_fbs",
         "//scouting/webserver/requests/messages:submit_actions_go_fbs",
-        "//scouting/webserver/requests/messages:submit_data_scouting_go_fbs",
-        "//scouting/webserver/requests/messages:submit_data_scouting_response_go_fbs",
         "//scouting/webserver/requests/messages:submit_driver_ranking_go_fbs",
         "//scouting/webserver/requests/messages:submit_notes_go_fbs",
         "//scouting/webserver/requests/messages:submit_shift_schedule_go_fbs",
diff --git a/scouting/webserver/requests/debug/BUILD b/scouting/webserver/requests/debug/BUILD
index 355fff0..f3f4a72 100644
--- a/scouting/webserver/requests/debug/BUILD
+++ b/scouting/webserver/requests/debug/BUILD
@@ -12,10 +12,8 @@
         "//scouting/webserver/requests/messages:request_all_driver_rankings_response_go_fbs",
         "//scouting/webserver/requests/messages:request_all_matches_response_go_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_response_go_fbs",
-        "//scouting/webserver/requests/messages:request_data_scouting_response_go_fbs",
         "//scouting/webserver/requests/messages:request_notes_for_team_response_go_fbs",
         "//scouting/webserver/requests/messages:request_shift_schedule_response_go_fbs",
-        "//scouting/webserver/requests/messages:submit_data_scouting_response_go_fbs",
         "//scouting/webserver/requests/messages:submit_driver_ranking_response_go_fbs",
         "//scouting/webserver/requests/messages:submit_notes_response_go_fbs",
         "//scouting/webserver/requests/messages:submit_shift_schedule_response_go_fbs",
diff --git a/scouting/webserver/requests/debug/cli/cli_test.py b/scouting/webserver/requests/debug/cli/cli_test.py
index 4763058..51308d7 100644
--- a/scouting/webserver/requests/debug/cli/cli_test.py
+++ b/scouting/webserver/requests/debug/cli/cli_test.py
@@ -96,89 +96,6 @@
 
             time.sleep(0.25)
 
-    def test_submit_and_request_data_scouting(self):
-        self.start_servers(year=2020, event_code="fake")
-
-        # First submit some data to be added to the database.
-        json_path = write_json_request({
-            "team":
-            100,
-            "match":
-            1,
-            "set_number":
-            2,
-            "comp_level":
-            "quals",
-            "starting_quadrant":
-            3,
-            "auto_ball_1":
-            True,
-            "auto_ball_2":
-            False,
-            "auto_ball_3":
-            False,
-            "auto_ball_4":
-            False,
-            "auto_ball_5":
-            True,
-            "missed_shots_auto":
-            10,
-            "upper_goal_auto":
-            11,
-            "lower_goal_auto":
-            12,
-            "missed_shots_tele":
-            13,
-            "upper_goal_tele":
-            14,
-            "lower_goal_tele":
-            15,
-            "defense_rating":
-            3,
-            "defense_received_rating":
-            4,
-            "climb_level":
-            "Medium",
-            "comment":
-            "A very inspiring and useful comment",
-        })
-        exit_code, _, stderr = run_debug_cli(
-            ["-submitDataScouting", json_path])
-        self.assertEqual(exit_code, 0, stderr)
-
-        # Now request the data back with zero indentation. That let's us
-        # validate the data easily.
-        json_path = write_json_request({})
-        exit_code, stdout, stderr = run_debug_cli(
-            ["-requestDataScouting", json_path, "-indent="])
-
-        self.assertEqual(exit_code, 0, stderr)
-        self.assertIn(
-            textwrap.dedent("""\
-            {
-            Team: (int32) 100,
-            Match: (int32) 1,
-            MissedShotsAuto: (int32) 10,
-            UpperGoalAuto: (int32) 11,
-            LowerGoalAuto: (int32) 12,
-            MissedShotsTele: (int32) 13,
-            UpperGoalTele: (int32) 14,
-            LowerGoalTele: (int32) 15,
-            DefenseRating: (int32) 3,
-            CollectedBy: (string) (len=9) "debug_cli",
-            AutoBall1: (bool) true,
-            AutoBall2: (bool) false,
-            AutoBall3: (bool) false,
-            AutoBall4: (bool) false,
-            AutoBall5: (bool) true,
-            StartingQuadrant: (int32) 3,
-            ClimbLevel: (request_data_scouting_response.ClimbLevel) Medium,
-            DefenseReceivedRating: (int32) 4,
-            Comment: (string) (len=35) "A very inspiring and useful comment",
-            SetNumber: (int32) 2,
-            CompLevel: (string) (len=5) "quals"
-            }"""), stdout)
-
     def test_submit_and_request_notes(self):
         self.start_servers(year=2020, event_code="fake")
 
diff --git a/scouting/webserver/requests/debug/cli/main.go b/scouting/webserver/requests/debug/cli/main.go
index 58e24a2..a4346e5 100644
--- a/scouting/webserver/requests/debug/cli/main.go
+++ b/scouting/webserver/requests/debug/cli/main.go
@@ -83,16 +83,12 @@
 		"The indentation to use for the result dumping. Default is a space.")
 	addressPtr := flag.String("address", "http://localhost:8080",
 		"The end point where the server is listening.")
-	submitDataScoutingPtr := flag.String("submitDataScouting", "",
-		"If specified, parse the file as a SubmitDataScouting JSON request.")
 	submitDriverRankingPtr := flag.String("submitDriverRanking", "",
 		"If specified, parse the file as a submitDriverRanking JSON request.")
 	submitNotesPtr := flag.String("submitNotes", "",
 		"If specified, parse the file as a submitNotes JSON request.")
 	requestAllMatchesPtr := flag.String("requestAllMatches", "",
 		"If specified, parse the file as a RequestAllMatches JSON request.")
-	requestDataScoutingPtr := flag.String("requestDataScouting", "",
-		"If specified, parse the file as a RequestDataScouting JSON request.")
 	request2023DataScoutingPtr := flag.String("request2023DataScouting", "",
 		"If specified, parse the file as a Request2023DataScouting JSON request.")
 	requestAllDriverRankingsPtr := flag.String("requestAllDriverRankings", "",
@@ -108,13 +104,6 @@
 
 	// Handle the actual arguments.
 	maybePerformRequest(
-		"SubmitDataScouting",
-		"scouting/webserver/requests/messages/submit_data_scouting.fbs",
-		*submitDataScoutingPtr,
-		*addressPtr,
-		debug.SubmitDataScouting)
-
-	maybePerformRequest(
 		"submitNotes",
 		"scouting/webserver/requests/messages/submit_notes.fbs",
 		*submitNotesPtr,
@@ -136,13 +125,6 @@
 		debug.RequestAllMatches)
 
 	maybePerformRequest(
-		"RequestDataScouting",
-		"scouting/webserver/requests/messages/request_data_scouting.fbs",
-		*requestDataScoutingPtr,
-		*addressPtr,
-		debug.RequestDataScouting)
-
-	maybePerformRequest(
 		"Request2023DataScouting",
 		"scouting/webserver/requests/messages/request_2023_data_scouting.fbs",
 		*request2023DataScoutingPtr,
diff --git a/scouting/webserver/requests/debug/debug.go b/scouting/webserver/requests/debug/debug.go
index 60d14be..eb3a1ca 100644
--- a/scouting/webserver/requests/debug/debug.go
+++ b/scouting/webserver/requests/debug/debug.go
@@ -14,10 +14,8 @@
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule_response"
@@ -106,12 +104,6 @@
 	return response.UnPack(), nil
 }
 
-func SubmitDataScouting(server string, requestBytes []byte) (*submit_data_scouting_response.SubmitDataScoutingResponseT, error) {
-	return sendMessage[submit_data_scouting_response.SubmitDataScoutingResponseT](
-		server+"/requests/submit/data_scouting", requestBytes,
-		submit_data_scouting_response.GetRootAsSubmitDataScoutingResponse)
-}
-
 func RequestAllMatches(server string, requestBytes []byte) (*request_all_matches_response.RequestAllMatchesResponseT, error) {
 	return sendMessage[request_all_matches_response.RequestAllMatchesResponseT](
 		server+"/requests/request/all_matches", requestBytes,
@@ -124,12 +116,6 @@
 		request_all_driver_rankings_response.GetRootAsRequestAllDriverRankingsResponse)
 }
 
-func RequestDataScouting(server string, requestBytes []byte) (*request_data_scouting_response.RequestDataScoutingResponseT, error) {
-	return sendMessage[request_data_scouting_response.RequestDataScoutingResponseT](
-		server+"/requests/request/data_scouting", requestBytes,
-		request_data_scouting_response.GetRootAsRequestDataScoutingResponse)
-}
-
 func Request2023DataScouting(server string, requestBytes []byte) (*request_2023_data_scouting_response.Request2023DataScoutingResponseT, error) {
 	return sendMessage[request_2023_data_scouting_response.Request2023DataScoutingResponseT](
 		server+"/requests/request/2023_data_scouting", requestBytes,
diff --git a/scouting/webserver/requests/messages/BUILD b/scouting/webserver/requests/messages/BUILD
index a04f39f..c1cd999 100644
--- a/scouting/webserver/requests/messages/BUILD
+++ b/scouting/webserver/requests/messages/BUILD
@@ -3,16 +3,12 @@
 
 FILE_NAMES = (
     "error_response",
-    "submit_data_scouting",
-    "submit_data_scouting_response",
     "request_all_driver_rankings",
     "request_all_driver_rankings_response",
     "request_all_matches",
     "request_all_matches_response",
     "request_all_notes",
     "request_all_notes_response",
-    "request_data_scouting",
-    "request_data_scouting_response",
     "request_2023_data_scouting",
     "request_2023_data_scouting_response",
     "submit_notes",
diff --git a/scouting/webserver/requests/messages/request_data_scouting.fbs b/scouting/webserver/requests/messages/request_data_scouting.fbs
deleted file mode 100644
index 884c1a6..0000000
--- a/scouting/webserver/requests/messages/request_data_scouting.fbs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace scouting.webserver.requests;
-
-table RequestDataScouting {
-    // TODO: Implement this.
-}
-
-root_type RequestDataScouting;
diff --git a/scouting/webserver/requests/messages/request_data_scouting_response.fbs b/scouting/webserver/requests/messages/request_data_scouting_response.fbs
deleted file mode 100644
index 6048210..0000000
--- a/scouting/webserver/requests/messages/request_data_scouting_response.fbs
+++ /dev/null
@@ -1,52 +0,0 @@
-namespace scouting.webserver.requests;
-
-// TODO(phil): Deduplicate with submit_data_scouting.
-// At the moment, our Go setup doesn't handle includes.
-enum ClimbLevel : byte {
-    NoAttempt = 0,
-    Failed,
-    // Tried for more than 10 seconds and failed.
-    FailedWithPlentyOfTime,
-    Low,
-    Medium,
-    High,
-    Traversal,
-}
-
-table Stats {
-    team:int (id: 0);
-    match:int (id: 1);
-    set_number:int (id: 20);
-    comp_level:string (id: 21);
-
-    missed_shots_auto:int (id: 2);
-    upper_goal_auto:int (id:3);
-    lower_goal_auto:int (id:4);
-    missed_shots_tele:int (id: 5);
-    upper_goal_tele:int (id:6);
-    lower_goal_tele:int (id:7);
-    defense_rating:int (id:8);
-    defense_received_rating:int (id:18);
-
-    climbing:int (id:9, deprecated);
-    climb_level:ClimbLevel (id:17);
-
-    collected_by:string (id:10);
-
-    auto_ball_1:bool (id:11);
-    auto_ball_2:bool (id:12);
-    auto_ball_3:bool (id:13);
-    auto_ball_4:bool (id:14);
-    auto_ball_5:bool (id:15);
-    // The quadrant that the robot starts in for autonomous mode.
-    // Valid values are 1 through 4.
-    starting_quadrant: int (id:16);
-
-    comment:string (id:19);
-}
-
-table RequestDataScoutingResponse {
-    stats_list:[Stats] (id:0);
-}
-
-root_type RequestDataScoutingResponse;
\ No newline at end of file
diff --git a/scouting/webserver/requests/messages/submit_data_scouting.fbs b/scouting/webserver/requests/messages/submit_data_scouting.fbs
deleted file mode 100644
index 36990f5..0000000
--- a/scouting/webserver/requests/messages/submit_data_scouting.fbs
+++ /dev/null
@@ -1,55 +0,0 @@
-namespace scouting.webserver.requests;
-
-// TODO(phil): Deduplicate with request_scouting_data_response.
-// At the moment, our Go setup doesn't handle includes.
-enum ClimbLevel : byte {
-    NoAttempt = 0,
-    Failed,
-    // Tried for more than 10 seconds and failed.
-    FailedWithPlentyOfTime,
-    Low,
-    Medium,
-    High,
-    Traversal,
-}
-
-table SubmitDataScouting {
-    team:int (id: 0);
-    match:int (id: 1);
-    set_number:int (id: 19);
-    comp_level:string (id: 20);
-
-    missed_shots_auto:int (id: 2);
-    upper_goal_auto:int (id:3);
-    lower_goal_auto:int (id:4);
-    missed_shots_tele:int (id: 5);
-    upper_goal_tele:int (id:6);
-    lower_goal_tele:int (id:7);
-    // The rating that is used to rate the defense that this robot played on
-    // other robots.
-    // TODO: Document what the different values mean. E.g. 0 means no defense
-    // played?
-    defense_rating:int (id:8);
-    // The amount of defense that other robots played on this robot.
-    // TODO: Document what the different values mean. E.g. 0 means no defense
-    // played against this robot?
-    defense_received_rating:int (id:10);
-
-    climbing:int (id:9, deprecated);
-    climb_level:ClimbLevel (id:17);
-
-    auto_ball_1:bool (id:11);
-    auto_ball_2:bool (id:12);
-    auto_ball_3:bool (id:13);
-    auto_ball_4:bool (id:14);
-    auto_ball_5:bool (id:15);
-    // The quadrant that the robot starts in for autonomous mode.
-    // Valid values are 1 through 4.
-    starting_quadrant: int (id:16);
-
-    // A general comment that scouts can use as a way to record non-numerical
-    // data if they need to.
-    comment: string (id:18);
-}
-
-root_type SubmitDataScouting;
diff --git a/scouting/webserver/requests/messages/submit_data_scouting_response.fbs b/scouting/webserver/requests/messages/submit_data_scouting_response.fbs
deleted file mode 100644
index fb7f765..0000000
--- a/scouting/webserver/requests/messages/submit_data_scouting_response.fbs
+++ /dev/null
@@ -1,7 +0,0 @@
-namespace scouting.webserver.requests;
-
-table SubmitDataScoutingResponse {
-    // TODO: Implement this.
-}
-
-root_type SubmitDataScoutingResponse;
diff --git a/scouting/webserver/requests/requests.go b/scouting/webserver/requests/requests.go
index 4f12a4f..19f63b8 100644
--- a/scouting/webserver/requests/requests.go
+++ b/scouting/webserver/requests/requests.go
@@ -21,16 +21,12 @@
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions_response"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
@@ -41,16 +37,12 @@
 	flatbuffers "github.com/google/flatbuffers/go"
 )
 
-type SubmitDataScouting = submit_data_scouting.SubmitDataScouting
-type SubmitDataScoutingResponseT = submit_data_scouting_response.SubmitDataScoutingResponseT
 type RequestAllMatches = request_all_matches.RequestAllMatches
 type RequestAllMatchesResponseT = request_all_matches_response.RequestAllMatchesResponseT
 type RequestAllDriverRankings = request_all_driver_rankings.RequestAllDriverRankings
 type RequestAllDriverRankingsResponseT = request_all_driver_rankings_response.RequestAllDriverRankingsResponseT
 type RequestAllNotes = request_all_notes.RequestAllNotes
 type RequestAllNotesResponseT = request_all_notes_response.RequestAllNotesResponseT
-type RequestDataScouting = request_data_scouting.RequestDataScouting
-type RequestDataScoutingResponseT = request_data_scouting_response.RequestDataScoutingResponseT
 type Request2023DataScouting = request_2023_data_scouting.Request2023DataScouting
 type Request2023DataScoutingResponseT = request_2023_data_scouting_response.Request2023DataScoutingResponseT
 type SubmitNotes = submit_notes.SubmitNotes
@@ -71,17 +63,14 @@
 type Database interface {
 	AddToMatch(db.TeamMatch) error
 	AddToShift(db.Shift) error
-	AddToStats(db.Stats) error
 	AddToStats2023(db.Stats2023) error
 	ReturnMatches() ([]db.TeamMatch, error)
 	ReturnAllNotes() ([]db.NotesData, error)
 	ReturnAllDriverRankings() ([]db.DriverRankingData, error)
 	ReturnAllShifts() ([]db.Shift, error)
-	ReturnStats() ([]db.Stats, error)
 	ReturnStats2023() ([]db.Stats2023, error)
 	ReturnStats2023ForTeam(teamNumber string, matchNumber int32, setNumber int32, compLevel string) ([]db.Stats2023, error)
 	QueryAllShifts(int) ([]db.Shift, error)
-	QueryStats(int) ([]db.Stats, error)
 	QueryNotes(int32) ([]string, error)
 	AddNotes(db.NotesData) error
 	AddDriverRanking(db.DriverRankingData) error
@@ -145,69 +134,6 @@
 	return loginParts[0]
 }
 
-// Handles a SubmitDataScouting request.
-type submitDataScoutingHandler struct {
-	db Database
-}
-
-func (handler submitDataScoutingHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
-	// Get the username of the person submitting the data.
-	username := parseUsername(req)
-
-	requestBytes, err := io.ReadAll(req.Body)
-	if err != nil {
-		respondWithError(w, http.StatusBadRequest, fmt.Sprint("Failed to read request bytes:", err))
-		return
-	}
-
-	request, success := parseRequest[SubmitDataScouting](w, requestBytes, "SubmitDataScouting", submit_data_scouting.GetRootAsSubmitDataScouting)
-	if !success {
-		return
-	}
-
-	log.Println("Got data scouting data for match", request.Match(), "team", request.Team(), "from", username)
-
-	stats := db.Stats{
-		TeamNumber:       request.Team(),
-		MatchNumber:      request.Match(),
-		SetNumber:        request.SetNumber(),
-		CompLevel:        string(request.CompLevel()),
-		StartingQuadrant: request.StartingQuadrant(),
-		AutoBallPickedUp: [5]bool{
-			request.AutoBall1(), request.AutoBall2(), request.AutoBall3(),
-			request.AutoBall4(), request.AutoBall5(),
-		},
-		ShotsMissedAuto:      request.MissedShotsAuto(),
-		UpperGoalAuto:        request.UpperGoalAuto(),
-		LowerGoalAuto:        request.LowerGoalAuto(),
-		ShotsMissed:          request.MissedShotsTele(),
-		UpperGoalShots:       request.UpperGoalTele(),
-		LowerGoalShots:       request.LowerGoalTele(),
-		PlayedDefense:        request.DefenseRating(),
-		DefenseReceivedScore: request.DefenseReceivedRating(),
-		Climbing:             int32(request.ClimbLevel()),
-		CollectedBy:          username,
-		Comment:              string(request.Comment()),
-	}
-
-	// Do some error checking.
-	if stats.StartingQuadrant < 1 || stats.StartingQuadrant > 4 {
-		respondWithError(w, http.StatusBadRequest, fmt.Sprint(
-			"Invalid starting_quadrant field value of ", stats.StartingQuadrant))
-		return
-	}
-
-	err = handler.db.AddToStats(stats)
-	if err != nil {
-		respondWithError(w, http.StatusInternalServerError, fmt.Sprint("Failed to submit datascouting data: ", err))
-		return
-	}
-
-	builder := flatbuffers.NewBuilder(50 * 1024)
-	builder.Finish((&SubmitDataScoutingResponseT{}).Pack(builder))
-	w.Write(builder.FinishedBytes())
-}
-
 // Handles a RequestAllMaches request.
 type requestAllMatchesHandler struct {
 	db Database
@@ -406,61 +332,6 @@
 	w.Write(builder.FinishedBytes())
 }
 
-// Handles a RequestDataScouting request.
-type requestDataScoutingHandler struct {
-	db Database
-}
-
-func (handler requestDataScoutingHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
-	requestBytes, err := io.ReadAll(req.Body)
-	if err != nil {
-		respondWithError(w, http.StatusBadRequest, fmt.Sprint("Failed to read request bytes:", err))
-		return
-	}
-
-	_, success := parseRequest(w, requestBytes, "RequestDataScouting", request_data_scouting.GetRootAsRequestDataScouting)
-	if !success {
-		return
-	}
-
-	stats, err := handler.db.ReturnStats()
-	if err != nil {
-		respondWithError(w, http.StatusInternalServerError, fmt.Sprint("Failed to query database: ", err))
-		return
-	}
-
-	var response RequestDataScoutingResponseT
-	for _, stat := range stats {
-		response.StatsList = append(response.StatsList, &request_data_scouting_response.StatsT{
-			Team:                  stat.TeamNumber,
-			Match:                 stat.MatchNumber,
-			SetNumber:             stat.SetNumber,
-			CompLevel:             stat.CompLevel,
-			StartingQuadrant:      stat.StartingQuadrant,
-			AutoBall1:             stat.AutoBallPickedUp[0],
-			AutoBall2:             stat.AutoBallPickedUp[1],
-			AutoBall3:             stat.AutoBallPickedUp[2],
-			AutoBall4:             stat.AutoBallPickedUp[3],
-			AutoBall5:             stat.AutoBallPickedUp[4],
-			MissedShotsAuto:       stat.ShotsMissedAuto,
-			UpperGoalAuto:         stat.UpperGoalAuto,
-			LowerGoalAuto:         stat.LowerGoalAuto,
-			MissedShotsTele:       stat.ShotsMissed,
-			UpperGoalTele:         stat.UpperGoalShots,
-			LowerGoalTele:         stat.LowerGoalShots,
-			DefenseRating:         stat.PlayedDefense,
-			DefenseReceivedRating: stat.DefenseReceivedScore,
-			ClimbLevel:            request_data_scouting_response.ClimbLevel(stat.Climbing),
-			CollectedBy:           stat.CollectedBy,
-			Comment:               stat.Comment,
-		})
-	}
-
-	builder := flatbuffers.NewBuilder(50 * 1024)
-	builder.Finish((&response).Pack(builder))
-	w.Write(builder.FinishedBytes())
-}
-
 type submitNoteScoutingHandler struct {
 	db Database
 }
@@ -908,11 +779,9 @@
 
 func HandleRequests(db Database, scoutingServer server.ScoutingServer) {
 	scoutingServer.HandleFunc("/requests", unknown)
-	scoutingServer.Handle("/requests/submit/data_scouting", submitDataScoutingHandler{db})
 	scoutingServer.Handle("/requests/request/all_matches", requestAllMatchesHandler{db})
 	scoutingServer.Handle("/requests/request/all_notes", requestAllNotesHandler{db})
 	scoutingServer.Handle("/requests/request/all_driver_rankings", requestAllDriverRankingsHandler{db})
-	scoutingServer.Handle("/requests/request/data_scouting", requestDataScoutingHandler{db})
 	scoutingServer.Handle("/requests/request/2023_data_scouting", request2023DataScoutingHandler{db})
 	scoutingServer.Handle("/requests/submit/submit_notes", submitNoteScoutingHandler{db})
 	scoutingServer.Handle("/requests/request/notes_for_team", requestNotesForTeamHandler{db})
diff --git a/scouting/webserver/requests/requests_test.go b/scouting/webserver/requests/requests_test.go
index d2d5acc..409d61c 100644
--- a/scouting/webserver/requests/requests_test.go
+++ b/scouting/webserver/requests/requests_test.go
@@ -1,15 +1,12 @@
 package requests
 
 import (
-	"bytes"
-	"io"
 	"net/http"
 	"reflect"
 	"testing"
 
 	"github.com/frc971/971-Robot-Code/scouting/db"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/debug"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/error_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_2023_data_scouting_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_driver_rankings"
@@ -18,14 +15,10 @@
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_matches_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_all_notes_response"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_data_scouting_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_notes_for_team"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/request_shift_schedule_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_actions"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting"
-	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_data_scouting_response"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_driver_ranking"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_notes"
 	"github.com/frc971/971-Robot-Code/scouting/webserver/requests/messages/submit_shift_schedule"
@@ -50,78 +43,6 @@
 	}
 }
 
-// Validates that we can submit new data scouting data.
-func TestSubmitDataScoutingError(t *testing.T) {
-	db := MockDatabase{}
-	scoutingServer := server.NewScoutingServer()
-	HandleRequests(&db, scoutingServer)
-	scoutingServer.Start(8080)
-	defer scoutingServer.Stop()
-
-	resp, err := http.Post("http://localhost:8080/requests/submit/data_scouting", "application/octet-stream", bytes.NewReader([]byte("")))
-	if err != nil {
-		t.Fatalf("Failed to send request: %v", err)
-	}
-	if resp.StatusCode != http.StatusBadRequest {
-		t.Fatal("Unexpected status code. Got", resp.Status)
-	}
-
-	responseBytes, err := io.ReadAll(resp.Body)
-	if err != nil {
-		t.Fatal("Failed to read response bytes:", err)
-	}
-	errorResponse := error_response.GetRootAsErrorResponse(responseBytes, 0)
-
-	errorMessage := string(errorResponse.ErrorMessage())
-	if errorMessage != "Failed to parse SubmitDataScouting: runtime error: index out of range [3] with length 0" {
-		t.Fatal("Got mismatched error message:", errorMessage)
-	}
-}
-
-// Validates that we can submit new data scouting data.
-func TestSubmitDataScouting(t *testing.T) {
-	db := MockDatabase{}
-	scoutingServer := server.NewScoutingServer()
-	HandleRequests(&db, scoutingServer)
-	scoutingServer.Start(8080)
-	defer scoutingServer.Stop()
-
-	builder := flatbuffers.NewBuilder(1024)
-	builder.Finish((&submit_data_scouting.SubmitDataScoutingT{
-		Team:                  971,
-		Match:                 1,
-		SetNumber:             8,
-		CompLevel:             "quals",
-		StartingQuadrant:      2,
-		AutoBall1:             true,
-		AutoBall2:             false,
-		AutoBall3:             false,
-		AutoBall4:             false,
-		AutoBall5:             false,
-		MissedShotsAuto:       9971,
-		UpperGoalAuto:         9971,
-		LowerGoalAuto:         9971,
-		MissedShotsTele:       9971,
-		UpperGoalTele:         9971,
-		LowerGoalTele:         9971,
-		DefenseRating:         9971,
-		DefenseReceivedRating: 4,
-		ClimbLevel:            submit_data_scouting.ClimbLevelLow,
-		Comment:               "this is a comment",
-	}).Pack(builder))
-
-	response, err := debug.SubmitDataScouting("http://localhost:8080", builder.FinishedBytes())
-	if err != nil {
-		t.Fatal("Failed to submit data scouting: ", err)
-	}
-
-	// We get an empty response back. Validate that.
-	expected := submit_data_scouting_response.SubmitDataScoutingResponseT{}
-	if !reflect.DeepEqual(expected, *response) {
-		t.Fatal("Expected ", expected, ", but got:", *response)
-	}
-}
-
 // Validates that we can request the full match list.
 func TestRequestAllMatches(t *testing.T) {
 	db := MockDatabase{
@@ -280,83 +201,6 @@
 
 }
 
-// Validates that we can request the stats.
-func TestRequestDataScouting(t *testing.T) {
-	db := MockDatabase{
-		stats: []db.Stats{
-			{
-				TeamNumber: 971, MatchNumber: 1, SetNumber: 2, CompLevel: "quals",
-				StartingQuadrant: 1,
-				AutoBallPickedUp: [5]bool{true, false, false, false, true},
-				ShotsMissed:      1, UpperGoalShots: 2, LowerGoalShots: 3,
-				ShotsMissedAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
-				PlayedDefense: 7, DefenseReceivedScore: 3, Climbing: 2,
-				Comment: "a lovely comment", CollectedBy: "john",
-			},
-			{
-				TeamNumber: 972, MatchNumber: 1, SetNumber: 4, CompLevel: "extra",
-				StartingQuadrant: 2,
-				AutoBallPickedUp: [5]bool{false, false, true, false, false},
-				ShotsMissed:      2, UpperGoalShots: 3, LowerGoalShots: 4,
-				ShotsMissedAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
-				PlayedDefense: 8, DefenseReceivedScore: 1, Climbing: 4,
-				Comment: "another lovely comment", CollectedBy: "andrea",
-			},
-		},
-	}
-	scoutingServer := server.NewScoutingServer()
-	HandleRequests(&db, scoutingServer)
-	scoutingServer.Start(8080)
-	defer scoutingServer.Stop()
-
-	builder := flatbuffers.NewBuilder(1024)
-	builder.Finish((&request_data_scouting.RequestDataScoutingT{}).Pack(builder))
-
-	response, err := debug.RequestDataScouting("http://localhost:8080", builder.FinishedBytes())
-	if err != nil {
-		t.Fatal("Failed to request all matches: ", err)
-	}
-
-	expected := request_data_scouting_response.RequestDataScoutingResponseT{
-		StatsList: []*request_data_scouting_response.StatsT{
-			{
-				Team: 971, Match: 1, SetNumber: 2, CompLevel: "quals",
-				MissedShotsAuto: 4, UpperGoalAuto: 5, LowerGoalAuto: 6,
-				MissedShotsTele: 1, UpperGoalTele: 2, LowerGoalTele: 3,
-				DefenseRating:         7,
-				DefenseReceivedRating: 3,
-				CollectedBy:           "john",
-				AutoBall1:             true, AutoBall2: false, AutoBall3: false,
-				AutoBall4: false, AutoBall5: true,
-				StartingQuadrant: 1,
-				ClimbLevel:       request_data_scouting_response.ClimbLevelFailedWithPlentyOfTime,
-				Comment:          "a lovely comment",
-			},
-			{
-				Team: 972, Match: 1, SetNumber: 4, CompLevel: "extra",
-				MissedShotsAuto: 5, UpperGoalAuto: 6, LowerGoalAuto: 7,
-				MissedShotsTele: 2, UpperGoalTele: 3, LowerGoalTele: 4,
-				DefenseRating:         8,
-				DefenseReceivedRating: 1,
-				CollectedBy:           "andrea",
-				AutoBall1:             false, AutoBall2: false, AutoBall3: true,
-				AutoBall4: false, AutoBall5: false,
-				StartingQuadrant: 2,
-				ClimbLevel:       request_data_scouting_response.ClimbLevelMedium,
-				Comment:          "another lovely comment",
-			},
-		},
-	}
-	if len(expected.StatsList) != len(response.StatsList) {
-		t.Fatal("Expected ", expected, ", but got ", *response)
-	}
-	for i, match := range expected.StatsList {
-		if !reflect.DeepEqual(*match, *response.StatsList[i]) {
-			t.Fatal("Expected for stats", i, ":", *match, ", but got:", *response.StatsList[i])
-		}
-	}
-}
-
 // Validates that we can request the 2023 stats.
 func TestRequest2023DataScouting(t *testing.T) {
 	db := MockDatabase{
@@ -904,7 +748,6 @@
 
 type MockDatabase struct {
 	matches        []db.TeamMatch
-	stats          []db.Stats
 	notes          []db.NotesData
 	shiftSchedule  []db.Shift
 	driver_ranking []db.DriverRankingData
@@ -916,11 +759,6 @@
 	return nil
 }
 
-func (database *MockDatabase) AddToStats(stats db.Stats) error {
-	database.stats = append(database.stats, stats)
-	return nil
-}
-
 func (database *MockDatabase) AddToStats2023(stats2023 db.Stats2023) error {
 	database.stats2023 = append(database.stats2023, stats2023)
 	return nil
@@ -929,10 +767,6 @@
 	return database.matches, nil
 }
 
-func (database *MockDatabase) ReturnStats() ([]db.Stats, error) {
-	return database.stats, nil
-}
-
 func (database *MockDatabase) ReturnStats2023() ([]db.Stats2023, error) {
 	return database.stats2023, nil
 }
@@ -947,10 +781,6 @@
 	return results, nil
 }
 
-func (database *MockDatabase) QueryStats(int) ([]db.Stats, error) {
-	return []db.Stats{}, nil
-}
-
 func (database *MockDatabase) QueryNotes(requestedTeam int32) ([]string, error) {
 	var results []string
 	for _, data := range database.notes {
diff --git a/scouting/www/rpc/BUILD b/scouting/www/rpc/BUILD
index 427b493..113c747 100644
--- a/scouting/www/rpc/BUILD
+++ b/scouting/www/rpc/BUILD
@@ -11,14 +11,14 @@
     generate_public_api = False,
     deps = [
         "//scouting/webserver/requests/messages:error_response_ts_fbs",
+        "//scouting/webserver/requests/messages:request_2023_data_scouting_response_ts_fbs",
+        "//scouting/webserver/requests/messages:request_2023_data_scouting_ts_fbs",
         "//scouting/webserver/requests/messages:request_all_driver_rankings_response_ts_fbs",
         "//scouting/webserver/requests/messages:request_all_driver_rankings_ts_fbs",
         "//scouting/webserver/requests/messages:request_all_matches_response_ts_fbs",
         "//scouting/webserver/requests/messages:request_all_matches_ts_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_response_ts_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_ts_fbs",
-        "//scouting/webserver/requests/messages:request_data_scouting_response_ts_fbs",
-        "//scouting/webserver/requests/messages:request_data_scouting_ts_fbs",
         "@com_github_google_flatbuffers//ts:flatbuffers_ts",
     ],
 )
diff --git a/scouting/www/rpc/view_data_requestor.ts b/scouting/www/rpc/view_data_requestor.ts
index d41bf43..24d10b6 100644
--- a/scouting/www/rpc/view_data_requestor.ts
+++ b/scouting/www/rpc/view_data_requestor.ts
@@ -11,11 +11,11 @@
   Ranking,
   RequestAllDriverRankingsResponse,
 } from '../../webserver/requests/messages/request_all_driver_rankings_response_generated';
-import {RequestDataScouting} from '../../webserver/requests/messages/request_data_scouting_generated';
+import {Request2023DataScouting} from '../../webserver/requests/messages/request_2023_data_scouting_generated';
 import {
-  Stats,
-  RequestDataScoutingResponse,
-} from '../../webserver/requests/messages/request_data_scouting_response_generated';
+  Stats2023,
+  Request2023DataScoutingResponse,
+} from '../../webserver/requests/messages/request_2023_data_scouting_response_generated';
 
 @Injectable({providedIn: 'root'})
 export class ViewDataRequestor {
@@ -77,15 +77,15 @@
     return driverRankingList;
   }
   // Returns all data scouting entries from the database.
-  async fetchStatsList(): Promise<Stats[]> {
+  async fetchStats2023List(): Promise<Stats2023[]> {
     let fbBuffer = await this.fetchFromServer(
-      RequestDataScouting.startRequestDataScouting,
-      RequestDataScouting.endRequestDataScouting,
-      '/requests/request/data_scouting'
+      Request2023DataScouting.startRequest2023DataScouting,
+      Request2023DataScouting.endRequest2023DataScouting,
+      '/requests/request/2023_data_scouting'
     );
 
     const parsedResponse =
-      RequestDataScoutingResponse.getRootAsRequestDataScoutingResponse(
+      Request2023DataScoutingResponse.getRootAsRequest2023DataScoutingResponse(
         fbBuffer
       );
 
diff --git a/scouting/www/view/BUILD b/scouting/www/view/BUILD
index 25aa9fa..d787e8f 100644
--- a/scouting/www/view/BUILD
+++ b/scouting/www/view/BUILD
@@ -11,12 +11,12 @@
     deps = [
         ":node_modules/@angular/forms",
         "//scouting/webserver/requests/messages:error_response_ts_fbs",
+        "//scouting/webserver/requests/messages:request_2023_data_scouting_response_ts_fbs",
+        "//scouting/webserver/requests/messages:request_2023_data_scouting_ts_fbs",
         "//scouting/webserver/requests/messages:request_all_driver_rankings_response_ts_fbs",
         "//scouting/webserver/requests/messages:request_all_driver_rankings_ts_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_response_ts_fbs",
         "//scouting/webserver/requests/messages:request_all_notes_ts_fbs",
-        "//scouting/webserver/requests/messages:request_data_scouting_response_ts_fbs",
-        "//scouting/webserver/requests/messages:request_data_scouting_ts_fbs",
         "//scouting/www/rpc",
         "@com_github_google_flatbuffers//ts:flatbuffers_ts",
     ],
diff --git a/scouting/www/view/view.component.ts b/scouting/www/view/view.component.ts
index f4a55a1..f5b4d6a 100644
--- a/scouting/www/view/view.component.ts
+++ b/scouting/www/view/view.component.ts
@@ -4,9 +4,9 @@
   RequestAllDriverRankingsResponse,
 } from '../../webserver/requests/messages/request_all_driver_rankings_response_generated';
 import {
-  Stats,
-  RequestDataScoutingResponse,
-} from '../../webserver/requests/messages/request_data_scouting_response_generated';
+  Stats2023,
+  Request2023DataScoutingResponse,
+} from '../../webserver/requests/messages/request_2023_data_scouting_response_generated';
 import {
   Note,
   RequestAllNotesResponse,
@@ -14,7 +14,7 @@
 
 import {ViewDataRequestor} from '../rpc';
 
-type Source = 'Notes' | 'Stats' | 'DriverRanking';
+type Source = 'Notes' | 'Stats2023' | 'DriverRanking';
 
 //TODO(Filip): Deduplicate
 const COMP_LEVEL_LABELS = {
@@ -52,7 +52,7 @@
   // Stores the corresponding data.
   noteList: Note[] = [];
   driverRankingList: Ranking[] = [];
-  statList: Stats[] = [];
+  statList: Stats2023[] = [];
 
   // Fetch notes on initialization.
   ngOnInit() {
@@ -66,11 +66,11 @@
     if (!this.ascendingSort) {
       this.driverRankingList.sort((a, b) => b.matchNumber() - a.matchNumber());
       this.noteList.sort((a, b) => b.team() - a.team());
-      this.statList.sort((a, b) => b.match() - a.match());
+      this.statList.sort((a, b) => b.matchNumber() - a.matchNumber());
     } else {
       this.driverRankingList.sort((a, b) => a.matchNumber() - b.matchNumber());
       this.noteList.sort((a, b) => a.team() - b.team());
-      this.statList.sort((a, b) => a.match() - b.match());
+      this.statList.sort((a, b) => a.matchNumber() - b.matchNumber());
     }
   }
 
@@ -93,8 +93,8 @@
         this.fetchNotes();
       }
 
-      case 'Stats': {
-        this.fetchStats();
+      case 'Stats2023': {
+        this.fetchStats2023();
       }
 
       case 'DriverRanking': {
@@ -133,12 +133,12 @@
   }
 
   // Fetch all data scouting (stats) data and store in statList.
-  async fetchStats() {
+  async fetchStats2023() {
     this.progressMessage = 'Fetching stats list. Please be patient.';
     this.errorMessage = '';
 
     try {
-      this.statList = await this.viewDataRequestor.fetchStatsList();
+      this.statList = await this.viewDataRequestor.fetchStats2023List();
       this.progressMessage = 'Successfully fetched stats list.';
     } catch (e) {
       this.errorMessage = e;
diff --git a/scouting/www/view/view.ng.html b/scouting/www/view/view.ng.html
index c361638..667765f 100644
--- a/scouting/www/view/view.ng.html
+++ b/scouting/www/view/view.ng.html
@@ -16,7 +16,7 @@
       </a>
     </li>
     <li>
-      <a class="dropdown-item" href="#" (click)="switchDataSource('Stats')">
+      <a class="dropdown-item" href="#" (click)="switchDataSource('Stats2023')">
         Stats
       </a>
     </li>
@@ -73,7 +73,7 @@
     </table>
   </div>
   <!-- Stats Data Display. -->
-  <div *ngSwitchCase="'Stats'">
+  <div *ngSwitchCase="'Stats2023'">
     <table class="table">
       <thead>
         <tr>
@@ -93,11 +93,11 @@
         </tr>
       </thead>
       <tbody>
-        <tr *ngFor="let stat of statList; index as i;">
-          <th scope="row">{{stat.match()}}</th>
-          <td>{{stat.team()}}</td>
-          <td>{{stat.setNumber()}}</td>
-          <td>{{COMP_LEVEL_LABELS[stat.compLevel()]}}</td>
+        <tr *ngFor="let stat2023 of statList; index as i;">
+          <th scope="row">{{stat2023.match()}}</th>
+          <td>{{stat2023.team()}}</td>
+          <td>{{stat2023.setNumber()}}</td>
+          <td>{{COMP_LEVEL_LABELS[stat2023.compLevel()]}}</td>
           <!-- Delete Icon. -->
           <td>
             <button class="btn btn-danger" (click)="deleteData()">