Add Blazor WebApp and rework data handling to utilize Entity Framework

This commit is contained in:
2025-09-11 11:49:48 -04:00
parent 5220e61c79
commit 3daa3b81b3
111 changed files with 6039 additions and 946 deletions
+49 -39
View File
@@ -14,23 +14,31 @@ namespace Web.Controllers
{
private const string ContentDirectory = @"C:\Users\james\source\TSA Chapter Organizer\Tests\Parsers\TestInput\";
private CompetitiveEvent[] GetCompetitiveEvents()
private EventDefinition[] GetEvents()
{
var fileInfo = FileUtility.GetContentFile(ContentDirectory, "2024-25 RMS TSA student & event - Event Definitions.csv");
var fileInfo = FileUtility.GetContentFile(ContentDirectory, "2024-25 RMS TSA student & eventDefinition - EventDefinition Definitions.csv");
var eventRankingsParser = new EventDefinitionParser(fileInfo);
return eventRankingsParser.Parse();
}
private Student[] GetStudents(IList<CompetitiveEvent> events)
private Student[] GetStudents(IList<EventDefinition> events)
{
var fileInfo = FileUtility.GetContentFile(ContentDirectory, "2024-25 RMS TSA student & event - Nationals Student Event Rankings.csv");
var fileInfo = FileUtility.GetContentFile(ContentDirectory, "2024-25 RMS TSA student & eventDefinition - Nationals Student EventDefinition Rankings.csv");
var eventRankingsParser = new StudentParser(fileInfo);
return eventRankingsParser.Parse(events);
}
public Team[] GetTeams(IList<CompetitiveEvent> competitiveEvents, IList<Student> students)
public static StudentEventRanking[] GetStudentEventRankings(Student[] students, EventDefinition[] events)
{
var fileInfo = FileUtility.GetContentFile(ContentDirectory, "2024-25 RMS TSA - Student Event Rankings.csv");
var rankingParser = new StudentEventRankingParser(fileInfo);
return rankingParser.Parse(students, events);
}
public Team[] GetTeams(IList<EventDefinition> competitiveEvents, IList<Student> students)
{
var studentEventRankingsCsv = "2024-25 RMS TSA student & event - Nationals Teams.csv";
var studentEventRankingsCsv = "2024-25 RMS TSA student & eventDefinition - Nationals Teams.csv";
var fileInfo = FileUtility.GetContentFile(ContentDirectory, studentEventRankingsCsv);
var eventRankingsParser = new TeamParser(fileInfo);
@@ -43,9 +51,9 @@ namespace Web.Controllers
return teams;
}
public AssignmentAssumption[] GetAssignmentAssumptions(IList<CompetitiveEvent> competitiveEvents, IList<Student> students)
public AssignmentAssumption[] GetAssignmentAssumptions(IList<EventDefinition> competitiveEvents, IList<Student> students)
{
var assumptionsCsv = "2024-25 RMS TSA student & event - assumptions.csv";
var assumptionsCsv = "2024-25 RMS TSA student & eventDefinition - assumptions.csv";
var fileInfo = FileUtility.GetContentFile(ContentDirectory, assumptionsCsv);
var assumptionParser = new AssignmentAssumptionParser(fileInfo);
@@ -54,17 +62,17 @@ namespace Web.Controllers
return assumptions;
}
public IDictionary<CompetitiveEvent, List<EventOccurrence>> GetStateEventOccurrences(IList<CompetitiveEvent> competitiveEvents)
public IDictionary<EventDefinition, List<EventOccurrence>> GetStateEventOccurrences(IList<EventDefinition> competitiveEvents)
{
var eventTimesFilename = "2025 TN TSA State Competition Event Times.txt";
var eventTimesFilename = "2025 TN TSA State Competition EventDefinition Times.txt";
var fileInfo = FileUtility.GetContentFile(ContentDirectory, eventTimesFilename);
var parser = new EventOccurrenceParser(fileInfo, competitiveEvents);
return parser.Parse();
}
public IDictionary<CompetitiveEvent, List<EventOccurrence>> GetNationalEventOccurrences(IList<CompetitiveEvent> competitiveEvents)
public IDictionary<EventDefinition, List<EventOccurrence>> GetNationalEventOccurrences(IList<EventDefinition> competitiveEvents)
{
var eventTimesFilename = "2025 TSA Nationals Competition Event Times.txt";
var eventTimesFilename = "2025 TSA Nationals Competition EventDefinition Times.txt";
var fileInfo = FileUtility.GetContentFile(ContentDirectory, eventTimesFilename);
var parser = new EventOccurrenceParser(fileInfo, competitiveEvents);
var nationalEventOccurrences = parser.Parse();
@@ -104,13 +112,13 @@ namespace Web.Controllers
public IActionResult Events()
{
var competitiveEvents = GetCompetitiveEvents().Where(e => e.Name != "Chapter Team").ToArray();
var competitiveEvents = GetEvents().Where(e => e.Name != "Chapter Team").ToArray();
return View(competitiveEvents);
}
public IActionResult StudentEventHandout()
{
var competitiveEvents = GetCompetitiveEvents();
var competitiveEvents = GetEvents();
var students = GetStudents(competitiveEvents);
var teams = GetTeams(competitiveEvents, students);
@@ -119,10 +127,12 @@ namespace Web.Controllers
public IActionResult StudentEvents()
{
var competitiveEvents = GetCompetitiveEvents();
var students = GetStudents(competitiveEvents);
var events = GetEvents();
var students = GetStudents(events);
var rankings = GetStudentEventRankings(students, events);
var eventStudentPicksArray = DataProcessing.GetEventStudentPicks(competitiveEvents, students);
var eventStudentPicksArray = StudentEventRanking.GetEventStudentRankings(rankings);
var assignmentParameters = new AssignmentParameters
{
EffortUpperBound = 9,
@@ -131,9 +141,9 @@ namespace Web.Controllers
TeamSizeLimit = 4
};
var eventAssignment = new EventAssigner(competitiveEvents, students, assignmentParameters);
var eventAssignment = new EventAssigner(events, students, assignmentParameters);
var assignmentAssumptions = GetAssignmentAssumptions(competitiveEvents, students);
var assignmentAssumptions = GetAssignmentAssumptions(events, students);
foreach (var assumption in assignmentAssumptions)
{
@@ -149,39 +159,39 @@ namespace Web.Controllers
}
}
eventAssignment.RemoveEvent(new List<CompetitiveEvent>
eventAssignment.RemoveEvent(new List<EventDefinition>
{
competitiveEvents.First(e => e.Name == "Chapter Team")
events.First(e => e.Name == "Chapter Team")
});
eventAssignment.IncludedEvents(new List<CompetitiveEvent>
eventAssignment.IncludedEvents(new List<EventDefinition>
{
//competitiveEvents.First(e => e.Name == "System Control Technology")
});
var eventAssignmentsList = eventAssignment.Solve();
return View(Tuple.Create(competitiveEvents, students, eventStudentPicksArray, eventAssignmentsList, assignmentParameters));
return View(Tuple.Create(events, students, eventStudentPicksArray, eventAssignmentsList, assignmentParameters));
}
public IActionResult Teams()
{
var competitiveEvents = GetCompetitiveEvents();
var competitiveEvents = GetEvents();
var students = GetStudents(competitiveEvents);
var teams = GetTeams(competitiveEvents, students);
//teams = teams.Where(t => t.Event.RegionalEvent).ToArray();
//teams = teams.Where(t => t.EventDefinition.RegionalEvent).ToArray();
return View(Tuple.Create(teams));
}
public IActionResult Regionals()
{
var competitiveEvents = GetCompetitiveEvents();
var competitiveEvents = GetEvents();
var students = GetStudents(competitiveEvents);
var teams = GetTeams(competitiveEvents, students);
teams = teams.Where(t => t.Event.RegionalEvent).ToArray();
teams = teams.Where(t => t.EventDefinition.RegionalEvent).ToArray();
var enumerable = students.Where(s => !teams.SelectMany(ts => ts.Students).Contains(s)).ToArray();
return View(Tuple.Create(teams, enumerable));
@@ -189,7 +199,7 @@ namespace Web.Controllers
public IActionResult State()
{
var competitiveEvents = GetCompetitiveEvents();
var competitiveEvents = GetEvents();
var students = GetStudents(competitiveEvents);
var teams = GetTeams(competitiveEvents, students);
var eventOccurrences = GetStateEventOccurrences(competitiveEvents);
@@ -205,7 +215,7 @@ namespace Web.Controllers
}
public IActionResult Nationals()
{
var competitiveEvents = GetCompetitiveEvents();
var competitiveEvents = GetEvents();
var students = GetStudents(competitiveEvents);
var teams = GetTeams(competitiveEvents, students);
var eventOccurrences = GetNationalEventOccurrences(competitiveEvents);
@@ -222,7 +232,7 @@ namespace Web.Controllers
public IActionResult TeamGrid()
{
var competitiveEvents = GetCompetitiveEvents();
var competitiveEvents = GetEvents();
var students = GetStudents(competitiveEvents);
var teams = GetTeams(competitiveEvents, students);
@@ -231,7 +241,7 @@ namespace Web.Controllers
public IActionResult Students()
{
var competitiveEvents = GetCompetitiveEvents();
var competitiveEvents = GetEvents();
var students = GetStudents(competitiveEvents);
GetTeams(competitiveEvents, students);
@@ -276,7 +286,7 @@ namespace Web.Controllers
reverse: true,
slotPush:0);
var events = GetCompetitiveEvents();
var events = GetEvents();
var students = GetStudents(events);
var allTeams = GetTeams(events, students);
@@ -284,23 +294,23 @@ namespace Web.Controllers
var omittedEvents = allTeams.Where(t => scheduleOptions.OmittedEvents?.Any(s => t.Name.Contains(s)) == true).ToArray();
allTeams = allTeams.Where(t => !omittedEvents.Contains(t)).ToArray();
bool RegionalPredicate(Team t) => t.Event.RegionalEvent;
bool TeamPredicate(Team t) => t.Event.Format is EventFormat.Team;
bool RegionalPredicate(Team t) => t.EventDefinition.RegionalEvent;
bool TeamPredicate(Team t) => t.EventDefinition.EventFormat is EventFormat.Team;
bool RegionalTeamPredicate(Team t) => RegionalPredicate(t) && TeamPredicate(t);
bool HighEffort(Team t) => t.Event.LevelOfEffort == 3;
bool LowEffort(Team t) => t.Event.LevelOfEffort == 1;
bool HighEffort(Team t) => t.EventDefinition.LevelOfEffort == 3;
bool LowEffort(Team t) => t.EventDefinition.LevelOfEffort == 1;
bool RegionalTeamSomeEffortPredicate(Team t) => RegionalTeamPredicate(t) && !LowEffort(t);
bool IndividualPredicate(Team t) => t.Event.Format is EventFormat.Individual;
bool IndividualPredicate(Team t) => t.EventDefinition.EventFormat is EventFormat.Individual;
bool negativePredicate(Team t) => false;
var mustIncludeTeams =
from e in events
from t in allTeams
where t.Event == e &&
where t.EventDefinition == e &&
(scheduleOptions.MustIncludeEvents?.Any(s => s == "RegionalTeam") == true && RegionalTeamSomeEffortPredicate(t)
|| scheduleOptions.MustIncludeEvents?.Any( t.Event.Name.Contains) == true
|| scheduleOptions.MustIncludeEvents?.Any( t.EventDefinition.Name.Contains) == true
|| HighEffort(t))
select t;