first commit
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
**/.classpath
|
||||
**/.dockerignore
|
||||
**/.env
|
||||
**/.git
|
||||
**/.gitignore
|
||||
**/.project
|
||||
**/.settings
|
||||
**/.toolstarget
|
||||
**/.vs
|
||||
**/.vscode
|
||||
**/*.*proj.user
|
||||
**/*.dbmdl
|
||||
**/*.jfm
|
||||
**/azds.yaml
|
||||
**/bin
|
||||
**/charts
|
||||
**/docker-compose*
|
||||
**/Dockerfile*
|
||||
**/node_modules
|
||||
**/npm-debug.log
|
||||
**/obj
|
||||
**/secrets.dev.yaml
|
||||
**/values.dev.yaml
|
||||
LICENSE
|
||||
README.md
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
#Ignore thumbnails created by Windows
|
||||
Thumbs.db
|
||||
#Ignore files built by Visual Studio
|
||||
*.user
|
||||
*.aps
|
||||
*.pch
|
||||
*.vspscc
|
||||
*_i.c
|
||||
*_p.c
|
||||
*.ncb
|
||||
*.suo
|
||||
*.bak
|
||||
*.cache
|
||||
*.ilk
|
||||
*.log
|
||||
[Bb]in
|
||||
[Dd]ebug*/
|
||||
*.sbr
|
||||
obj/
|
||||
[Rr]elease*/
|
||||
_ReSharper*/
|
||||
/.vs/*
|
||||
@@ -0,0 +1,20 @@
|
||||
using Core.Entities;
|
||||
|
||||
namespace Core.Calculation;
|
||||
|
||||
public class DataProcessing
|
||||
{
|
||||
public static EventStudentPicks[] GetEventStudentPicks(IList<CompetitiveEvent> events, IList<Student> students)
|
||||
{
|
||||
return
|
||||
students.SelectMany(
|
||||
student => student.RankedEventPicks.Select((e, i) => (e, student, i + 1)))
|
||||
.OrderBy(tuple => tuple.Item3)
|
||||
.ThenByDescending(tuple => tuple.student.Grade + tuple.student.TsaYear)
|
||||
.GroupBy(tuple => tuple.e)
|
||||
.OrderBy(tuples => tuples.Key.Name)
|
||||
.Select(tuples =>
|
||||
new EventStudentPicks(tuples.Key, tuples.Select(tuple => Tuple.Create(tuple.student, tuple.Item3)).ToList())
|
||||
).ToArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,315 @@
|
||||
using System.Diagnostics;
|
||||
using Core.Entities;
|
||||
using Google.OrTools.Sat;
|
||||
using IntVar = Google.OrTools.Sat.IntVar;
|
||||
|
||||
namespace Core.Calculation
|
||||
{
|
||||
public class EventAssigner
|
||||
{
|
||||
private readonly IList<CompetitiveEvent> _events;
|
||||
private readonly IList<Student> _students;
|
||||
private readonly AssignmentParameters _parameters;
|
||||
private readonly int[] _allEvents;
|
||||
private readonly int[] _allStudents;
|
||||
// how many students have picked each event?
|
||||
private readonly int[] _eventPickCounts;
|
||||
private IList<EventAssignment> _preAssigned = new List<EventAssignment>();
|
||||
private IList<EventAssignment> _prohibited = new List<EventAssignment>();
|
||||
private IList<CompetitiveEvent> _droppedEvents;
|
||||
private IList<CompetitiveEvent> _includedEvents;
|
||||
|
||||
public EventAssigner(IList<CompetitiveEvent> events, IList<Student> students, AssignmentParameters parameters)
|
||||
{
|
||||
_events = events;
|
||||
_students = students;
|
||||
_parameters = parameters;
|
||||
_allEvents = Enumerable.Range(0, _events.Count).ToArray();
|
||||
_allStudents = Enumerable.Range(0, _students.Count).ToArray();
|
||||
_eventPickCounts = new int[_allEvents.Length];
|
||||
_preAssigned = new List<EventAssignment>();
|
||||
_droppedEvents = new List<CompetitiveEvent>();
|
||||
for (var i = 0; i < _events.Count; i++)
|
||||
{
|
||||
var e = _events[i];
|
||||
_eventPickCounts[i] = _students.Count(s => s.RankedEventPicks.Contains(e));
|
||||
}
|
||||
}
|
||||
|
||||
public void AssignToEvent(EventAssignment preAssigned)
|
||||
{
|
||||
_preAssigned.Add(preAssigned);
|
||||
}
|
||||
|
||||
|
||||
public void ExcludeFromEvent(EventAssignment prohibited)
|
||||
{
|
||||
_prohibited.Add(prohibited);
|
||||
}
|
||||
|
||||
public void RemoveEvent(IList<CompetitiveEvent> events)
|
||||
{
|
||||
_droppedEvents = events;
|
||||
}
|
||||
public void IncludedEvents(IList<CompetitiveEvent> events)
|
||||
{
|
||||
_includedEvents = events;
|
||||
}
|
||||
|
||||
public class SolutionPrinter : CpSolverSolutionCallback
|
||||
{
|
||||
private readonly IList<CompetitiveEvent> _events;
|
||||
private readonly IList<Student> _students;
|
||||
private readonly BoolVar[,] _eventAssignment;
|
||||
|
||||
public SolutionPrinter(IList<CompetitiveEvent> events, IList<Student> students, BoolVar[,] eventAssignment)
|
||||
{
|
||||
_events = events;
|
||||
_students = students;
|
||||
_eventAssignment = eventAssignment;
|
||||
}
|
||||
public override void OnSolutionCallback()
|
||||
{
|
||||
Console.WriteLine($"Solution ");
|
||||
foreach (var evt in Enumerable.Range(0,_events.Count))
|
||||
{
|
||||
foreach (var student in Enumerable.Range(0, _students.Count))
|
||||
{
|
||||
if (Value(_eventAssignment[evt, student]) == 1L)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Team[] Solve()
|
||||
{
|
||||
|
||||
// Model.
|
||||
var model = new CpModel();
|
||||
|
||||
// Variables.
|
||||
var x = new BoolVar[_allEvents.Length, _allStudents.Length];
|
||||
foreach (var e in _allEvents)
|
||||
foreach (var s in _allStudents)
|
||||
x[e, s] = model.NewBoolVar($"eventAssignments[{e},{s}]");
|
||||
|
||||
foreach (var preAssignment in _preAssigned)
|
||||
{
|
||||
var e = _events.IndexOf(preAssignment.Event);
|
||||
var s = _students.IndexOf(preAssignment.Student);
|
||||
model.AddAssumption(x[e, s]);
|
||||
}
|
||||
|
||||
foreach (var prohibit in _prohibited)
|
||||
{
|
||||
var e = _events.IndexOf(prohibit.Event);
|
||||
var s = _students.IndexOf(prohibit.Student);
|
||||
|
||||
var prohibitVar = new List<IntVar> { x[e, s] };
|
||||
|
||||
model.AddLinearConstraint(LinearExpr.Sum(prohibitVar), 0, 0);
|
||||
prohibitVar.Clear();
|
||||
}
|
||||
|
||||
// Limit the capacity of each event
|
||||
foreach (var e in _allEvents)
|
||||
{
|
||||
var evt = _events[e];
|
||||
var eventPickCounts = _eventPickCounts[e];
|
||||
|
||||
var evtMinTeamSize = evt.MinTeamSize;
|
||||
var evtMaxTeamSize = evt.MaxTeamSize;
|
||||
|
||||
var teamDivs = eventPickCounts / (evtMinTeamSize * 1.0);
|
||||
if (_includedEvents.Contains(evt))
|
||||
teamDivs = 1;
|
||||
|
||||
//var teamsCount = (int)Math.Ceiling(teamDivs);
|
||||
var teamCount = (int)Math.Round(teamDivs);
|
||||
if (teamCount > evt.MaxTeamCountState)
|
||||
teamCount = evt.MaxTeamCountState;
|
||||
|
||||
// limit to one team for group events
|
||||
if (_parameters.LimitTeamsToOne && evt.Format is EventFormat.Team && teamCount > 1) teamCount = 1;
|
||||
|
||||
if (evt.Name == "Tech Bowl")
|
||||
teamCount = 1;
|
||||
|
||||
var eventCapacity = new List<IntVar>();
|
||||
foreach (var s in _allStudents)
|
||||
{
|
||||
eventCapacity.Add(x[e, s]);
|
||||
}
|
||||
|
||||
if (_droppedEvents != null && _droppedEvents.Contains(evt))
|
||||
teamCount = 0;
|
||||
|
||||
var lb = evtMinTeamSize * teamCount;
|
||||
var ub = Math.Min(evtMaxTeamSize * teamCount, _parameters.TeamSizeLimit);
|
||||
model.AddLinearConstraint(LinearExpr.Sum(eventCapacity), lb, ub);
|
||||
Debug.WriteLine($"{evt.Name,30}\t{evt.Format,-10}\t{lb} - {ub}");
|
||||
|
||||
model.Minimize(LinearExpr.Sum(eventCapacity));
|
||||
eventCapacity.Clear();
|
||||
}
|
||||
|
||||
// Limit the number of events a student is assigned
|
||||
foreach (var s in _allStudents)
|
||||
{
|
||||
var student = _students[s];
|
||||
|
||||
var studentCapacity = new List<IntVar>();
|
||||
foreach (var e in _allEvents)
|
||||
{
|
||||
studentCapacity.Add(x[e, s]);
|
||||
}
|
||||
|
||||
model.AddLinearConstraint(LinearExpr.Sum(studentCapacity), _parameters.AssignmentLowerBound, _parameters.AssignmentUpperBound);
|
||||
studentCapacity.Clear();
|
||||
}
|
||||
|
||||
var eventEffortCoefficients = GetEventEffortCoefficients(_events);
|
||||
foreach (var s in _allStudents)
|
||||
{
|
||||
var effortVar = new BoolVar[_allEvents.Length];
|
||||
|
||||
foreach (var e in _allEvents)
|
||||
{
|
||||
effortVar[e] = x[e, s];
|
||||
}
|
||||
var student = _students[s];
|
||||
var experienceOffset = 0;
|
||||
switch (student.TsaYear)
|
||||
{
|
||||
case 1: experienceOffset = 1; break;
|
||||
default: break;
|
||||
}
|
||||
|
||||
var ub = _parameters.EffortUpperBound - experienceOffset;
|
||||
var lb = _parameters.EffortLowerBound;
|
||||
if (ub <= lb)
|
||||
lb = ub - 1;
|
||||
|
||||
model.Add(LinearExpr.WeightedSum(effortVar, eventEffortCoefficients) >= lb);
|
||||
model.Add(LinearExpr.WeightedSum(effortVar, eventEffortCoefficients) <= ub);
|
||||
}
|
||||
|
||||
// each student should be assigned at least one on site activity event
|
||||
foreach (var s in _allStudents)
|
||||
{
|
||||
var onSiteActivity = new List<ILiteral>();
|
||||
foreach (var e in _allEvents)
|
||||
{
|
||||
if (_events[e].OnSiteActivity)
|
||||
onSiteActivity.Add(x[e, s]);
|
||||
}
|
||||
|
||||
if (_parameters.RequireOnSite)
|
||||
model.AddAtLeastOne(onSiteActivity);
|
||||
onSiteActivity.Clear();
|
||||
}
|
||||
|
||||
// students should have at maximum one individual event
|
||||
foreach (var s in _allStudents)
|
||||
{
|
||||
var individualEvent = new List<ILiteral>();
|
||||
foreach (var e in _allEvents)
|
||||
{
|
||||
if (_events[e].Format == EventFormat.Individual)
|
||||
individualEvent.Add(x[e, s]);
|
||||
}
|
||||
|
||||
model.AddAtMostOne(individualEvent);
|
||||
individualEvent.Clear();
|
||||
}
|
||||
|
||||
// students should have at maximum regional events
|
||||
foreach (var s in _allStudents)
|
||||
{
|
||||
var regionalEvent = new List<ILiteral>();
|
||||
foreach (var e in _allEvents)
|
||||
{
|
||||
if (_events[e].RegionalEvent)
|
||||
regionalEvent.Add(x[e, s]);
|
||||
}
|
||||
|
||||
if (_parameters.RequireRegional)
|
||||
model.AddLinearConstraint(LinearExpr.Sum(regionalEvent), 1, 2);
|
||||
regionalEvent.Clear();
|
||||
}
|
||||
|
||||
var maximizePicks = LinearExpr.NewBuilder();
|
||||
// optimize student selections
|
||||
foreach (var s in _allStudents)
|
||||
{
|
||||
var eventPickCoefficients = GetEventPickCoefficients(_students[s].RankedEventPicks, _events);
|
||||
|
||||
foreach (var e in _allEvents)
|
||||
{
|
||||
maximizePicks.AddTerm(x[e, s], eventPickCoefficients[e]);
|
||||
}
|
||||
}
|
||||
model.Maximize(maximizePicks);
|
||||
|
||||
var solver = new CpSolver();
|
||||
var cpSolverStatus = solver.Solve(model);
|
||||
|
||||
// print solver status
|
||||
Console.WriteLine($"Solver status: {cpSolverStatus}");
|
||||
|
||||
var eventAssignmentsList = new List<Team>();
|
||||
|
||||
if (cpSolverStatus == CpSolverStatus.Optimal || cpSolverStatus == CpSolverStatus.Feasible)
|
||||
{
|
||||
foreach (var e in _allEvents)
|
||||
{
|
||||
var students = new List<Student>();
|
||||
foreach (var s in _allStudents)
|
||||
{
|
||||
if (solver.BooleanValue(x[e, s]))
|
||||
{
|
||||
students.Add(_students[s]);
|
||||
//Console.WriteLine($"{_events[evt].Name} : {_students[s].Name}");
|
||||
}
|
||||
}
|
||||
if (students.Count > 0)
|
||||
eventAssignmentsList.Add(new Team(_events[e].Name, _events[e], students));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Console.WriteLine("No solution found.");
|
||||
}
|
||||
|
||||
return eventAssignmentsList.ToArray();
|
||||
}
|
||||
|
||||
private long[] GetEventPickCoefficients(IList<CompetitiveEvent> rankedEvents, IEnumerable<CompetitiveEvent> events)
|
||||
{
|
||||
var eventPickCount = rankedEvents.Count;
|
||||
|
||||
return
|
||||
events.Select(e =>
|
||||
{
|
||||
var eventPickIndex = rankedEvents.IndexOf(e);
|
||||
return eventPickIndex switch
|
||||
{
|
||||
0 => eventPickCount + 1,
|
||||
1 => eventPickCount + 0,
|
||||
> 1 => eventPickCount ,
|
||||
_ => 0L
|
||||
};
|
||||
}).ToArray();
|
||||
}
|
||||
|
||||
|
||||
private long[] GetEventEffortCoefficients(IEnumerable<CompetitiveEvent> events)
|
||||
{
|
||||
return
|
||||
events.Select(e => e.Name == "Tech Bowl" ? 0 : e.LevelOfEffort.HasValue ? e.LevelOfEffort.Value : 10L).ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
using Core.Entities;
|
||||
using Google.OrTools.Sat;
|
||||
|
||||
namespace Core.Calculation;
|
||||
public class TeamScheduler
|
||||
{
|
||||
private readonly IList<Student> _studentObjs;
|
||||
private readonly IList<Team> _teamObjs;
|
||||
|
||||
private readonly int[] _students;
|
||||
private readonly int[] _teams;
|
||||
private readonly int[] _timeSlots;
|
||||
|
||||
private readonly List<Tuple<int,int>> _scheduleSeparateTeams = new ();
|
||||
|
||||
public TeamScheduler(IList<Team> teams, int numTimeSlots)
|
||||
{
|
||||
_teamObjs = teams;
|
||||
_studentObjs = teams.SelectMany(t => t.Students).Distinct().ToList();
|
||||
|
||||
_students = Enumerable.Range(0, _studentObjs.Count).ToArray();
|
||||
_teams = Enumerable.Range(0, _teamObjs.Count).ToArray();
|
||||
_timeSlots = Enumerable.Range(0, numTimeSlots).ToArray();
|
||||
}
|
||||
|
||||
public void ScheduleSeparate(Team team1, Team team2)
|
||||
{
|
||||
var one = _teamObjs.IndexOf(team1);
|
||||
var two = _teamObjs.IndexOf(team2);
|
||||
_scheduleSeparateTeams.Add(Tuple.Create(one,two));
|
||||
}
|
||||
|
||||
public static TeamScheduler CreateInstance(IList<Team> teams, int numTimeSlots)
|
||||
{
|
||||
return new TeamScheduler(teams, numTimeSlots);
|
||||
}
|
||||
|
||||
public IList<Team>[] Solve()
|
||||
{
|
||||
// Model.
|
||||
var model = new CpModel();
|
||||
|
||||
// Data
|
||||
var m = new int[_students.Length,_teams.Length];
|
||||
foreach (var i in _students)
|
||||
foreach (var t in _teams)
|
||||
m[i, t] = _studentObjs[i].Teams.Contains(_teamObjs[t]) ? 1 : 0;
|
||||
|
||||
// Variables.
|
||||
// x - 1 if meeting of team t takes place at time slot s, else 0
|
||||
var x = new IntVar[_teams.Length, _timeSlots.Length];
|
||||
foreach (var t in _teams)
|
||||
foreach (var s in _timeSlots)
|
||||
x[t, s] = model.NewIntVar(0, 1,$"team time slots[{t},{s}]");
|
||||
|
||||
// y - 1 if individual i has meetings at time slot s, 0 otherwise
|
||||
var y = new IntVar[_students.Length, _timeSlots.Length];
|
||||
foreach (var i in _students)
|
||||
foreach (var s in _timeSlots)
|
||||
y[i, s] = model.NewIntVar(0, 1, $"individual time slots[{i},{s}]");
|
||||
|
||||
// each team meets exactly one time
|
||||
foreach (var t in _teams)
|
||||
model.AddLinearConstraint(LinearExpr.Sum(_timeSlots.Select(s => x[t, s])), 1L, 1L);
|
||||
|
||||
// individual must have at least one team meeting at the given time slot to attend
|
||||
foreach (var i in _students)
|
||||
foreach (var s in _timeSlots)
|
||||
model.Add(
|
||||
new BoundedLinearExpression(
|
||||
y[i, s],
|
||||
LinearExpr.Sum(_teams.Select(t => m[i, t] * x[t, s])),
|
||||
false));
|
||||
|
||||
// maximize number of times individuals meet
|
||||
var indTimeSlotVars = LinearExpr.NewBuilder();
|
||||
foreach (var i in _students)
|
||||
foreach (var s in _timeSlots)
|
||||
indTimeSlotVars.Add(y[i, s]);
|
||||
model.Minimize(indTimeSlotVars);
|
||||
|
||||
foreach (var ts in _scheduleSeparateTeams)
|
||||
foreach (var s in _timeSlots)
|
||||
model.Add(x[ts.Item1, s] != x[ts.Item2, s]);
|
||||
//model.Add(
|
||||
// new BoundedLinearExpression(
|
||||
// x[ts.Item1, s],
|
||||
// x[ts.Item2, s],
|
||||
// false));
|
||||
|
||||
var solver = new CpSolver();
|
||||
|
||||
var cpSolverStatus = solver.Solve(model);
|
||||
Console.WriteLine($"Solver status: {cpSolverStatus}");
|
||||
|
||||
if (cpSolverStatus is CpSolverStatus.Optimal or CpSolverStatus.Feasible)
|
||||
{
|
||||
Console.WriteLine($"Total cost: {solver.ObjectiveValue}\n");
|
||||
|
||||
//foreach (var t in _teams)
|
||||
//foreach (var s in _timeSlots)
|
||||
//{
|
||||
// if (solver.Value(x[t, s]) > 0)
|
||||
// Console.WriteLine($"{_teamObjs[t].Name} : {s}");
|
||||
//}
|
||||
|
||||
//foreach (var i in _students)
|
||||
//foreach (var s in _timeSlots)
|
||||
//{
|
||||
// if (solver.Value(y[i, s]) > 0)
|
||||
// Console.WriteLine($"{_studentObjs[i].Name} : {s}");
|
||||
//}
|
||||
|
||||
var timeSlotTeams = new List<Team>[_timeSlots.Length];
|
||||
foreach (var s in _timeSlots)
|
||||
{
|
||||
var teams = new List<Team>();
|
||||
foreach (var t in _teams)
|
||||
{
|
||||
if (solver.Value(x[t, s]) > 0)
|
||||
{
|
||||
teams.Add(_teamObjs[t]);
|
||||
}
|
||||
}
|
||||
timeSlotTeams[s] = teams;
|
||||
}
|
||||
return timeSlotTeams;
|
||||
}
|
||||
else
|
||||
{
|
||||
//Console.WriteLine("No solution found.");
|
||||
return Array.Empty<IList<Team>>();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,101 @@
|
||||
using Core.Entities;
|
||||
|
||||
namespace Core.Calculation;
|
||||
public class TeamScheduler_DecisionTree
|
||||
{
|
||||
private readonly IList<Student> _students;
|
||||
private readonly IList<Team> _teams;
|
||||
|
||||
private readonly int _timeSlotCount;
|
||||
|
||||
public TeamScheduler_DecisionTree(IList<Team> teams, int timeSlotCount)
|
||||
{
|
||||
_timeSlotCount = timeSlotCount;
|
||||
_teams = teams;
|
||||
_students = teams.SelectMany(t => t.Students).Distinct().ToList();
|
||||
}
|
||||
|
||||
public IList<Team>[] Solve()
|
||||
{
|
||||
var timeSlots = new IList<Team>[_timeSlotCount];
|
||||
for (var i = 0; i < _timeSlotCount; i++)
|
||||
timeSlots[i] = new List<Team>();
|
||||
|
||||
foreach (var team in _teams.OrderByDescending(t => t.Students.Count))
|
||||
{
|
||||
// get overlapping students in each timeslot
|
||||
var overlaps
|
||||
= (from tsi in Enumerable.Range(0, timeSlots.Length)
|
||||
let ts = timeSlots[tsi]
|
||||
let tss = ts.SelectMany(t => t.Students).Distinct()
|
||||
select Tuple.Create(tsi, team.Students.Count(tss.Contains)))
|
||||
.OrderBy(t => t.Item2)
|
||||
.ThenBy(t => timeSlots[t.Item1].Count);
|
||||
|
||||
timeSlots[overlaps.First().Item1].Add(team);
|
||||
}
|
||||
return timeSlots;
|
||||
}
|
||||
|
||||
public IList<Team>[] SolveRecursive()
|
||||
{
|
||||
// initialize time slots
|
||||
var timeSlots = new IList<Team>[_timeSlotCount];
|
||||
for (var i = 0; i < _timeSlotCount; i++)
|
||||
timeSlots[i] = new List<Team>();
|
||||
|
||||
return
|
||||
(from i in Enumerable.Range(1, 5)
|
||||
let solution = Recursive(timeSlots, _teams, i)
|
||||
let overlapCount = Team.GetStudentTeamOverlapCount(solution)
|
||||
orderby overlapCount
|
||||
select solution).First();
|
||||
}
|
||||
|
||||
private static IList<Team>[] CopyTimeSlots(IList<Team>[] timeSlots)
|
||||
{
|
||||
return timeSlots.Select(ts => (IList<Team>)new List<Team>(ts)).ToArray();
|
||||
}
|
||||
|
||||
private static IList<Team>[] Recursive(IList<Team>[] timeSlots, IList<Team> teams, int overlapTriesStudents = 4)
|
||||
{
|
||||
if (!teams.Any())
|
||||
return timeSlots;
|
||||
|
||||
var overlapsTries =
|
||||
(from team in teams.OrderByDescending(t => t.Students.Count).Take(overlapTriesStudents)
|
||||
//from ts in timeSlots
|
||||
from tsi in Enumerable.Range(0, timeSlots.Length)
|
||||
let ts = timeSlots[tsi]
|
||||
let tss = ts.SelectMany(t => t.Students)
|
||||
select Tuple.Create(ts, tsi, team, team.Students.Count(tss.Contains)))
|
||||
.OrderBy(t => t.Item4)
|
||||
.ThenBy(t => t.Item1.Count);
|
||||
|
||||
var minOverlaps =
|
||||
(from o in overlapsTries
|
||||
group o by o.Item4
|
||||
into oo
|
||||
orderby oo.Key
|
||||
select oo).First();
|
||||
|
||||
var first = minOverlaps.First();
|
||||
|
||||
var results = new List<Tuple<IList<Team>[], int>>();
|
||||
|
||||
foreach (var minOverlap in minOverlaps)
|
||||
{
|
||||
var timeSlotsAfterAdd = CopyTimeSlots(timeSlots);
|
||||
timeSlotsAfterAdd[first.Item2].Add(first.Item3);
|
||||
var remainingTeams = teams.Where(t => t != first.Item3).ToList();
|
||||
|
||||
var result = Recursive(timeSlotsAfterAdd, remainingTeams);
|
||||
|
||||
results.Add(Tuple.Create(result, Team.GetStudentTeamOverlapCount(result)));
|
||||
if (minOverlap.Item4 == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
return results.OrderByDescending(r => r.Item2).First().Item1;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
using Core.Entities;
|
||||
using Core.Utility;
|
||||
using Google.OrTools.Sat;
|
||||
namespace Core.Calculation;
|
||||
public class TeamScheduler_Prototype
|
||||
{
|
||||
public void Solve()
|
||||
{
|
||||
// Model.
|
||||
var model = new CpModel();
|
||||
|
||||
// Data
|
||||
int[,] m =
|
||||
{
|
||||
{ 1, 0, 0, 0, 0, 1 }, // 1
|
||||
{ 0, 0, 1, 0, 0, 0 }, // 2
|
||||
{ 0, 0, 1, 0, 1, 0 }, // 3
|
||||
{ 0, 0, 0, 0, 1, 1 }, // 4
|
||||
{ 0, 0, 1, 0, 0, 0 }, // 5
|
||||
{ 1, 0, 1, 0, 0, 0 }, // 6
|
||||
{ 0, 0, 0, 0, 0, 1 }, // 7
|
||||
{ 0, 1, 0, 1, 0, 0 }, // 8
|
||||
{ 0, 0, 0, 0, 0, 0 }, // 9
|
||||
{ 1, 1, 0, 0, 1, 0 }, // 10
|
||||
{ 1, 1, 0, 0, 1, 1 }, // 11
|
||||
{ 0, 0, 0, 0, 1, 1 }, // 12
|
||||
{ 1, 0, 0, 0, 0, 1 }, // 13
|
||||
{ 0, 1, 1, 1, 0, 0 }, // 14
|
||||
{ 1, 1, 0, 0, 0, 0 }, // 15
|
||||
{ 0, 0, 0, 0, 0, 0 }, // 16
|
||||
{ 1, 0, 1, 0, 1, 1 }, // 17
|
||||
{ 0, 0, 0, 1, 0, 0 }, // 18
|
||||
{ 1, 0, 0, 1, 0, 0 }, // 19
|
||||
{ 0, 0, 1, 0, 1, 0 }, // 20
|
||||
};
|
||||
|
||||
// Variables.
|
||||
int[] individuals = Enumerable.Range(0, 20).ToArray();
|
||||
int[] teams = Enumerable.Range(0, 6).ToArray();
|
||||
int[] timeSlots = Enumerable.Range(0, 3).ToArray();
|
||||
|
||||
// x - 1 if meeting of team t takes place at time slot s, else 0
|
||||
var x = new IntVar[teams.Length, timeSlots.Length];
|
||||
foreach (var t in teams)
|
||||
foreach (var s in timeSlots)
|
||||
x[t, s] = model.NewIntVar(0, 1,$"team time slots[{t},{s}]");
|
||||
|
||||
// y - 1 if individual i has meetings at time slot s, 0 otherwise
|
||||
var y = new IntVar[individuals.Length, timeSlots.Length];
|
||||
foreach (var i in individuals)
|
||||
foreach (var s in timeSlots)
|
||||
y[i, s] = model.NewIntVar(0, 1, $"individual time slots[{i},{s}]");
|
||||
|
||||
// each team meets exactly one time
|
||||
foreach (var t in teams)
|
||||
model.AddLinearConstraint(LinearExpr.Sum(timeSlots.Select(s => x[t, s])), 1L, 1L);
|
||||
|
||||
//individual must have at least one team meeting at the given time slot to attend
|
||||
foreach (var i in individuals)
|
||||
foreach (var s in timeSlots)
|
||||
model.Add(
|
||||
new BoundedLinearExpression(
|
||||
y[i, s],
|
||||
LinearExpr.Sum(teams.Select(t => m[i, t] * x[t, s])),
|
||||
false));
|
||||
|
||||
// maximize number of times individuals meet
|
||||
var indTimeSlotVars = LinearExpr.NewBuilder();
|
||||
foreach (var i in individuals)
|
||||
foreach (var s in timeSlots)
|
||||
indTimeSlotVars.Add(y[i, s]);
|
||||
model.Minimize(indTimeSlotVars);
|
||||
|
||||
var solver = new CpSolver();
|
||||
var cpSolverStatus = solver.Solve(model);
|
||||
Console.WriteLine($"Solver status: {cpSolverStatus}");
|
||||
|
||||
if (cpSolverStatus is CpSolverStatus.Optimal or CpSolverStatus.Feasible)
|
||||
{
|
||||
Console.WriteLine($"Total cost: {solver.ObjectiveValue}\n");
|
||||
|
||||
Console.WriteLine("Team's Timeslots");
|
||||
TextUtil.ConsoleWriteTable((t, s) => solver.Value(x[t, s]) > 0, "team", teams, "timeslot", timeSlots);
|
||||
|
||||
Console.WriteLine("Individual's Timeslots");
|
||||
TextUtil.ConsoleWriteTable((i, s) => solver.Value(y[i, s]) > 0, "ind", individuals, "timeslot", timeSlots);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("No solution found.");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
using Core.Entities;
|
||||
|
||||
namespace Core.Calculation;
|
||||
|
||||
public enum UnassignedScheduleStrategy
|
||||
{
|
||||
BiggestGroup,
|
||||
IndividualEvents,
|
||||
AnyNotMeetingAlready,
|
||||
LevelOfEffort,
|
||||
Any
|
||||
}
|
||||
|
||||
public class UnassignedStudentScheduler
|
||||
{
|
||||
private readonly IList<Student> _students;
|
||||
private readonly IList<Team> _teams;
|
||||
private readonly IList<Team>[] _timeslots;
|
||||
|
||||
public UnassignedStudentScheduler(IList<Team> teams, IList<Team>[] timeslots)
|
||||
{
|
||||
_teams = teams;
|
||||
_students = teams.SelectMany(t => t.Students).Distinct().ToList();
|
||||
_timeslots = timeslots.Select(ts => ts.Select(t => t.Clone()).ToList()).ToArray();
|
||||
}
|
||||
public static IEnumerable<Student> UnassignedStudents(IList<Student> students, IList<Team> timeSlot)
|
||||
=> students.Where(s => !timeSlot.SelectMany(t => t.Students).Contains(s));
|
||||
|
||||
|
||||
public static IEnumerable<Student>[] UnassignedStudents(IList<Student> students, IList<Team>[] schedule)
|
||||
=> schedule.Select(ts => UnassignedStudents(students, ts)).ToArray();
|
||||
|
||||
|
||||
public IList<Team>[] ScheduleStrategy(UnassignedScheduleStrategy scheduleStrategy)
|
||||
{
|
||||
switch (scheduleStrategy)
|
||||
{
|
||||
case UnassignedScheduleStrategy.BiggestGroup:
|
||||
return ScheduleStrategy(GetAvailableTeams_BiggestGroup);
|
||||
case UnassignedScheduleStrategy.IndividualEvents:
|
||||
return ScheduleStrategy(GetAvailableTeams_Individual);
|
||||
case UnassignedScheduleStrategy.AnyNotMeetingAlready:
|
||||
return ScheduleStrategy(GetAvailableTeams_AnyNotMeetingAlready);
|
||||
case UnassignedScheduleStrategy.Any:
|
||||
return ScheduleStrategy(GetAvailableTeams_Any);
|
||||
case UnassignedScheduleStrategy.LevelOfEffort:
|
||||
return ScheduleStrategy(GetAvailableTeams_LevelOfEffort);
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(scheduleStrategy), scheduleStrategy, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public IList<Team>[] ScheduleStrategy(Func<IEnumerable<Team>, IEnumerable<Student>, IEnumerable<Team>> availableTeamSelector)
|
||||
{
|
||||
// Find stuff for unassigned students in each timeslot
|
||||
var scheduledTeams = _timeslots.SelectMany(list => list).Distinct().ToList();
|
||||
foreach (var slot in _timeslots)
|
||||
{
|
||||
var unassigned = UnassignedStudents(_students, slot).ToList();
|
||||
while (unassigned.Count > 0)
|
||||
{
|
||||
var assignedStudents = slot.SelectMany(t => t.Students).Distinct();
|
||||
|
||||
var availableTeams = availableTeamSelector(scheduledTeams, assignedStudents);
|
||||
|
||||
var teamToAdd = availableTeams.FirstOrDefault();
|
||||
if (teamToAdd == null)
|
||||
break;
|
||||
|
||||
slot.Add(teamToAdd);
|
||||
scheduledTeams.Add(teamToAdd);
|
||||
|
||||
foreach (var student in teamToAdd.Students)
|
||||
unassigned.Remove(student);
|
||||
}
|
||||
}
|
||||
|
||||
return _timeslots;
|
||||
}
|
||||
|
||||
|
||||
// find teams where several unassigned students can work together
|
||||
private IEnumerable<Team> GetAvailableTeams_BiggestGroup(
|
||||
IEnumerable<Team> scheduledTeams, IEnumerable<Student> assignedStudents) =>
|
||||
_teams
|
||||
.Where(t => scheduledTeams.All(st => st.Name != t.Name))
|
||||
.Select(t => t.CloneWithOmittedStudents(assignedStudents))
|
||||
.Where(t => t.Students.Count > 1) //|| t.Event.Format is EventFormat.Individual
|
||||
//.OrderBy(t => scheduledTeams.Count(st => st.Name == t.Name))
|
||||
.OrderByDescending(t => t.Students.Count); // select descending greatest number of students assigned
|
||||
//.ThenBy(t => Random.Shared.Next()); // todo: sort by student historic record of event assignment
|
||||
|
||||
// find individual events unassigned students can work on
|
||||
private IEnumerable<Team> GetAvailableTeams_Individual(
|
||||
IEnumerable<Team> scheduledTeams, IEnumerable<Student> assignedStudents) =>
|
||||
_teams
|
||||
.Where(t => scheduledTeams.All(st => st.Name != t.Name))
|
||||
.Where(t => t.Event.Format == EventFormat.Individual || t.Students.Count == 1)
|
||||
.Select(t => t.CloneWithOmittedStudents(assignedStudents))
|
||||
.Where(t => t.Students.Count > 0);
|
||||
|
||||
// find any unassigned event students can work on
|
||||
private IEnumerable<Team> GetAvailableTeams_AnyNotMeetingAlready(
|
||||
IEnumerable<Team> scheduledTeams, IEnumerable<Student> assignedStudents) =>
|
||||
_teams
|
||||
.Where(t => scheduledTeams.All(st => st.Name != t.Name))
|
||||
.Select(t => t.CloneWithOmittedStudents(assignedStudents))
|
||||
.Where(t => t.Students.Count > 0);
|
||||
|
||||
private IEnumerable<Team> GetAvailableTeams_Any(
|
||||
IEnumerable<Team> scheduledTeams, IEnumerable<Student> assignedStudents) =>
|
||||
_teams
|
||||
.Select(t => t.CloneWithOmittedStudents(assignedStudents))
|
||||
.Where(t => t.Students.Count > 0);
|
||||
|
||||
|
||||
// find teams where several unassigned students can work together
|
||||
private IEnumerable<Team> GetAvailableTeams_LevelOfEffort(
|
||||
IEnumerable<Team> scheduledTeams, IEnumerable<Student> assignedStudents) =>
|
||||
_teams
|
||||
.Where(t => scheduledTeams.All(st => st.Name != t.Name))
|
||||
.Select(t => t.CloneWithOmittedStudents(assignedStudents))
|
||||
.Where(t => t.Students.Count > 1) //|| t.Event.Format is EventFormat.Individual
|
||||
//.OrderBy(t => scheduledTeams.Count(st => st.Name == t.Name))
|
||||
.OrderByDescending(t => t.Event.LevelOfEffort); // select descending greatest number of students assigned
|
||||
|
||||
//add team to another timeslot, if any available
|
||||
public IList<Team>[] AddAdditionalTimeSlot(Team team)
|
||||
{
|
||||
// sort by how many teammembers are already in that timeslot, descending
|
||||
foreach (var timeslot in _timeslots.OrderBy(ts => ts.SelectMany(t => t.Students).Count(team.Students.Contains)))
|
||||
{
|
||||
if (timeslot.Any(t => t.Name == team.Name))
|
||||
continue;
|
||||
timeslot.Add(team);
|
||||
break;
|
||||
}
|
||||
|
||||
return _timeslots;
|
||||
}
|
||||
|
||||
// Keep the current events rolling for the other time slots
|
||||
public IList<Team>[] ExtendEvents()
|
||||
{
|
||||
var scheduledTeams = _timeslots.SelectMany(list => list).Distinct().ToList();
|
||||
|
||||
// get all the students in each time slot
|
||||
var timeslotStudents = _timeslots.Select(ts => ts.SelectMany(t => t.Students).Distinct()).ToArray();
|
||||
|
||||
// clone teams from timeslot for each other timeslot, removing the students
|
||||
|
||||
//var copiedTeams = new Dictionary<int, IList<Team>>();
|
||||
|
||||
for (var i = 0; i < _timeslots.Length; i++)
|
||||
{
|
||||
var sourceTimeslot = _timeslots[i];
|
||||
|
||||
for (var j = 0; j < _timeslots.Length; j++)
|
||||
{
|
||||
if (i == j)
|
||||
continue;
|
||||
var targetTimeslot = _timeslots[j];
|
||||
var targetTimeslotStudents = targetTimeslot.SelectMany(t => t.Students).Distinct();
|
||||
var clonedTeams = sourceTimeslot.Select(t => t.CloneWithOmittedStudents(targetTimeslotStudents));
|
||||
foreach (var clonedTeam in clonedTeams.Where(t => t.Students.Any()))
|
||||
{
|
||||
targetTimeslot.Add(clonedTeam);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return _timeslots;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CsvHelper" Version="30.0.1" />
|
||||
<PackageReference Include="FuzzySharp" Version="2.0.2" />
|
||||
<PackageReference Include="Google.OrTools" Version="9.7.2996" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Core.Entities;
|
||||
|
||||
public class AssignmentAssumption(CompetitiveEvent @event, Student student, Assumption assumption)
|
||||
{
|
||||
public CompetitiveEvent Event { get; } = @event;
|
||||
public Student Student { get; } = student;
|
||||
public Assumption Assumption { get; } = assumption;
|
||||
|
||||
public EventAssignment EventAssignment => new(@event, student);
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
namespace Core.Entities
|
||||
{
|
||||
public class AssignmentParameters(
|
||||
int effortLowerBound = 6,
|
||||
int effortUpperBound = 8,
|
||||
int assignmentLowerBound = 2,
|
||||
int assignmentUpperBound = 4,
|
||||
int teamSizeLimit = 4,
|
||||
bool limitTeamsToOne = true,
|
||||
bool requireRegional = true,
|
||||
bool requireOnSite = true)
|
||||
{
|
||||
public int EffortLowerBound { get; set; } = effortLowerBound;
|
||||
public int EffortUpperBound { get; set; } = effortUpperBound;
|
||||
public int AssignmentLowerBound { get; set; } = assignmentLowerBound;
|
||||
public int AssignmentUpperBound { get; set; } = assignmentUpperBound;
|
||||
public int TeamSizeLimit { get; set; } = teamSizeLimit;
|
||||
public bool LimitTeamsToOne { get; set; } = limitTeamsToOne;
|
||||
public bool RequireRegional { get; set; } = requireRegional;
|
||||
public bool RequireOnSite { get; set; } = requireOnSite;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Core.Entities;
|
||||
|
||||
public enum Assumption
|
||||
{
|
||||
Include,
|
||||
Exclude
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
namespace Core.Entities;
|
||||
|
||||
public class CompetitiveEvent
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string ShortName { get; set; }
|
||||
public EventFormat Format { get; set; }
|
||||
public int MinTeamSize { get; set; }
|
||||
public int MaxTeamSize { get; set; }
|
||||
|
||||
public string TeamSize =>
|
||||
MinTeamSize == MaxTeamSize
|
||||
? MinTeamSize.ToString()
|
||||
: $"{MinTeamSize.ToString()}-{MaxTeamSize.ToString()}";
|
||||
|
||||
public string SemifinalistActivity { get; set; }
|
||||
|
||||
public bool InterviewOrPresentation
|
||||
=> SemifinalistActivity.Contains("Interview") || SemifinalistActivity.Contains("Presentation");
|
||||
|
||||
public bool OnSiteActivity
|
||||
=> SemifinalistActivity.Contains("Challenge")
|
||||
|| SemifinalistActivity.Contains("Race")
|
||||
|| SemifinalistActivity.Contains("Speech")
|
||||
|| SemifinalistActivity.Contains("Test")
|
||||
|| SemifinalistActivity.Contains("Flight")
|
||||
|| SemifinalistActivity.Contains("Debate")
|
||||
|| SemifinalistActivity.Contains("Photography")
|
||||
|| SemifinalistActivity.Contains("Build")
|
||||
|| Name.Contains("Chapter")
|
||||
|| Name.Contains("Essay")
|
||||
|| SemifinalistActivity.Contains("Fly");
|
||||
|
||||
public string RegionalNotes { get; set; }
|
||||
|
||||
public int MaxTeamCountState { get; set; }
|
||||
public bool RegionalEvent { get; set; }
|
||||
|
||||
public bool RegionalPresubmit { get; set; }
|
||||
public bool StatePresubmission { get; set; }
|
||||
public bool StatePretesting { get; set; }
|
||||
public bool StatePreliminaryRound { get; set; }
|
||||
|
||||
public string Documentation { get; set; }
|
||||
|
||||
public string Eligibility { get; set; }
|
||||
public string Theme { get; set; }
|
||||
public string Description { get; set; }
|
||||
public int? LevelOfEffort { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
|
||||
public static readonly CompetitiveEvent GeneralSchedule = new(){Name = "General Schedule"};
|
||||
public static readonly CompetitiveEvent VotingDelegates = new(){Name = "Voting Delegates"};
|
||||
|
||||
|
||||
public string EventAttributes ()
|
||||
{
|
||||
var st = new List<string>();
|
||||
|
||||
if (Format is EventFormat.Individual)
|
||||
st.Add( "Ind.");
|
||||
if (RegionalEvent)
|
||||
st.Add( "Reg.");
|
||||
|
||||
return string.Join(", ", st);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
namespace Core.Entities;
|
||||
|
||||
public class EventAssignment
|
||||
{
|
||||
public CompetitiveEvent Event { get; }
|
||||
public Student Student { get; }
|
||||
|
||||
public EventAssignment(CompetitiveEvent @event, Student student)
|
||||
{
|
||||
Event = @event;
|
||||
Student = student;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Core.Entities;
|
||||
|
||||
public enum EventFormat
|
||||
{
|
||||
Team,
|
||||
Individual
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
|
||||
namespace Core.Entities
|
||||
{
|
||||
public class EventOccurrence
|
||||
{
|
||||
public string Name { get; set; }
|
||||
public string Time { get; set; }
|
||||
public string Date { get; set; }
|
||||
public DateTime StartTime { get; set; }
|
||||
public DateTime? EndTime { get; set; }
|
||||
public string Location { get; set; }
|
||||
|
||||
public bool SignupSubmitPickup =>
|
||||
Name.Contains("Sign-up") ||
|
||||
Name.Contains("Submit") ||
|
||||
Name.Contains("Submission") ||
|
||||
Name.Contains("Pick-up");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
namespace Core.Entities;
|
||||
|
||||
public class EventStudentPicks
|
||||
{
|
||||
public CompetitiveEvent Event { get; }
|
||||
public IList<Tuple<Student,int>> StudentPicks { get; }
|
||||
|
||||
public EventStudentPicks(CompetitiveEvent @event, IList<Tuple<Student, int>> studentPicks)
|
||||
{
|
||||
Event = @event;
|
||||
StudentPicks = studentPicks;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
namespace Core.Entities;
|
||||
|
||||
public class PartialTeam : Team
|
||||
{
|
||||
public IList<Student> OmittedStudents { get; }
|
||||
|
||||
public PartialTeam(string name, CompetitiveEvent @event, IList<Student> students, IList<Student> omittedStudents) : base(name, @event, students)
|
||||
{
|
||||
OmittedStudents = omittedStudents;
|
||||
}
|
||||
|
||||
public override Team CloneWithOmittedStudents(IEnumerable<Student> studentsToOmit)
|
||||
{
|
||||
var remainingStudents = Students.Where(s => !studentsToOmit.Contains(s)).ToList();
|
||||
var omittedStudents = OmittedStudents.Union(Students.Where(studentsToOmit.Contains)).Distinct().ToList();
|
||||
return new PartialTeam(Name, Event, remainingStudents, omittedStudents );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Core.Entities;
|
||||
|
||||
public class Student
|
||||
{
|
||||
public string Name { get; set; }
|
||||
|
||||
public string LastNameFirstName
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Name.Contains(',')) return Name;
|
||||
var match = Regex.Match(Name, @"(.*)\s(.*)");
|
||||
if (match.Success)
|
||||
return $"{match.Groups[2].Value}, {match.Groups[2].Value} ";
|
||||
return Name;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public string FirstNameLastName
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!Name.Contains(',')) return Name;
|
||||
var match = Regex.Match(Name, @"(.*),\s*(.*)");
|
||||
if (match.Success)
|
||||
return $"{match.Groups[2].Value} {match.Groups[1].Value}";
|
||||
return Name;
|
||||
}
|
||||
}
|
||||
|
||||
public string FirstName
|
||||
{
|
||||
get
|
||||
{
|
||||
var match = Regex.Match(LastNameFirstName, @"(.*),\s*(.*)");
|
||||
if (match.Success)
|
||||
return $"{match.Groups[2].Value}";
|
||||
return Name;
|
||||
}
|
||||
}
|
||||
|
||||
public int Grade { get; }
|
||||
public string StateID { get; }
|
||||
public string RegionalID { get; }
|
||||
public string NationalID { get; }
|
||||
public int TsaYear { get; }
|
||||
public string Officer { get; }
|
||||
public IList<CompetitiveEvent> RankedEventPicks { get; }
|
||||
|
||||
public ICollection<Team> Teams { get; set; }
|
||||
|
||||
public Student(string name, int grade, int tsaYear, string officer, IList<CompetitiveEvent> rankedEventPicks,
|
||||
string stateID, string regionalID, string nationalId)
|
||||
{
|
||||
Name = name;
|
||||
Grade = grade;
|
||||
TsaYear = tsaYear;
|
||||
Officer = officer;
|
||||
RankedEventPicks = rankedEventPicks;
|
||||
StateID=stateID;
|
||||
RegionalID = regionalID;
|
||||
NationalID = nationalId;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return FirstName;
|
||||
}
|
||||
|
||||
public bool VotingDelegate => Officer.Contains("Pres");
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
using System.Reflection;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Core.Entities;
|
||||
|
||||
public class Team
|
||||
{
|
||||
public string Name { get; }
|
||||
public CompetitiveEvent Event { get; }
|
||||
public IList<Student> Students { get; }
|
||||
|
||||
public Student? Captain { get; set; }
|
||||
|
||||
public string TeamNumber { get; set; }
|
||||
|
||||
public string RegionalTimeSlot { get; set; }
|
||||
|
||||
public Tuple<DateTime,DateTime?>? RegionalTimeSlotObj
|
||||
{
|
||||
get
|
||||
{
|
||||
|
||||
if (string.IsNullOrEmpty(RegionalTimeSlot))
|
||||
return null;
|
||||
var times = Regex.Matches(RegionalTimeSlot, @"(.*)\s*-\s*(.*)");
|
||||
if (times.Count == 0)
|
||||
return Tuple.Create(P(RegionalTimeSlot), (DateTime?)null);
|
||||
var match = times[0];
|
||||
if (!match.Success)
|
||||
return Tuple.Create(P(RegionalTimeSlot), (DateTime?)null);
|
||||
|
||||
return Tuple.Create(P(match.Groups[1].Value), (DateTime?)P(match.Groups[2].Value));
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private DateTime P(string s)
|
||||
{
|
||||
var dt = DateTime.Parse(s);
|
||||
if (dt.TimeOfDay < TimeSpan.FromHours(7))
|
||||
return dt + TimeSpan.FromHours(12);
|
||||
return dt;
|
||||
}
|
||||
|
||||
public Team(string name, CompetitiveEvent @event, IList<Student> students, Student? captain = null, string teamNumber = null, string regionalTimeSlot = null)
|
||||
{
|
||||
Name = name;
|
||||
Event = @event;
|
||||
Students = students;
|
||||
Captain = captain;
|
||||
TeamNumber = teamNumber;
|
||||
RegionalTimeSlot = regionalTimeSlot;
|
||||
}
|
||||
|
||||
public virtual Team CloneWithOmittedStudents(IEnumerable<Student> studentsToOmit)
|
||||
{
|
||||
var studentsToOmitList = studentsToOmit.ToList();
|
||||
var omittedStudents = Students.Where(studentsToOmitList.Contains).ToList();
|
||||
if (!omittedStudents.Any())
|
||||
return new Team(Name, Event, Students.ToList(), Captain);
|
||||
|
||||
var remainingStudents = Students.Where(s => !studentsToOmitList.Contains(s)).ToList();
|
||||
return new PartialTeam(Name, Event, remainingStudents, omittedStudents);
|
||||
}
|
||||
|
||||
public Team Clone() => CloneWithOmittedStudents(Array.Empty<Student>());
|
||||
|
||||
public static int GetStudentTeamOverlapCount(IList<Team>[] timeSlots)
|
||||
{
|
||||
return timeSlots.Sum(GetStudentTeamOverlapCount);
|
||||
}
|
||||
|
||||
private static int GetStudentTeamOverlapCount(IList<Team> timeSlot)
|
||||
{
|
||||
return GetStudentTeamOverlaps(timeSlot).Count();
|
||||
}
|
||||
|
||||
public static IEnumerable<Tuple<Student, IEnumerable<Team>>> GetStudentTeamOverlaps(IList<Team> timeSlot)
|
||||
{
|
||||
return
|
||||
from s in timeSlot.SelectMany(ts => ts.Students).Distinct()
|
||||
group s by timeSlot.Where(t => t.Students.Contains(s))
|
||||
into gs
|
||||
where gs.Key.Count() > 1
|
||||
select Tuple.Create(gs.First(), gs.Key);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Name;
|
||||
}
|
||||
|
||||
public string ToStringWithIndividualAndRegional()
|
||||
{
|
||||
var ind = Event.Format is EventFormat.Individual ? " (Ind.)" : string.Empty;
|
||||
var regional= Event.RegionalEvent ? " (Reg.)" : string.Empty;
|
||||
//var regional= Event.RegionalEvent ? " (Reg.)" : string.Empty;
|
||||
|
||||
var eventAttributes = Event.EventAttributes();
|
||||
return string.IsNullOrEmpty(eventAttributes) ? Name : Name + " (" + eventAttributes + ")";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Core
|
||||
{
|
||||
public class MainClass
|
||||
{
|
||||
static void Main() { }
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
using Core.Entities;
|
||||
|
||||
namespace Core.Parsers;
|
||||
|
||||
public class AssignmentAssumptionParser : CsvParserBase
|
||||
{
|
||||
public AssignmentAssumptionParser(FileSystemInfo csvFile, bool ignoreBlankLines = true) : base(csvFile, ignoreBlankLines)
|
||||
{
|
||||
}
|
||||
|
||||
public AssignmentAssumption[] Parse(ICollection<CompetitiveEvent> events, ICollection<Student> students)
|
||||
{
|
||||
var assumptions = new List<AssignmentAssumption>();
|
||||
|
||||
CsvReader.Read();
|
||||
CsvReader.ReadHeader();
|
||||
var studentColumns =
|
||||
CsvReader.HeaderRecord.Select(h => h.Trim()).Where(h => !string.IsNullOrEmpty(h)).ToArray();
|
||||
|
||||
var studentArray = studentColumns.Select(c => students.First(s => s.FirstName == c)).ToArray();
|
||||
|
||||
while (CsvReader.Read())
|
||||
{
|
||||
var eventShortName= CsvReader.GetField(0);
|
||||
|
||||
var evt = events.FirstOrDefault(e => e.ShortName == eventShortName);
|
||||
if (evt == null)
|
||||
throw new Exception($"Could not find event named {eventShortName}");
|
||||
for (int i = 0; i <= studentArray.Length; i++)
|
||||
{
|
||||
var field = CsvReader.GetField(i + 1);
|
||||
switch (field)
|
||||
{
|
||||
case "x":
|
||||
case "X":
|
||||
assumptions.Add(new AssignmentAssumption(evt, studentArray[i], Assumption.Exclude));
|
||||
break;
|
||||
case "i":
|
||||
case "I":
|
||||
assumptions.Add(new AssignmentAssumption(evt, studentArray[i], Assumption.Include));
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return assumptions.ToArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
using System.Globalization;
|
||||
using CsvHelper;
|
||||
using CsvHelper.Configuration;
|
||||
|
||||
namespace Core.Parsers;
|
||||
|
||||
public class CsvParserBase : IDisposable
|
||||
{
|
||||
private readonly StreamReader _reader;
|
||||
//private readonly MemoryStream _memoryStream;
|
||||
protected readonly CsvReader CsvReader;
|
||||
|
||||
protected CsvParserBase(FileSystemInfo csvFile, bool ignoreBlankLines)
|
||||
{
|
||||
_reader = OpenCsv(csvFile);
|
||||
CsvReader = InitCsvReader(_reader, ignoreBlankLines);
|
||||
}
|
||||
|
||||
//protected CsvParserBase(byte[] fileContents, bool ignoreBlankLines)
|
||||
//{
|
||||
// _memoryStream = new MemoryStream(fileContents);
|
||||
// _reader = new StreamReader(_memoryStream);
|
||||
|
||||
// CsvReader = InitCsvReader(_reader, ignoreBlankLines);
|
||||
//}
|
||||
|
||||
private static CsvReader InitCsvReader(TextReader reader, bool ignoreBlankLines)
|
||||
{
|
||||
var csvConfiguration = new CsvConfiguration(CultureInfo.CurrentCulture)
|
||||
{
|
||||
HasHeaderRecord = true,
|
||||
IgnoreBlankLines = ignoreBlankLines,
|
||||
ReadingExceptionOccurred = exception => false,
|
||||
MissingFieldFound = null
|
||||
};
|
||||
|
||||
var csvReader = new CsvReader(reader, csvConfiguration);
|
||||
return csvReader;
|
||||
}
|
||||
|
||||
internal static StreamReader OpenCsv(FileSystemInfo csvFile)
|
||||
{
|
||||
if (!csvFile.Exists)
|
||||
throw new FileNotFoundException($"Cannot find file '{csvFile.Name}'");
|
||||
|
||||
return File.OpenText(csvFile.FullName);
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_reader.Dispose();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using Core.Entities;
|
||||
|
||||
namespace Core.Parsers;
|
||||
|
||||
public class EventDefinitionParser : CsvParserBase
|
||||
{
|
||||
public EventDefinitionParser(FileSystemInfo csvFile, bool ignoreBlankLines = true) : base(csvFile, ignoreBlankLines)
|
||||
{
|
||||
}
|
||||
|
||||
public CompetitiveEvent[] Parse()
|
||||
{
|
||||
var events = new List<CompetitiveEvent>();
|
||||
|
||||
CsvReader.Read();
|
||||
CsvReader.ReadHeader();
|
||||
|
||||
while (CsvReader.Read())
|
||||
{
|
||||
var name = CsvReader.GetField("Event");
|
||||
if (string.IsNullOrEmpty(name))
|
||||
continue;
|
||||
var shortName = CsvReader.GetField("Short Name");
|
||||
|
||||
Enum.TryParse(CsvReader.GetField("Format"), out EventFormat format);
|
||||
|
||||
var teamSize = CsvReader.GetField("Team Size");
|
||||
if (string.IsNullOrEmpty(teamSize))
|
||||
throw new ArgumentException(@"Team Size is null for {name}");
|
||||
var match = Regex.Match(teamSize, @"(\d)(?:\s?to\s?)?(\d)?");
|
||||
var min = int.Parse(match.Groups[1].Captures[0].Value);
|
||||
var max = match.Groups[2].Success ? int.Parse(match.Groups[2].Captures[0].Value) : min;
|
||||
|
||||
var stateTeams = CsvReader.GetField<int>("State Count");
|
||||
var semifinalistActivity = CsvReader.GetField("Semifinalist Activity");
|
||||
var regionalCount = CsvReader.GetField("Regional Count");
|
||||
var regionalPresubmit = CsvReader.GetField("Regional Presubmission");
|
||||
var statePresubmission = CsvReader.GetField("State Presubmission");
|
||||
var statePretesting = CsvReader.GetField("State Pretesting");
|
||||
var statePreliminary = CsvReader.GetField("State Preliminary Round");
|
||||
var regionalNotes = CsvReader.GetField("Regional Notes");
|
||||
var documentation = CsvReader.GetField("Documentation");
|
||||
var eligibility = CsvReader.GetField("Eligibility");
|
||||
var theme = CsvReader.GetField("Theme");
|
||||
var description = CsvReader.GetField("Description");
|
||||
var levelOfEffort = CsvReader.GetField<int?>("Level of Effort");
|
||||
//var regionalTeams = CsvReader.GetField<int>("Regional Teams");
|
||||
|
||||
var competitiveEvent = new CompetitiveEvent
|
||||
{
|
||||
Name = name.Trim(),
|
||||
ShortName = shortName.Trim(),
|
||||
Format = format,
|
||||
MaxTeamCountState = stateTeams,
|
||||
MinTeamSize = min,
|
||||
MaxTeamSize = max,
|
||||
SemifinalistActivity = semifinalistActivity,
|
||||
RegionalEvent = !string.IsNullOrEmpty(regionalCount),
|
||||
RegionalPresubmit = regionalPresubmit.Trim() == "TRUE",
|
||||
RegionalNotes = regionalNotes,
|
||||
Documentation= documentation,
|
||||
StatePresubmission = statePresubmission.Trim() == "TRUE",
|
||||
StatePretesting = statePretesting.Trim() == "TRUE",
|
||||
StatePreliminaryRound = statePreliminary.Trim() == "TRUE",
|
||||
Eligibility = eligibility,
|
||||
Theme = theme,
|
||||
Description = description,
|
||||
LevelOfEffort = levelOfEffort
|
||||
};
|
||||
events.Add(competitiveEvent);
|
||||
}
|
||||
|
||||
return events.ToArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,184 @@
|
||||
using System.Text.RegularExpressions;
|
||||
using Core.Entities;
|
||||
using FuzzySharp;
|
||||
|
||||
namespace Core.Parsers;
|
||||
|
||||
public class EventOccurrenceParser
|
||||
{
|
||||
private FileSystemInfo _txtFile;
|
||||
private ICollection<CompetitiveEvent> _events;
|
||||
|
||||
public EventOccurrenceParser(FileSystemInfo txtFile, ICollection<CompetitiveEvent> events)
|
||||
{
|
||||
_events = events;
|
||||
_txtFile = txtFile;
|
||||
}
|
||||
|
||||
private Regex _re =
|
||||
new (
|
||||
@"" + //
|
||||
@"(?<Name>^[^#].*)\s" +
|
||||
@"(?<Month>February|March|April|May|June|July)\s" +
|
||||
@"(?<DayOfMonth>\d{1,2});?\s" +
|
||||
@"(?<TimeAndLocation>.*)"
|
||||
);
|
||||
|
||||
private readonly Regex _timeRe = new(@"(?<Hour>\d{1,2}):?(?<Minute>\d{2})?\s?(?<APM>(?:a|p)\.?m\.?)");
|
||||
|
||||
private readonly Regex _timeLocationRegex = new(@"(?<Time>.*(?>[AaPp]\.?[Mm]\.?))(?<Location>[\s\t].*)?");
|
||||
|
||||
public IDictionary<CompetitiveEvent, List<EventOccurrence>> Parse()
|
||||
{
|
||||
var occurrences = new Dictionary<CompetitiveEvent, List<EventOccurrence>>();
|
||||
CompetitiveEvent currentEvent = null;
|
||||
|
||||
var lines = File.ReadLines(_txtFile.FullName);
|
||||
foreach (var line in lines)
|
||||
{
|
||||
var match = _re.Match(line);
|
||||
if (!match.Success)
|
||||
{
|
||||
if (line.Contains("MS"))
|
||||
{
|
||||
var evt =
|
||||
(from e in _events
|
||||
let rat = Fuzz.Ratio(e.Name, line.Trim())
|
||||
where rat > 50
|
||||
orderby rat descending
|
||||
select e).FirstOrDefault();
|
||||
if (evt == null)
|
||||
continue;
|
||||
currentEvent = evt;
|
||||
continue;
|
||||
}
|
||||
if (line == "General Schedule")
|
||||
{
|
||||
currentEvent = CompetitiveEvent.GeneralSchedule;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (line == "Voting Delegates")
|
||||
{
|
||||
currentEvent = CompetitiveEvent.VotingDelegates;
|
||||
continue;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (currentEvent == null)
|
||||
continue;
|
||||
|
||||
var occurrenceName = match.Groups["Name"].Captures[0].Value;
|
||||
var month = match.Groups["Month"].Captures[0].Value;
|
||||
var dayOfMonth = match.Groups["DayOfMonth"].Captures[0].Value;
|
||||
var timeAndLocation = match.Groups["TimeAndLocation"].Captures[0].Value;
|
||||
|
||||
|
||||
occurrenceName = Regex.Replace(occurrenceName,
|
||||
@"(?<Weekday>Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday),\s?$", "").Trim();
|
||||
|
||||
|
||||
timeAndLocation = SanitizeInput(timeAndLocation);
|
||||
var timeAndLocationMatch = _timeLocationRegex.Match(timeAndLocation);
|
||||
|
||||
var time = timeAndLocation;
|
||||
var location = string.Empty;
|
||||
|
||||
if (timeAndLocationMatch.Success)
|
||||
{
|
||||
time= timeAndLocationMatch.Groups["Time"].Captures[0].Value;
|
||||
if (timeAndLocationMatch.Groups["Location"].Success)
|
||||
location = timeAndLocationMatch.Groups["Location"].Captures[0].Value;
|
||||
}
|
||||
|
||||
var startDate = ParseDate(month, dayOfMonth, DateTime.Now.Year);
|
||||
var startTime = ParseStartTime(time);
|
||||
var t = new DateTime(startDate, startTime);
|
||||
|
||||
var eventOccurrence = new EventOccurrence
|
||||
{
|
||||
Name = occurrenceName, StartTime = t, Time = $"{time}", Date = $"{month} {dayOfMonth}",
|
||||
Location = location
|
||||
};
|
||||
|
||||
if (!occurrences.ContainsKey(currentEvent))
|
||||
occurrences.Add(currentEvent, []);
|
||||
occurrences[currentEvent].Add(eventOccurrence);
|
||||
}
|
||||
|
||||
return occurrences;
|
||||
}
|
||||
|
||||
private string SanitizeInput(string input)
|
||||
{
|
||||
|
||||
input = input.Replace("–", "-");
|
||||
input = input.Replace("—", "-");
|
||||
|
||||
return input;
|
||||
}
|
||||
|
||||
private DateOnly ParseDate(string month, string dayOfMonth, int year)
|
||||
{
|
||||
int monthNum = 1;
|
||||
switch (month)
|
||||
{
|
||||
case "February":
|
||||
monthNum = 2;
|
||||
break;
|
||||
case "March":
|
||||
monthNum = 3;
|
||||
break;
|
||||
case "April":
|
||||
monthNum = 4;
|
||||
break;
|
||||
case "May":
|
||||
monthNum = 5;
|
||||
break;
|
||||
case "June":
|
||||
monthNum = 6;
|
||||
break;
|
||||
case "July":
|
||||
monthNum = 7;
|
||||
break;
|
||||
}
|
||||
|
||||
var day = int.Parse(dayOfMonth);
|
||||
return new DateOnly(year, monthNum, day); ;
|
||||
}
|
||||
|
||||
private TimeOnly ParseStartTime(string time)
|
||||
{
|
||||
int hour = 0;
|
||||
int minute = 0;
|
||||
|
||||
// get the part of the time before a timespan
|
||||
if (time.Contains(" - "))
|
||||
{
|
||||
time = time[..time.IndexOf(" - ", StringComparison.Ordinal)];
|
||||
|
||||
}
|
||||
|
||||
if (time == "NOON")
|
||||
hour = 12;
|
||||
else
|
||||
{
|
||||
var timeMatch = _timeRe.Match(time.ToLower());
|
||||
if (timeMatch.Success)
|
||||
{
|
||||
hour = int.Parse(timeMatch.Groups["Hour"].Captures[0].Value);
|
||||
if (timeMatch.Groups["Minute"].Success)
|
||||
{
|
||||
minute = int.Parse(timeMatch.Groups["Minute"].Captures[0].Value);
|
||||
}
|
||||
|
||||
if (timeMatch.Groups["APM"].Captures[0].Value is "p.m." or "pm" && hour < 12)
|
||||
hour += 12;
|
||||
}
|
||||
}
|
||||
|
||||
return new TimeOnly(hour, minute, 0);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
using Core.Entities;
|
||||
using FuzzySharp;
|
||||
|
||||
namespace Core.Parsers;
|
||||
|
||||
public class StudentParser : CsvParserBase
|
||||
{
|
||||
public StudentParser(FileSystemInfo csvFile, bool ignoreBlankLines = true) : base(csvFile, ignoreBlankLines)
|
||||
{
|
||||
}
|
||||
|
||||
public Student[] Parse(ICollection<CompetitiveEvent> events)
|
||||
{
|
||||
var s = new List<Student>();
|
||||
|
||||
CsvReader.Read();
|
||||
CsvReader.ReadHeader();
|
||||
|
||||
while (CsvReader.Read())
|
||||
{
|
||||
var name = CsvReader.GetField("Student Name");
|
||||
if (string.IsNullOrEmpty(name))
|
||||
continue;
|
||||
|
||||
var stateID = CsvReader.GetField("State ID").Trim();
|
||||
var regionalID = CsvReader.GetField("Regional ID").Trim();
|
||||
var nationalID = CsvReader.GetField("National ID").Trim();
|
||||
var gr = CsvReader.GetField("Grade");
|
||||
var tsaYearsStr = CsvReader.GetField("TSA year");
|
||||
var tsaYear = int.Parse(tsaYearsStr?[..1] ?? "1");
|
||||
var officer = CsvReader.GetField("Officer");
|
||||
|
||||
var competitiveEvents = new List<CompetitiveEvent>(6);
|
||||
|
||||
for (var i = 1; i <= 6; i++)
|
||||
{
|
||||
var eventName = CsvReader.GetField(i.ToString());
|
||||
if (string.IsNullOrEmpty(eventName) || eventName == "") continue;
|
||||
|
||||
eventName = eventName.Trim();
|
||||
|
||||
if (eventName == "I&I")
|
||||
eventName = "Inventions & Innovations";
|
||||
if (eventName == "Med Tech")
|
||||
eventName = "Medical Technology";
|
||||
if (eventName.StartsWith("Challenging Tech"))
|
||||
eventName = "Challenging Technology Issues";
|
||||
|
||||
var matches =
|
||||
(from e in events
|
||||
let rat = Fuzz.Ratio(e.Name, eventName)
|
||||
where rat > 90
|
||||
orderby rat descending
|
||||
select e).ToList();
|
||||
|
||||
if (!matches.Any())
|
||||
{
|
||||
matches =
|
||||
(from e in events
|
||||
where e.Name.StartsWith(eventName)
|
||||
select e).ToList();
|
||||
}
|
||||
|
||||
var competitiveEvent = matches.FirstOrDefault();
|
||||
if (competitiveEvent == null)
|
||||
{
|
||||
|
||||
//todo: throw new ArgumentException($"Event named '{eventName}' not found");
|
||||
continue;
|
||||
}
|
||||
|
||||
competitiveEvents.Add(competitiveEvent);
|
||||
}
|
||||
|
||||
if (!competitiveEvents.Any())
|
||||
continue;
|
||||
|
||||
var student = new Student(
|
||||
name.Trim(),
|
||||
Convert.ToInt32(gr),
|
||||
tsaYear,
|
||||
officer?.Trim(),
|
||||
competitiveEvents, stateID, regionalID, nationalID);
|
||||
s.Add(student);
|
||||
}
|
||||
|
||||
return s.ToArray();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,166 @@
|
||||
using System.Globalization;
|
||||
using Core.Entities;
|
||||
using CsvHelper;
|
||||
using CsvHelper.Configuration;
|
||||
using FuzzySharp;
|
||||
|
||||
namespace Core.Parsers
|
||||
{
|
||||
public class TeamWriter
|
||||
{
|
||||
private readonly ICollection<Team> _teams;
|
||||
|
||||
public string Filename { get; }
|
||||
|
||||
public TeamWriter(ICollection<Team> teams, string filename)
|
||||
{
|
||||
_teams = teams;
|
||||
Filename = filename;
|
||||
}
|
||||
|
||||
public void Write()
|
||||
{
|
||||
var csvConfiguration = new CsvConfiguration(CultureInfo.CurrentCulture)
|
||||
{
|
||||
HasHeaderRecord = true,
|
||||
};
|
||||
|
||||
using var writer = new StreamWriter(Filename);
|
||||
using var csv = new CsvWriter(writer, csvConfiguration);
|
||||
|
||||
// header
|
||||
csv.WriteField("Team Name");
|
||||
csv.WriteField("Event Name");
|
||||
var max = _teams.Max(t => t.Students.Count);
|
||||
for (var i = 1; i < max + 1; i++)
|
||||
{
|
||||
csv.WriteField($"Student {i}");
|
||||
}
|
||||
|
||||
foreach (var team in _teams)
|
||||
{
|
||||
csv.WriteField(team.Name);
|
||||
csv.WriteField(team.Event.Name);
|
||||
foreach (var teamStudent in team.Students)
|
||||
{
|
||||
csv.WriteField(teamStudent.Name);
|
||||
}
|
||||
csv.NextRecord();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class TeamParser : CsvParserBase
|
||||
{
|
||||
public TeamParser(FileSystemInfo csvFile, bool ignoreBlankLines = true) : base(csvFile, ignoreBlankLines)
|
||||
{
|
||||
}
|
||||
|
||||
public Team[] Parse(ICollection<CompetitiveEvent> events, ICollection<Student> students)
|
||||
{
|
||||
var teams = new List<Team>();
|
||||
|
||||
CsvReader.Read();
|
||||
CsvReader.ReadHeader();
|
||||
|
||||
while (CsvReader.Read())
|
||||
{
|
||||
|
||||
var eventName
|
||||
= CsvReader.GetField("Event Name");
|
||||
|
||||
if (string.IsNullOrEmpty(eventName))
|
||||
continue;
|
||||
|
||||
if (eventName.StartsWith("Team Size"))
|
||||
continue;
|
||||
|
||||
eventName = eventName.Replace("ᵃ", string.Empty);
|
||||
eventName = eventName.Replace("ⁱ", string.Empty);
|
||||
eventName = eventName.TrimEnd();
|
||||
|
||||
var teamName = CsvReader.GetField("Team Name");
|
||||
if (string.IsNullOrEmpty(teamName))
|
||||
teamName = eventName;
|
||||
|
||||
eventName = eventName.Trim();
|
||||
|
||||
var @event =
|
||||
(from e in events
|
||||
let rat = Fuzz.Ratio(e.Name, eventName)
|
||||
where rat > 50
|
||||
orderby rat descending
|
||||
select e).FirstOrDefault();
|
||||
|
||||
if (@event == null)
|
||||
continue;
|
||||
|
||||
var regionalTimeSlot = CsvReader.GetField("Regional Time Slot");
|
||||
if (!string.IsNullOrEmpty(regionalTimeSlot))
|
||||
regionalTimeSlot.Trim();
|
||||
|
||||
var teamStudents = new List<Student>();
|
||||
Student? captain = null;
|
||||
|
||||
for (var i = 1; i <= 9; i++)
|
||||
{
|
||||
var studentName = CsvReader.GetField($"Student {i}");
|
||||
if (string.IsNullOrEmpty(studentName)) continue;
|
||||
|
||||
studentName = studentName.Trim();
|
||||
|
||||
if (studentName == "?")
|
||||
continue;
|
||||
|
||||
var studentMatches =
|
||||
from s in students
|
||||
let rat = new[]
|
||||
{
|
||||
Fuzz.Ratio(s.Name, studentName),
|
||||
Fuzz.Ratio(s.FirstNameLastName, studentName),
|
||||
Fuzz.Ratio(s.FirstName, studentName)
|
||||
}.Max()
|
||||
where rat > 90
|
||||
orderby rat descending
|
||||
select s;
|
||||
|
||||
var student = studentMatches.FirstOrDefault();
|
||||
if (student == null)
|
||||
{
|
||||
//continue;
|
||||
throw new ArgumentException($"Student named '{studentName}' not found");
|
||||
}
|
||||
|
||||
teamStudents.Add(student);
|
||||
if (i == 1)
|
||||
captain = student;
|
||||
}
|
||||
|
||||
var teamNumber = string.Empty;
|
||||
if (teamName.EndsWith("Team 2"))
|
||||
teamNumber = "12227-2";
|
||||
else if (@event.Format == EventFormat.Team)
|
||||
teamNumber = "2227";
|
||||
|
||||
if (teamStudents.Count > 0)
|
||||
{
|
||||
if (@event.Format is EventFormat.Team)
|
||||
{
|
||||
teams.Add(new Team(teamName, @event, teamStudents, captain, teamNumber,
|
||||
regionalTimeSlot: regionalTimeSlot));
|
||||
}
|
||||
else if (@event.Format is EventFormat.Individual)
|
||||
{
|
||||
foreach (var student in teamStudents)
|
||||
{
|
||||
teams.Add(new Team($"{teamName} - {student.FirstName}", @event,
|
||||
new List<Student> { student }, student, teamNumber, regionalTimeSlot));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return teams.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
namespace Core.Utility;
|
||||
|
||||
public static class FileUtility
|
||||
{
|
||||
public static FileInfo GetContentFile(string contentDirectory, string fileName, bool useAssemblyDirectory = false)
|
||||
{
|
||||
string basePath;
|
||||
//if (useAssemblyDirectory)
|
||||
// basePath = AssemblyDirectory;
|
||||
//else
|
||||
basePath = AppDomain.CurrentDomain.BaseDirectory;
|
||||
var path = Path.Combine(basePath, contentDirectory);
|
||||
return new FileInfo(path + fileName);
|
||||
}
|
||||
|
||||
//public static string AssemblyDirectory
|
||||
//{
|
||||
// get
|
||||
// {
|
||||
// var codeBase = Assembly.GetExecutingAssembly().Location;
|
||||
// var uri = new UriBuilder(codeBase);
|
||||
// var path = Uri.UnescapeDataString(uri.Path);
|
||||
// return Path.GetDirectoryName(path);
|
||||
// }
|
||||
//}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
namespace Core.Utility;
|
||||
|
||||
public static class TextUtil
|
||||
{
|
||||
/// <summary>
|
||||
/// Get the ordinal value of positive integers.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Only works for english-based cultures.
|
||||
/// Code from: http://stackoverflow.com/questions/20156/is-there-a-quick-way-to-create-ordinals-in-c/31066#31066
|
||||
/// With help: http://www.wisegeek.com/what-is-an-ordinal-number.htm
|
||||
/// </remarks>
|
||||
/// <param name="number">The number.</param>
|
||||
/// <returns>Ordinal value of positive integers, or <see cref="int.ToString"/> if less than 1.</returns>
|
||||
/// https://stackoverflow.com/a/620504/99492
|
||||
public static string Ordinal(this int number)
|
||||
{
|
||||
const string TH = "th";
|
||||
string s = number.ToString();
|
||||
|
||||
// Negative and zero have no ordinal representation
|
||||
if (number < 1)
|
||||
{
|
||||
return s;
|
||||
}
|
||||
|
||||
number %= 100;
|
||||
if ((number >= 11) && (number <= 13))
|
||||
{
|
||||
return s + TH;
|
||||
}
|
||||
|
||||
switch (number % 10)
|
||||
{
|
||||
case 1: return s + "st";
|
||||
case 2: return s + "nd";
|
||||
case 3: return s + "rd";
|
||||
default: return s + TH;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void ConsoleWriteTable(
|
||||
Func<int, int, bool> getVal, string rowHeader, int[] rowVars, string colHeader, int[] colVars)
|
||||
{
|
||||
var chl = $" {colHeader} 0".Length;
|
||||
var rhl = $"{rowHeader} 0".Length + 3;
|
||||
Console.Write(new string(' ', rhl));
|
||||
foreach (var c in colVars)
|
||||
{
|
||||
Console.Write($" {colHeader} {c + 1}");
|
||||
}
|
||||
Console.WriteLine();
|
||||
Console.WriteLine();
|
||||
foreach (var r in rowVars)
|
||||
{
|
||||
var rhead = $"{rowHeader} {r + 1}:";
|
||||
Console.Write(rhead.PadRight(rhl));
|
||||
foreach (var c in colVars)
|
||||
{
|
||||
var v = getVal(r, c) ? "1" : " ";
|
||||
Console.Write($"{v.PadLeft(chl)}");
|
||||
}
|
||||
|
||||
Console.WriteLine();
|
||||
}
|
||||
Console.WriteLine();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.7.34031.279
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core", "Core\Core.csproj", "{338B8571-2953-4EA3-A680-F000F1431DFF}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tests", "Tests\Tests.csproj", "{E9FBB9FD-6F5E-497E-AF41-A66E14421F00}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Web", "Web\Web.csproj", "{855D693D-16FF-4C4A-AD3C-74A6B21ADB72}"
|
||||
EndProject
|
||||
Project("{54A90642-561A-4BB1-A94E-469ADEE60C69}") = "app.client", "App\app.client\app.client.esproj", "{B5C2BB9C-648A-1696-315D-CC0E08D4256C}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "App.Server", "App\App.Server\App.Server.csproj", "{3548E169-4440-4259-8E0F-7210D12D7C40}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{338B8571-2953-4EA3-A680-F000F1431DFF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{338B8571-2953-4EA3-A680-F000F1431DFF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{338B8571-2953-4EA3-A680-F000F1431DFF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{338B8571-2953-4EA3-A680-F000F1431DFF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E9FBB9FD-6F5E-497E-AF41-A66E14421F00}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E9FBB9FD-6F5E-497E-AF41-A66E14421F00}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E9FBB9FD-6F5E-497E-AF41-A66E14421F00}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E9FBB9FD-6F5E-497E-AF41-A66E14421F00}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{855D693D-16FF-4C4A-AD3C-74A6B21ADB72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{855D693D-16FF-4C4A-AD3C-74A6B21ADB72}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{855D693D-16FF-4C4A-AD3C-74A6B21ADB72}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{855D693D-16FF-4C4A-AD3C-74A6B21ADB72}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B5C2BB9C-648A-1696-315D-CC0E08D4256C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B5C2BB9C-648A-1696-315D-CC0E08D4256C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B5C2BB9C-648A-1696-315D-CC0E08D4256C}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||
{B5C2BB9C-648A-1696-315D-CC0E08D4256C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B5C2BB9C-648A-1696-315D-CC0E08D4256C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B5C2BB9C-648A-1696-315D-CC0E08D4256C}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
||||
{3548E169-4440-4259-8E0F-7210D12D7C40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3548E169-4440-4259-8E0F-7210D12D7C40}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3548E169-4440-4259-8E0F-7210D12D7C40}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3548E169-4440-4259-8E0F-7210D12D7C40}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {231BB679-5139-42DC-9C23-1B34D09D94E2}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
@@ -0,0 +1,22 @@
|
||||
using Core.Calculation;
|
||||
using Tests.Parsers;
|
||||
|
||||
namespace Tests.Calculation;
|
||||
[TestFixture]
|
||||
public class DataProcessingTests
|
||||
{
|
||||
|
||||
[Test]
|
||||
public void GetEventStudentPicksTest()
|
||||
{
|
||||
var events = TestEntityHandler.GetCompetitiveEvents();
|
||||
var students = TestEntityHandler.GetStudents(events);
|
||||
|
||||
var eventStudentPicksArray = DataProcessing.GetEventStudentPicks(events, students);
|
||||
foreach (var eventPicks in eventStudentPicksArray)
|
||||
{
|
||||
Console.WriteLine(eventPicks.Event.Name);
|
||||
Console.WriteLine(string.Join(", ", eventPicks.StudentPicks.Select(s => $"{s.Item2}: {s.Item1.Name}")));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
using Core.Calculation;
|
||||
using Core.Entities;
|
||||
using Core.Parsers;
|
||||
using Tests.Parsers;
|
||||
|
||||
namespace Tests.Calculation;
|
||||
[TestFixture]
|
||||
public class EventAssignerTests
|
||||
{
|
||||
|
||||
[Test]
|
||||
public void SolutionTest()
|
||||
{
|
||||
var events = TestEntityHandler.GetCompetitiveEvents();
|
||||
var students = TestEntityHandler.GetStudents(events);
|
||||
|
||||
var eventAssignment = new EventAssigner(events, students, new AssignmentParameters());
|
||||
var teams = eventAssignment.Solve();
|
||||
|
||||
var teamWriter = new TeamWriter(teams, @"c:\temp\teams.csv");
|
||||
teamWriter.Write();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
using Core.Calculation;
|
||||
using Core.Entities;
|
||||
using Tests.Parsers;
|
||||
|
||||
namespace Tests.Calculation;
|
||||
|
||||
[TestFixture]
|
||||
public class TeamSchedulerTest
|
||||
{
|
||||
[Test]
|
||||
public void Prototype_Test()
|
||||
{
|
||||
var teamSchedulerTest = new Core.Calculation.TeamScheduler_Prototype();
|
||||
teamSchedulerTest.Solve();
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void SolutionTest()
|
||||
{
|
||||
var events = TestEntityHandler.GetCompetitiveEvents();
|
||||
var students = TestEntityHandler.GetStudents(events);
|
||||
|
||||
var allTeams = TestEntityHandler.GetTeams(events, students);
|
||||
var teams = allTeams;
|
||||
|
||||
teams =
|
||||
(from e in events
|
||||
from t in teams
|
||||
where t.Event == e
|
||||
//&& t.Students.Count > 1
|
||||
&& (e.Format == EventFormat.Team && e.RegionalEvent)
|
||||
select t).ToArray();
|
||||
teams =
|
||||
teams.Where(t => !t.Event.Name.Contains("Tech Bowl")).ToArray();
|
||||
|
||||
//var eventAssignment = new EventAssigner(events, students);
|
||||
//var teams = eventAssignment.Solve();
|
||||
|
||||
IList<Team>[] timeSlots;
|
||||
if (true)
|
||||
{
|
||||
var teamScheduler = TeamScheduler.CreateInstance(teams, 3);
|
||||
timeSlots = teamScheduler.Solve();
|
||||
}
|
||||
else
|
||||
{
|
||||
var teamScheduler = new TeamScheduler_DecisionTree(teams, 3);
|
||||
timeSlots = teamScheduler.Solve();
|
||||
}
|
||||
|
||||
timeSlots = new UnassignedStudentScheduler(allTeams, timeSlots).ScheduleStrategy(UnassignedScheduleStrategy.BiggestGroup);
|
||||
timeSlots = new UnassignedStudentScheduler(allTeams, timeSlots).ScheduleStrategy(UnassignedScheduleStrategy.IndividualEvents);
|
||||
|
||||
var i = 1;
|
||||
foreach (var slot in timeSlots)
|
||||
{
|
||||
Console.WriteLine($"Time slot {i++}");
|
||||
foreach (var team in slot.OrderBy(s => s.Event.Name))
|
||||
{
|
||||
var names = string.Join(", ", team.Students.OrderByDescending(s => s.Grade + s.TsaYear).Select(s => s.FirstName));
|
||||
Console.WriteLine($"\t{team.Name}");
|
||||
Console.WriteLine($"\t\t{names}");
|
||||
}
|
||||
|
||||
var overlaps = Team.GetStudentTeamOverlaps(slot).ToList();
|
||||
|
||||
if (overlaps.Any())
|
||||
{
|
||||
Console.WriteLine("\toverlaps");
|
||||
foreach (var overlap in overlaps)
|
||||
Console.WriteLine(
|
||||
$"\t\t{overlap.Item1.Name} : {string.Join(", ", overlap.Item2.Select(t => t.Name))}");
|
||||
}
|
||||
|
||||
var unassigned = UnassignedStudentScheduler.UnassignedStudents(students, slot).ToList();
|
||||
|
||||
if (unassigned.Any())
|
||||
Console.WriteLine("\tunassigned");
|
||||
Console.WriteLine($"\t\t{string.Join(", ", unassigned.Select(s => s.FirstName))}");
|
||||
}
|
||||
|
||||
//var allScheduledTeams = timeSlots.SelectMany(list => list).GroupBy(t => t.Name).SelectMany(g => g).Distinct();
|
||||
//foreach (var allScheduledTeam in allScheduledTeams.OrderBy(a => a.Name))
|
||||
//{
|
||||
// Console.WriteLine($"{allScheduledTeam.Name}");
|
||||
// Console.WriteLine($"\t{string.Join(", ", allScheduledTeam.Students.Select(s => s.FirstName))}");
|
||||
//}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
global using NUnit.Framework;
|
||||
@@ -0,0 +1,19 @@
|
||||
namespace Tests.Parsers;
|
||||
|
||||
public class AssignmentAssumption_Tests
|
||||
{
|
||||
[Test]
|
||||
public void ParseTest()
|
||||
{
|
||||
var competitiveEvents = TestEntityHandler.GetCompetitiveEvents();
|
||||
var students = TestEntityHandler.GetStudents(competitiveEvents);
|
||||
var eventAssumptions = TestEntityHandler.GetEventAssumptions(competitiveEvents, students);
|
||||
|
||||
foreach (var ea in eventAssumptions)
|
||||
{
|
||||
Console.WriteLine($"{ea.Assumption,10} {ea.Event.ShortName, -20} {ea.Student.FirstName}");
|
||||
}
|
||||
|
||||
Assert.Pass();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
namespace Tests.Parsers;
|
||||
|
||||
public class EventDefinitionParser_Tests
|
||||
{
|
||||
|
||||
[Test]
|
||||
public void ParseTest()
|
||||
{
|
||||
var events = TestEntityHandler.GetCompetitiveEvents();
|
||||
|
||||
Console.WriteLine($"Event, Type, Int/Pres, Team Size, Team Count, Regional");
|
||||
foreach (var @event in events)
|
||||
{
|
||||
Console.WriteLine($"{@event.ShortName}, {@event.Format}, {@event.Eligibility}, {@event.Description}, {@event.InterviewOrPresentation}, {@event.TeamSize}, {@event.MaxTeamCountState}, {@event.InterviewOrPresentation}, {@event.RegionalEvent}");
|
||||
}
|
||||
|
||||
foreach (var @event in events)
|
||||
{
|
||||
Console.WriteLine($"{@event.ShortName}");
|
||||
}
|
||||
Assert.Pass();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using Core.Entities;
|
||||
using Core.Parsers;
|
||||
|
||||
namespace Tests.Parsers;
|
||||
|
||||
public class EventOccurrenceParser_Tests
|
||||
{
|
||||
|
||||
[Test]
|
||||
public void ParseTest()
|
||||
{
|
||||
var events = TestEntityHandler.GetCompetitiveEvents();
|
||||
var parser = new EventOccurrenceParser(TestEntityHandler.GetEventOccurrenceFileInfo(), events);
|
||||
var dictionary = parser.Parse();
|
||||
Console.WriteLine($"Occurrence, Month, Date, Time, Location");
|
||||
foreach (var @event in events)
|
||||
{
|
||||
Console.WriteLine($"{@event.Name}");
|
||||
|
||||
if (!dictionary.ContainsKey(@event))
|
||||
{
|
||||
Console.WriteLine("!!! event not found " + @event.Name);
|
||||
continue;
|
||||
}
|
||||
var eventOccurrences = dictionary[@event];
|
||||
foreach (var eo in eventOccurrences)
|
||||
{
|
||||
Console.WriteLine($"\t{eo.StartTime.DayOfWeek} {eo.Time}, {eo.Name}, {eo.Location}");
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine("General Schedule");
|
||||
foreach (var eo in dictionary[CompetitiveEvent.GeneralSchedule].OrderBy(occurrence => occurrence.StartTime))
|
||||
{
|
||||
Console.WriteLine($"\t{eo.StartTime.DayOfWeek} {eo.Time}, {eo.Name}, {eo.Location}");
|
||||
}
|
||||
|
||||
if (dictionary.ContainsKey(CompetitiveEvent.VotingDelegates))
|
||||
foreach (var eo in dictionary[CompetitiveEvent.VotingDelegates])
|
||||
{
|
||||
Console.WriteLine($"{eo.Name} {eo.StartTime}, {eo.Location}");
|
||||
}
|
||||
|
||||
Assert.Pass();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
namespace Tests.Parsers;
|
||||
|
||||
public class StudentParser_Tests
|
||||
{
|
||||
private const string ContentDirectory = @"Parsers\TestInput\";
|
||||
|
||||
[Test]
|
||||
public void ParseTest()
|
||||
{
|
||||
var students = TestEntityHandler.GetStudents(TestEntityHandler.GetCompetitiveEvents());
|
||||
|
||||
foreach (var student in students)
|
||||
{
|
||||
|
||||
Console.WriteLine($"{student.Name}, {student.Grade}, {student.StateID}, {student.RegionalID}, {student.TsaYear}, {student.Officer}");
|
||||
Console.WriteLine("\t{0}", string.Join(", ", student.RankedEventPicks.Select(e => e.Name)));
|
||||
|
||||
}
|
||||
|
||||
Console.WriteLine( string.Join(", ", students.OrderBy(s => s.FirstName).Select(s => s.FirstName)));
|
||||
Assert.Pass();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
namespace Tests.Parsers;
|
||||
|
||||
public class TeamParser_Tests
|
||||
{
|
||||
[Test]
|
||||
public void ParseTest()
|
||||
{
|
||||
var competitiveEvents = TestEntityHandler.GetCompetitiveEvents();
|
||||
var teams = TestEntityHandler.GetTeams(competitiveEvents, TestEntityHandler.GetStudents(competitiveEvents));
|
||||
|
||||
foreach (var team in teams)
|
||||
{
|
||||
|
||||
Console.WriteLine($"{team.Name}");
|
||||
var join = string.Join(", ", team.Students.OrderByDescending(s=> s.Grade + s.TsaYear).Select(s => $"{s.FirstNameLastName}{(team.Captain == s ? " *" : "")}"));
|
||||
Console.WriteLine($"\t{join}");
|
||||
|
||||
}
|
||||
Assert.Pass();
|
||||
}
|
||||
|
||||
|
||||
[Test]
|
||||
public void RegionalPresubmissions()
|
||||
{
|
||||
var competitiveEvents = TestEntityHandler.GetCompetitiveEvents();
|
||||
var students = TestEntityHandler.GetStudents(competitiveEvents);
|
||||
var teams = TestEntityHandler.GetTeams(competitiveEvents, students);
|
||||
|
||||
foreach (var team in teams.Where(t => t.Event.RegionalEvent))
|
||||
{
|
||||
Console.WriteLine($"{team.Name} {team.Event.RegionalPresubmit} {team.RegionalTimeSlot}");
|
||||
var join = string.Join(", ", team.Students.OrderByDescending(s => team.Captain == s).ThenByDescending(s => s.Grade + s.TsaYear).Select(s => $"{s.FirstNameLastName}{(team.Captain == s ? " *" +
|
||||
"(Cpt.)" : "")}"));
|
||||
Console.WriteLine($"\t{join}");
|
||||
Console.WriteLine(team.RegionalTimeSlotObj);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
using Core.Entities;
|
||||
using Core.Parsers;
|
||||
using Core.Utility;
|
||||
|
||||
namespace Tests.Parsers;
|
||||
|
||||
public static class TestEntityHandler
|
||||
{
|
||||
private const string ContentDirectory = @"Parsers\TestInput\";
|
||||
|
||||
public static CompetitiveEvent[] GetCompetitiveEvents()
|
||||
{
|
||||
var fileInfo = FileUtility.GetContentFile(ContentDirectory, "2024-25 RMS TSA student & event - Event Definitions.csv");
|
||||
var eventRankingsParser = new EventDefinitionParser(fileInfo);
|
||||
return eventRankingsParser.Parse();
|
||||
}
|
||||
|
||||
public static FileInfo GetEventOccurrenceFileInfo()
|
||||
{
|
||||
return FileUtility.GetContentFile(ContentDirectory, "2025 TSA Nationals Competition Event Times.txt");
|
||||
}
|
||||
|
||||
public static Student[] GetStudents(IList<CompetitiveEvent> competitiveEvents)
|
||||
{
|
||||
//var studentEventRankingsCsv = "Student Event Rankings.csv";
|
||||
var studentEventRankingsCsv = "2024-25 RMS TSA student & event - Nationals Student Event Rankings.csv";
|
||||
|
||||
var fileInfo = FileUtility.GetContentFile(ContentDirectory, studentEventRankingsCsv);
|
||||
var eventRankingsParser = new StudentParser(fileInfo);
|
||||
return eventRankingsParser.Parse(competitiveEvents);
|
||||
}
|
||||
|
||||
|
||||
public static Team[] GetTeams(IList<CompetitiveEvent> competitiveEvents, IList<Student> students)
|
||||
{
|
||||
//var studentEventRankingsCsv = "Student Event Rankings.csv";
|
||||
var studentEventRankingsCsv = "2024-25 RMS TSA student & event - Nationals Teams.csv";
|
||||
|
||||
var fileInfo = FileUtility.GetContentFile(ContentDirectory, studentEventRankingsCsv);
|
||||
var eventRankingsParser = new TeamParser(fileInfo);
|
||||
var teams = eventRankingsParser.Parse(competitiveEvents, students);
|
||||
|
||||
foreach (var student in students)
|
||||
{
|
||||
student.Teams = teams.Where(t => t.Students.Contains(student)).ToList();
|
||||
}
|
||||
return teams;
|
||||
}
|
||||
|
||||
public static AssignmentAssumption[] GetEventAssumptions(IList<CompetitiveEvent> competitiveEvents, IList<Student> students)
|
||||
{
|
||||
var fileInfo = FileUtility.GetContentFile(ContentDirectory, "2024-25 RMS TSA student & event - assumptions.csv");
|
||||
var assumptionParser = new AssignmentAssumptionParser(fileInfo);
|
||||
return assumptionParser.Parse(competitiveEvents, students);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
Event,Short Name,Level of Effort,Format,Semifinalist Activity,Team Size,Eligibility,Theme,Description,Documentation,State Count,State Presubmission,State Pretesting,State Preliminary Round,State Submit Entry,State Time Semifinalist Sign-up,State Time Semifinalist Presentations/Interviews,State Time Pick-up,Regional Count,Regional Presubmission,Regional Notes
|
||||
Biotechnology,Biotech,2,Team,Interview,2 to 6,five (5) teams per state,Biotechnology that supports sustainable cosmetics packaging to reduce waste to landfills,"To address the annual theme, participants select a contemporary biotechnology issue and demonstrate understanding of the topic through their documented research and an original display. Semifinalists participate in an interview.",Portfolio,2,,,,,,,,,,
|
||||
Career Prep,Career Prep,1,Individual,Interview,1,one (1) individual per chapter,"Theme: Select a career from one (1) of the following: Bioenergy Technicians, Data Architect, Machine Learning Engineer, Nurse Practitioner","Based on the annual theme, participants conduct research on a technology-related career, prepare a letter of introduction to a potential employer, and develop a job-specific resume. Semifinalists participate in a mock job interview.","Cover Letter, Resume",2,TRUE,,,,,,,3,TRUE,12:50pm-1:00pm
|
||||
Challenging Technology Issues,Chlg. Tech Issues,1,Team,Debate Presentation,2,three (3) teams of two (2) individuals per state,"Topics:, Genetic Testing and Counseling, Animal Testing for Scientific Research, The Use of Drones for Surveillance, Privatization of Space Travel, Nanotechnology in Consumer Goods","Following the onsite random selection of a technology topic from a group of pre-conference posted topics, participants work to prepare for and deliver a debate-style presentation, in which they explain opposing views of the selected topic.",Note Cards,2,,,,,,,,3,,"Competition, Video due by Noon"
|
||||
Chapter Team,Chapter Team,,Team,Ceremony,6,one (1) team of six (6) individuals per chapter,,"Participants take a parliamentary procedure test to qualify for the semifinal round of competition. Semifinalists conduct an opening ceremony, items of business, parliamentary actions, and a closing ceremony.",,2,,TRUE,,,,,,,,Practice
|
||||
Children's Stories,Children's Stories,3,Team,Interview,3 to 6,three (3) teams per state; individual entries are permitted,An interactive or pop-up book that focuses on making friends in-person,"Participants create an illustrated children’s story based on the annual theme. The entry product is a physical storybook of artistic, instructional, and social value. Semifinalists read their story aloud and participate in an interview.","Portfolio, Book",2,,,,,,,,3,TRUE,RMS Interview
|
||||
Coding,Coding,2,Team,Challenge,2,one (1) team of two (2) individuals per chapter,"To prepare for MS Coding competition, teams should have knowledge of concepts (software development, computer science, and coding topics) that will be on the Coding written test. They also should be familiar and comfortable with using the Scratch programming language. , , Scratch is a free visual programming language available from the MIT Media Lab (https://scratch.mit.edu/download). An offline version of the Scratch tool should be downloaded and available on each team’s laptop. , , Teams that advance to the semifinalist level, based on written test performance, will perform a challenge using the Scratch programming language. Semifinalist teams will receive the challenge on site and will have two hours to complete it. (PLEASE NOTE: Semifinalist teams MUST have a version of this program available for offline use, as there will be no Internet access available during the semifinalist level of the competition.) , , Examples of the types of challenges students may be asked to complete can be found at this link: https://scratch.mit.edu/starter-projects","To qualify for the semifinal round of competition, participants take a test that concentrates on computer science and coding. Semifinalists demonstrate their programming knowledge by developing a solution to an onsite coding challenge.",,2,,TRUE,,,,,,,,
|
||||
Community Service Video,Comm. Service Vid,2,Team,Presentation and Interview,1 to 6,one (1) team per chapter; individual entries are permitted,,Participants create a video that depicts the local TSA chapter’s involvement in a community service project. Semifinalists deliver a presentation on the project and participate in an interview.,"Copyright Checklist, Release Forms, Video Link",2,TRUE,,,,,,,3,TRUE,RMS Interview
|
||||
CAD foundations,CAD,1,Individual,Challenge,1,two (2) individuals per state,,Participants demonstrate their understanding of CAD fundamentals by creating a two-dimensional (2D) graphic representation of an engineering part or object and answering questions from evaluators about their entry.,Laptop w/CAD Software,2,,,,,,,,,,
|
||||
Construction Challenge,Construction Chlg.,3,Team,Presentation and Interview,3 to 6,one (1) team of at least two (2) individuals per chapter,,"Participants submit a scale model, display, and documentation portfolio for a design that fulfills a community need related to construction. Semifinalists deliver a presentation about their entry and participate in an interview.","Prototype, Display, Portfolio",2,,,,,,,,,,
|
||||
Cybersecurity,Cybersecurity,2,Individual,Presentation,1,three (3) individuals per chapter,Problem Statement: Byte Inc.'s Internet of things and Bluetooth are acting strangely on devices in the company’s network. Address the potential cause and propose a solution.,"Participants take a test that assesses knowledge of cybersecurity vocabulary and the skills needed to execute common cybersecurity tasks. Using digital presentation software, semifinalists deliver a presentation that addresses the annual theme/problem.",Presentation,2,,TRUE,,,,,,,,Practice
|
||||
Data Science & Analytics,Data Sci.,2,Team,Challenge and Presentation,2 to 3,three (3) teams of two to three (2-3) individuals per state,"Determine the potential ""movie success"" of a fictitious feature film based on different public metrics, such as, but not limited to box office revenue, date of release, movie genre (selected by the team), movie production budget, and more.","Participants conduct research on the annual topic, collect data, use analytics to assess the data and make predictions, and document their work in a portfolio and a display. To address a challenge presented onsite at the conference, semifinalists review specific data sets, provide insights, make predictions, and present their findings for evaluation.",Display,2,,,,,,,,,,
|
||||
Digital Photography,Digital Photography,2,Individual,Onsite Photography and Presentation,1,three (3) individuals per state,Students will take four photographs that fit the theme “Through the Eye of an Animal.”,Participants produce and submit a digital photographic portfolio that relates to the annual theme. Semifinalists participate in an onsite photographic challenge and a presentation/interview.,"Portfolio, Camera, Laptop",2,TRUE,,,,,,,3,TRUE,
|
||||
Dragster,Dragster,2,Individual,Race and Interview,1,two (2) individuals per chapter,Address weights and lengths only; there are no special design challenges.,"Participants design, draw, and construct a CO2-powered dragster that adheres to the annual specifications, design and documentation requirements, and theme. Semifinalists participate in an interview and compete in a double-elimination race.","Dragster, Technical Drawing, Parts and Materials",2,,,,,,,,,,
|
||||
Electrical Applications,Electrical App.,1,Team,Circuit Build and Interview,2,one (1) team of two (2) individuals per chapter,,"Participants take a test on basic electrical and electronic theory. In response to an onsite challenge, semifinalists assemble a specified circuit from a schematic diagram, make required electrical measurements, and explain their solution in an interview.",,2,,TRUE,,,,,,,,
|
||||
Essays on Technology ,Essays on Tech ,1,Individual,Written Essay,1,three (3) individuals per state,"Topic: Reducing our impact on the planet. Subtopics: Reducing microplastics in our oceans, Reducing forever chemicals in soil, Reducing energy consumption for cooling in residential and commercial buildings as temperatures rise","Participants conduct research on specific subtopics from a broad technology area posted as part of the annual theme. Using a previously prepared note card as an approved resource, participants draft an outline of the subtopic randomly selected onsite at the conference. Semifinalists write an essay on that subtopic.",Note Cards,2,,,,,,,,,,
|
||||
Flight,Flight,2,Individual,Constuct and Fly Glider,1,two (2) individuals per chapter,,Participants submit a documentation portfolio and fabricate a glider designed to stay in flight for the greatest elapsed time. Semifinalists use their technical drawing skills to construct a glider that is flown onsite.,"Glider, Portfolio, Eyewear",2,,,,,,,,,,
|
||||
Forensic Technology,Forensic Tech,1,Team,Demonstration,2,one (1) team of two (2) individuals per chapter,"Be familiar with, and be able to demonstrate, the following forensic concepts: Tool mark identification, Hair and fiber analysis , Forensic biometrics",Participants take a test of basic forensic science theory to qualify for the semifinal round of competition. Semifinalists participate in an onsite forensic skills demonstration.,,2,,TRUE,,,,,,3,,Practice Test
|
||||
Inventions & Innovations,I&I,3,Team,Presentation and Interview,3 to 6,one (1) team of three (3) to six (6) individuals per chapter,Create a product that enhances the daily productivity of a middle school student. ,"To address the annual theme, participants research a need - and brainstorm a solution - for an invention or innovation of a device, system, or process. Participants document their work in an interactive display and the creation of a model/prototype. Semifinalists deliver a presentation about their work and participate in an interview.","Display, Prototype",2,,,,,,,,,,
|
||||
Junior Solar Sprint,JSS,2,Team,Race and Interview,2 to 4,one (1) team of two to four (2-4) individuals per chapter,,"Participants apply STEM concepts, creativity, teamwork, and problem-solving skills to design, construct, and race a solar-powered model car. Documentation of the process is required. Learn more about JSS, then register via an Army Educational Outreach Program (AEOP) portal to begin the JSS journey.","Car, Portfolio, Display",2,TRUE,,,,,,,,,
|
||||
Leadership Strategies,Leadership Str.,1,Team,Presentation,3,three (3) teams of three (3) individuals per state,,Participants prepare for and deliver a presentation about a specific challenge that officers of a TSA chapter might encounter. Semifinalists follow the same competition procedure but must respond to a different chapter challenge.,Note Cards,2,,,TRUE,,,,,3,,10:10am-10:20am
|
||||
Mass Production,Mass Production,3,Team,Demonstration and Interview,3 to 6,one (1) team of at least three (3) individuals per chapter,Pet supply storage tower ,"Participants manufacture a marketable product that addresses the annual theme. The development of the product prototype is documented in a portfolio that presents participant knowledge and skills related to the mass production process. Through a demonstration of the prototype and an interview, semifinalists support the viability of the prototype.","Portfolio, Photo Timeline",2,,,,,,,,,,
|
||||
Mechanical Engineering,Mechanical Eng.,3,Team,Race and Interview,2 to 3,one (1) team of two to three (2-3) individuals per chapter,"Problem Statement: A vehicle must go forward at least ten (10) feet, then reverse to a full stop at seven (7) feet from the original starting line. The floor surface for the 2025 National TSA Conference will be convention center concrete. The floor surfaces for state conferences may vary.","Participants design, document, and build a mechanical device (mousetrap car) that incorporates the elements of the annual theme/problem – and then race the car. Finalists are determined based on an evaluation of the documentation portfolio, the race exit interview, and the race placement.","Car, Portfolio, Technical Drawing",2,,,,,,,,,,
|
||||
Medical Technology,Medical Tech,2,Team,Presentation and Interview,3,three (3) teams per state,Medical Drugs and Genetics: Why do some people respond to medicines differently than others?,"Participants conduct research on a contemporary medical technology issue related to the annual theme, document their research, create a display, and build a prototype. Semifinalists deliver a presentation about their entry and participate in an interview.","Display, Prototype",2,,,,,,,,,,
|
||||
Microcontroller Design,Microcontroller,3,Team,Presentation and Interview,1 to 6,one (1) team per chapter; individual entries are permitted,Interactive gift box ,"To address the annual theme/problem, participants design and create a working digital device, document the development process, and demonstrate their product as part of a presentation.","Device, Portfolio",2,,,,,,,,,,
|
||||
Off the Grid,Off the Grid,3,Team,Presentation and Interview,3 to 6,three (3) teams per state; individual entries are permitted,"Design a home for a family of four (4) in a country (of your choice) in which a boreal forest (taiga) biome is found. The house must be designed for an area that does not have access to a power grid. In addition, the house must include a renewable energy source, one (1) agricultural system, and must solve one (1) problem that is specific to the area.","Based on the annual theme, participants conduct research on a sustainable architectural design for a home in a country not their own. Participants produce a portfolio and create a display and a model. Semifinalists present their design and participate in an interview.","Display, Model, Portfolio",2,,,,,,,,,,
|
||||
Prepared Speech,Prepared Speech,2,Individual,Speech,1,three (3) individuals per state,2025 National Conference Theme: Tune into Technology,Participants deliver a timed speech that relates to the theme of the current national TSA conference. Semifinalists and finalists are determined using the same competition procedure.,"Note Cards permitted, memorization is better",2,,,TRUE,,,,,3,TRUE,
|
||||
Problem Solving,Problem Solving,1,Team,Challenge,2,one (1) team of two (2) individuals per chapter,,"Participants use problem-solving skills to design and build a solution to an onsite challenge. Solutions are evaluated using measures appropriate to the challenge, such as elapsed time, horizontal or vertical distance, and/or strength.",Toolkit,1,,,,,,,,,,Practice Prompt
|
||||
Promotional Marketing,Promo Marketing,2,Individual,Challenge,1,one (1) individual per chapter,"Charitable and service organizations are the backbone of our communities. A group called “Students Helping Grandparents” has contacted your chapter advisor about your chapter hosting an event at a public library, during which chapter members will lead focus group discussions with senior citizens. The topic for the focus groups will be helping senior citizens understand and avoid online cybercrime. The event is Tuesday May 27, 2025, from 4:00 PM – 6:00 PM. Printable: Design a tri-fold brochure. Wearable: Design a hat that can be given to participants. Digital Signage: Create an auto-advancing slide presentation that is no longer than two (2) minutes in length.",Participants create and submit a marketing portfolio and required elements that address the annual theme/problem. Semifinalists complete a layout and design assignment for evaluation.,"Advertisement, Design, Digital Signage",2,TRUE,,,,,,,3,TRUE,
|
||||
STEM Animation,STEM Ani.,3,Team,Presentation and Interview,3 to 6,three (3) teams per state,Robotics in automobile manufacturing,Participants design and create a STEM animation video and documentation portfolio to address the annual theme/problem. Semifinalists present their animation and explain the elements of their portfolio/entry.,"Portfolio, Video Link",2,TRUE,,,,,,,,,
|
||||
Structural Engineering,Structural Eng.,2,Team,Challenge,2,one (1) team of two (2) individuals per chapter,,Participants apply the principles of structural engineering to design and construct a structure that complies with the annual challenge. An assessment of the required documentation and the destructive testing of the structure (to determine its design efficiency) determine both semifinalists and finalists.,"Technical 3D drawing, cuts part list of materials",2,,,,,,,,,,
|
||||
System Control Technology,System Control Tech,2,Team,Challenge,3,one (1) team of three (3) individuals per state,,"In response to a challenge presented onsite at the conference, participants analyze a problem (typically one in an industrial setting), build and program a computer-controlled mechanical model to solve the problem, explain the program and the features of the mechanical model solution, and provide instructions for evaluators to operate the device.","Construction Kit, Inventor's Log",2,,,,,,,,,,
|
||||
Tech Bowl,Tech Bowl,1,Team,Test,3,one (1) team of three (3) individuals per chapter,,"Participants demonstrate their knowledge of TSA and concepts addressed in technology content standards by completing an objective test. Semifinalists participate in a head-to-head, team competition.",,2,,TRUE,,,,,,2,,12:30 (Arrive 10 min early)
|
||||
Technical Design,Tech Design,2,Team,Challenge,2,one (1) team of two (2) individuals per chapter,,Participants demonstrate their ability to use the technical design process to solve an engineering design problem provided onsite at the conference. Required elements of the entry are presented in a portfolio that includes technical drawings for a minimum of three viable solutions.,Portfolio incl. Technical Drawings,2,,,,,,,,,,
|
||||
Video Game Design,Video Game,3,Team,Presentation and Interview,2 to 6,One (1) team of two (2) to six (6) individuals per chapter,,"Participants design, build, provide documentation for, and launch an E-rated, online game on a subject of their choice. Onsite at the conference, semifinalists deliver a presentation and participate in an interview to demonstrate the knowledge and expertise gained during the development of the game.","Portfolio, Game Link",2,TRUE,,,,,,,3,TRUE,
|
||||
Vlogging,Vlogging,3,Team,Challenge,2 to 6,two (2) teams of two (2) to six (6) members per chapter,Setting and achieving goals; the minimum number of audio pieces is four (4).,"Participants use digital video technology to create original content about a pre-determined technology theme. Semifinalists compete in an onsite challenge to produce additional video(s) based on specified criteria, such as provided props, lines of dialog, and topics.","Portfolio, Video Link",2,TRUE,,,,,,,3,TRUE,RMS Interview (?)
|
||||
Website Design,Website,3,Team,Presentation and Interview,3 to 6,one (1) team of at least three (3) and a maximum of six (6) individuals per chapter,Topic: Website for food preparation recipes. Challenge – Develop an original website with simple recipes for young cooks (MS and HS age). It should have an interactive element that will ask a few questions to direct the user to the desired ingredients and recipe. ,"To address the annual challenge, participants design, build, provide documentation for, and launch a website that incorporates the elements of website design, graphic layout, and proper coding techniques. Semifinalists participate in an interview to demonstrate the knowledge and expertise gained during the development of the website.","Copyright Checklist, Release Forms, Work Log, Website Link",2,TRUE,,,,,,,3,TRUE,RMS Interview
|
||||
|
@@ -0,0 +1,37 @@
|
||||
Student Name,Grade,TSA year,Officer,State ID,Regional ID,1,2,3,4,5,6,7,TOTAL # OF EVENTS
|
||||
"Abiodun-Adeniyi, Ife",8,2nd,,831177,,Dragster,Junior Solar Sprint,Flight,Mechanical Engineering,Off the Grid,,,5
|
||||
"Alden, Ainsley",5,1st,Sergeant-At-Arms,924213,12227003,Construction Challenge,Off the Grid,Mechanical Engineering,Dragster,Problem Solving,,,5
|
||||
"Blanco, Tavi",7,2nd,,800323,12227005,Off the Grid,Inventions & Innovations,Flight,Structural Engineering,Problem Solving,Tech Bowl,,6
|
||||
"Bolin, Rylan",8,3rd,Secretary,831174,12227006,Structural Engineering,Website Design,Tech Bowl,Flight,Construction Challenge,Junior Solar Sprint,,6
|
||||
"Borboa, Lillian",8,3rd,President,702470,12227007,Promotional Marketing,Children's Stories,STEM animation,Leadership Strategies,Off the Grid,Career Prep,,6
|
||||
"Brady, Tucker",7,2nd,,820332,,Video Game Design,Website Design,Construction Challenge,STEM animation,Flight,,,5
|
||||
"Callaghan, Cole",7,1st,,924305,,Video Game Design,Coding,Problem Solving,STEM animation,,,,4
|
||||
"Carmon, Adaiah",7,2nd,,800328,,STEM Animation,Digital Photography,Video Game Design,Promotional Marketing,CAD Foundations,,,5
|
||||
"Carmon, Isaiah",5,1st,,924210,12227008,Video Game Design,Community Service Video,Coding,Technical Design,Promotional Marketing,CAD foundations,,6
|
||||
"Chesson, Bella",8,1st,,922730,12227009,Off the Grid,Leadership Strategies,Digital Photography,Children's Stories,,,,4
|
||||
"Dean, Lucas",5,1st,,924302,,Video Game Design,Digital Photography,Junior Solar Sprint,Microcontroller Design,Dragster,Coding,,6
|
||||
"Eldridge, AJ ",6,1st,,924310,,Electrical Applications,Tech Bowl,Coding,Structural Engineering,Technical Design,Cybersecurity,,6
|
||||
"Fischer, Avery",6,2nd,,800321,12227011,Structural Engineering,Construction Challenge,Off the Grid,Dragster,Children's Stories,Career Prep,,6
|
||||
"Greear, Ben",8,3rd,Treasurer,712415,12227012,Flight,Structural Engineering,Tech Bowl,Problem Solving,Construction Challenge,,,5
|
||||
"Hermann, Eliam",7,2nd,,831172,12227013,Inventions & Innovations,Prepared Speech ,Leadership Strategies,Video Game Design,System Control Technology,Biotechnology,,6
|
||||
"Jones, Miauna",8,2nd,,800316,12227014,Essays On Technology,Digital Photography,Children's Stories,Off the Grid,,,,4
|
||||
"Kolpack, Grant",7,2nd,,800315,12227015,Children's Stories,STEM animation,Website Design,Leadership Strategies,,,,4
|
||||
"Laney, Wyatt",8,3rd,Vice President,702477,12227016,Structural Engineering,Website Design,Tech Bowl ,Vlogging,Leadership Strategies ,Cybersecurity ,,6
|
||||
"Marx, Ryen",8,2nd,,800320,,Website Design,Construction Challenge,Junior Solar Sprint,Off the Grid,Children's Stories,Mechanical Engineering,,6
|
||||
"McDonald, Raylee",8,2nd,,800317,12227017,Digital Photography,Off the Grid,Medical Technology,Children's Stories,Mechanical Engineering,Construction Challenge,,6
|
||||
"McKee, Ellie",6,1st,,924314,12227018,Off the Grid,Structural Engineering,Construction Challenge,Digital Photography,Biotechnology,Medical Technology,,6
|
||||
"Moulton, Kyle",6,2nd,,800322,12227019,Inventions & Innovations,Mechanical Engineering,Vlogging,Website Design,,,,4
|
||||
"Naeve, Lydia",8,1st,,924208,12227020,Off the Grid,Promotional Marketing,Medical Technology,Forensic Technology,Mechanical Engineering,,,5
|
||||
"Naeve, Suse",6,1st,,924317,12227021,Digital Photography,Off the Grid,Vlogging,Children's Stories,Forensic Technology,Technical Design,,6
|
||||
"Schlesser, Abby",5,1st,,924211,12227022,Children's Stories,Digital Photography,Mass Production,Problem Solving,Inventions & Innovations,Promotional Marketing,,6
|
||||
"Schlesser, David",8,3rd,Reporter,702464,12227023,Dragster,Prepared Speech,Career Prep,Systems Control Technology,Junior Solar Sprint,Mechanical Engineering,Inventions & Innovations,7
|
||||
"Toth, Keegan",8,2nd,,831171,12227024,Inventions & Innovations,Coding,Video Game Design,Prepared Speech,Off the Grid,,,5
|
||||
"Underwood, Ian",8,2nd,,800325,12227025,Leadership Strategies,Inventions & Innovations,Flight,,,,,3
|
||||
"White, Thomas",7,2nd,,800319,12227026,Leadership Strategies,Inventions & Innovations,Challenging Technology Issues,Tech Bowl,Prepared Speech,,,5
|
||||
,,,,,,,,,,,,,
|
||||
,,,,,,,,,,,,,
|
||||
,,,,,,,,,,,,,
|
||||
,,,,,,,,,,,,,
|
||||
,,,,,,,,,,,,,
|
||||
,,,,,,,,,,,,,
|
||||
,,,,,,, ,,,,,,
|
||||
|
@@ -0,0 +1,83 @@
|
||||
Team Name,Event Name,Regional Time Slot,Student 1,Student 2,Student 3,Student 4,Student 5
|
||||
Career Prep,Career Prep,,,,,,
|
||||
"Team Size: 1, Max Teams: 2 (i)","Team Size: 1, Max Teams: 2 (i)",,,,,,
|
||||
Challenging Technology Issues,Challenging Technology Issues,2:30 - 2:45,David Schlesser,Thomas White,,,
|
||||
"Team Size: 2, Max Teams: 2 (a)","Team Size: 2, Max Teams: 2 (a)",,,,,,
|
||||
Children's Stories,Children's Stories,10:00 - 10:15,Lillian Borboa,Miauna Jones,Grant Kolpack,Abby Schlesser,
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
Coding Team 1,Coding Team 1,,Keegan Toth,AJ Eldridge,,,
|
||||
"Team Size: 2, Max Teams: 2 (a)","Team Size: 2, Max Teams: 2 (a)",,,,,,
|
||||
Coding Team 2,Coding Team 2,,Cole Callaghan,Isaiah Carmon,,,
|
||||
"Team Size: 2, Max Teams: 2 (a)","Team Size: 2, Max Teams: 2 (a)",,,,,,
|
||||
Community Service Video,Community Service Video,11:45 - 12:00,Isaiah Carmon,,,,
|
||||
"Team Size: 1-6, Max Teams: 2","Team Size: 1-6, Max Teams: 2",,,,,,
|
||||
CAD foundations,CAD foundations,,,Adaiah Carmon,Grant Kolpack,,
|
||||
"Team Size: 1, Max Teams: 2 (a) (i)","Team Size: 1, Max Teams: 2 (a) (i)",,,,,,
|
||||
Construction Challenge Team 1,Construction Challenge Team 1,,Ryen Marx,Ben Greear,Rylan Bolin,,
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
Construction Challenge Team 2,Construction Challenge Team 2,,Ellie McKee,Avery Fischer,Ainsley Alden,,
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
Digital Photography,Digital Photography,,,Raylee McDonald,Suse Naeve,,
|
||||
"Team Size: 1, Max Teams: 2 (a) (i)","Team Size: 1, Max Teams: 2 (a) (i)",,,,,,
|
||||
Dragster,Dragster,,,David Schlesser,Ife Abiodun-Adeniyi,,
|
||||
"Team Size: 1, Max Teams: 2 (a) (i)","Team Size: 1, Max Teams: 2 (a) (i)",,,,,,
|
||||
Electrical Applications,Electrical Applications,,Rylan Bolin,AJ Eldridge,,,
|
||||
"Team Size: 2, Max Teams: 2 (a)","Team Size: 2, Max Teams: 2 (a)",,,,,,
|
||||
Essays on Technology,Essays on Technology,,,Miauna Jones,,,
|
||||
"Team Size: 1, Max Teams: 2 (a) (i)","Team Size: 1, Max Teams: 2 (a) (i)",,,,,,
|
||||
Flight,Flight,,,Ben Greear,Ife Abiodun-Adeniyi,,
|
||||
"Team Size: 1, Max Teams: 2 (a) (i)","Team Size: 1, Max Teams: 2 (a) (i)",,,,,,
|
||||
Inventions & Innovations Team 1,Inventions & Innovations Team 1,9:45 - 10:00,Kyle Moulton,Keegan Toth,Tavi Blanco,,
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
Inventions & Innovations Team 2,Inventions & Innovations Team 2,9:45 - 10:00,Eliam Hermann,Ian Underwood,Thomas White,,
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
Junior Solar Sprint,Junior Solar Sprint,,David Schlesser,Ife Abiodun-Adeniyi,Ryen Marx,Lucas Dean,
|
||||
"Team Size: 2-4, Max Teams: 2 (a)","Team Size: 2-4, Max Teams: 2 (a)",,,,,,
|
||||
Leadership Strategies Team 1,Leadership Strategies Team 1,10:20 - 10:30,Eliam Hermann,Lillian Borboa,Bella Chesson,,
|
||||
"Team Size: 3, Max Teams: 2","Team Size: 3, Max Teams: 2",,,,,,
|
||||
Leadership Strategies Team 2,Leadership Strategies Team 2,10:10 - 10:20,Thomas White,Ian Underwood,Tavi Blanco,,
|
||||
"Team Size: 3, Max Teams: 2","Team Size: 3, Max Teams: 2",,,,,,
|
||||
Mass Production,Mass Production,,Miauna Jones,Ellie McKee,Abby Schlesser,,
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
Mechanical Engineering Team 1,Mechanical Engineering Team 1,,Raylee McDonald,David Schlesser,Kyle Moulton,,
|
||||
"Team Size: 2-3, Max Teams: 2 (a)","Team Size: 2-3, Max Teams: 2 (a)",,,,,,
|
||||
Mechanical Engineering Team 2,Mechanical Engineering Team 2,,Ryen Marx,Ainsley Alden,,,
|
||||
"Team Size: 2-3, Max Teams: 2 (a)","Team Size: 2-3, Max Teams: 2 (a)",,,,,,
|
||||
Medical Technology,Medical Technology,12:15 - 12:30,Lydia Naeve,Raylee McDonald,Bella Chesson,,
|
||||
"Team Size: 3, Max Teams: 2 (a)","Team Size: 3, Max Teams: 2 (a)",,,,,,
|
||||
Microcontroller Design,Microcontroller Design,,Lucas Dean,Isaiah Carmon,,,
|
||||
"Team Size: 1-6, Max Teams: 2 (a)","Team Size: 1-6, Max Teams: 2 (a)",,,,,,
|
||||
Off the Grid Team 1,Off the Grid Team 1,12:00 - 12:15,Avery Fischer,Miauna Jones,Bella Chesson,Suse Naeve,
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
Off the Grid Team 2,Off the Grid Team 2,10:45 - 11:00,Ainsley Alden,Raylee McDonald,Lydia Naeve,Tavi Blanco,Ellie McKee
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
Prepared Speech,Prepared Speech,,,Keegan Toth,Eliam Hermann,,
|
||||
"Team Size: 1, Max Teams: 2 (a) (i)","Team Size: 1, Max Teams: 2 (a) (i)",,,,,,
|
||||
Problem Solving,Problem Solving,,Ben Greear,Abby Schlesser,,,
|
||||
"Team Size: 2, Max Teams: 1 (a)","Team Size: 2, Max Teams: 1 (a)",,,,,,
|
||||
Promotional Marketing,Promotional Marketing,,,Lillian Borboa,Lydia Naeve,,
|
||||
"Team Size: 1, Max Teams: 2 (a) (i)","Team Size: 1, Max Teams: 2 (a) (i)",,,,,,
|
||||
STEM Animation,STEM Animation,,Grant Kolpack,Lillian Borboa,Adaiah Carmon,Cole Callaghan,
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
Structural Engineering Team 1,Structural Engineering Team 1,,Ben Greear,Avery Fischer,,,
|
||||
"Team Size: 2, Max Teams: 2 (a)","Team Size: 2, Max Teams: 2 (a)",,,,,,
|
||||
Structural Engineering Team 2,Structural Engineering Team 2,,Rylan Bolin,Wyatt Laney,,,
|
||||
"Team Size: 2, Max Teams: 2 (a)","Team Size: 2, Max Teams: 2 (a)",,,,,,
|
||||
System Control Technology,System Control Technology,,Eliam Hermann,David Schlesser,Tucker Brady,,
|
||||
"Team Size: 3, Max Teams: 2 (a)","Team Size: 3, Max Teams: 2 (a)",,,,,,
|
||||
Tech Bowl Team 1,Tech Bowl Team 1,11:00,Ben Greear,Rylan Bolin,Wyatt Laney,,
|
||||
"Team Size: 3, Max Teams: 2 (a)","Team Size: 3, Max Teams: 2 (a)",,,,,,
|
||||
Tech Bowl Team 2,Tech Bowl Team 2,11:40,Thomas White,Ian Underwood,Grant Kolpack,,
|
||||
"Team Size: 3, Max Teams: 2 (a)","Team Size: 3, Max Teams: 2 (a)",,,,,,
|
||||
Video Game Design Team 1,Video Game Design Team 1,,Keegan Toth,Adaiah Carmon,Lucas Dean,,
|
||||
"Team Size: 2-6, Max Teams: 2","Team Size: 2-6, Max Teams: 2",,,,,,
|
||||
Video Game Design Team 2,Video Game Design Team 2,,Tucker Brady,Eliam Hermann,Cole Callaghan,Isaiah Carmon,
|
||||
"Team Size: 2-6, Max Teams: 2","Team Size: 2-6, Max Teams: 2",,,,,,
|
||||
Vlogging,Vlogging,10:15 - 10:30,Wyatt Laney,Kyle Moulton,Suse Naeve,,
|
||||
"Team Size: 2-6, Max Teams: 2 (a)","Team Size: 2-6, Max Teams: 2 (a)",,,,,,
|
||||
Website Design Team 1,Website Design Team 1,,Rylan Bolin,Wyatt Laney,Tucker Brady,,
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
Website Design Team 2,Website Design Team 2,,Grant Kolpack,Ryen Marx,AJ Eldridge,,
|
||||
"Team Size: 3-6, Max Teams: 2","Team Size: 3-6, Max Teams: 2",,,,,,
|
||||
(a) denotes an event that has activity other than interview or presentation at state,,,,,,,
|
||||
(i) denotes an individual event,,,,,,,
|
||||
|
@@ -0,0 +1,399 @@
|
||||
Animatronics – HS
|
||||
Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Presentations March 7 10:30 a.m. – NOON Mtg. Room 7
|
||||
Architectural Design – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Submit Model March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 10:00 a.m. – 12:30 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4:00 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Audio Podcasting – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Time Sign-Up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations March 7 12:30 p.m. - 3 p.m. Mtg. Room 7
|
||||
Biotechnology – MS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 10 a.m. – 10:30 a.m. Exhibit Hall C
|
||||
Pick-up March 8 4:00 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Biotechnology Design – HS
|
||||
Submit Entry March 7 8 a.m. – 9:00 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 11 a.m. – 1:30 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4:00 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Board Game Design – HS
|
||||
Submit Entry March 7 8 a.m. – 9:00 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 NOON - 2:30 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4:00 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
CAD Foundations – MS
|
||||
Setup, Event, & Interviews March 7 2:30 p.m. – 5 p.m. Mtg. Room 6
|
||||
Career Prep – MS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews March 7 11:00 a.m. – 12:30 p.m. Mtg. Room 2
|
||||
Challenging Technology Issues – MS
|
||||
Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Presentation – Holding Room March 7 10:30 a.m. – NOON Mtg. Room 9
|
||||
Presentation – Presentation March 7 10:45 a.m. – 12:15 p.m. Mtg. Room 10
|
||||
Chapter Team – HS
|
||||
Preliminary Exam Opens February 12 8 a.m. Online
|
||||
Preliminary Exam Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations March 7 10:30 a.m. – 11:00 a.m. Mtg. Room 13
|
||||
Chapter Team – MS
|
||||
Preliminary Exam Opens February 12 8 a.m. Online
|
||||
Preliminary Exam Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations March 7 11:30 a.m. – 12:30 p.m. Mtg. Room 13
|
||||
Children’s Stories – HS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Pick-up (Semifinalists only) March 8 10 a.m. – 1:30 p.m. Exhibit Hall C
|
||||
Semifinalist Reading/Interviews March 8 10:00 a.m. – 1:30 p.m. Mtg. Room 8
|
||||
Pick-up (everyone) March 8 4 p.m. - 4:30 p.m. Exhibit Hall C
|
||||
Children’s Stories – MS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Pick-up (Semifinalists only) March 8 9 a.m. – 11 a.m. Exhibit Hall C
|
||||
Semifinalist Reading/Interviews March 8 9:30 a.m. –11:30 a.m. Mtg. Room 2
|
||||
Pick-up (everyone) March 8 4 p.m. - 4:30 p.m. Exhibit Hall C
|
||||
Coding – HS
|
||||
Preliminary Exam Opens February 12 8 a.m. Online
|
||||
Preliminary Exam Closes February 18 11:59 p.m. Online
|
||||
On-Site Event March 8 9:30 a.m. – 12 p.m. Mtg. Room 4
|
||||
Coding – MS
|
||||
Preliminary Exam Opens February 12 8 a.m. Online
|
||||
Preliminary Exam Closes February 18 11:59 p.m. Online
|
||||
Event & Judging March 8 2 p.m. – 4:30 p.m. Mtg. Room 4
|
||||
Community Service Video – MS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations March 7 12:30 p.m. - 1:30 p.m. Mtg. Room 15
|
||||
Computer-Aided Design (CAD), Architecture – HS
|
||||
Setup, Event, & Judging March 7 10:30 a.m. – 4 p.m. Mtg. Room 4
|
||||
Computer-Aided Design (CAD), Engineering – HS
|
||||
Setup, Event, & Judging March 7 10:30 a.m. – 4 p.m. Mtg. Room 4
|
||||
Construction Challenge – MS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 11:30 a.m. – 12:30 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Cybersecurity – MS
|
||||
Preliminary Exam Opens February 12 8 a.m. Online
|
||||
Preliminary Exam Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations March 8 9:30 a.m. – 10:30 a.m. Mtg. Room 7
|
||||
Data Science and Analytics – MS
|
||||
Presentation Time Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Presentations March 7 3 p.m. – 3:30 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Preparation March 8 3 p.m. – 4:30 p.m. Mtg. Room 5
|
||||
Semifinalist Presentations March 8 3 p.m. – 4:30 p.m. Mtg. Room 6
|
||||
Pick-up March 8 4:00 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Data Science and Analytics – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Presentation Time Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Presentations March 7 10:30 a.m. – 3:30 p.m. Mtg. Room 5
|
||||
Live Challenge March 8 2:30 p.m. - 4:30 p.m. Mtg. Room 8
|
||||
Debating Technological Issues – HS
|
||||
Pre-Debate Meeting March 7 12:30 p.m. – 1:00 p.m. Mtg. Room 9
|
||||
Debate Holding Room March 7 1:00 p.m. – 5:00 p.m. Mtg. Room 9
|
||||
Debate Presentation March 7 1:15 p.m. – 5:15 p.m. Mtg. Room 10
|
||||
Digital Photography – MS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Setup, Onsite Problem March 8 10 a.m. – 1:00 p.m. Mtg. Room 15
|
||||
Semifinalist Time Sign-Up March 8 10 a.m. - 1:00 p.m. Mtg. Room 15
|
||||
Semifinalist Interviews March 8 1:30 p.m. - 3 p.m. Mtg. Room 15
|
||||
Digital Video Production – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-Up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews March 7 1 p.m. - 2:30 p.m. Mtg. Room 2
|
||||
Dragster – MS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Time Trials March 7 10 a.m. – 11 a.m. Exhibit Hall C
|
||||
Semifinalist Interview Sign-ups March 7 NOON – 12:15 p.m. Exhibit Hall C
|
||||
Semifinalist Interviews March 7 12:30 p.m. – 1:30 p.m. Exhibit Hall C
|
||||
Semifinalist Races March 7 2:30 p.m. – 3 p.m. Exhibit Hall C
|
||||
Pick-up March 7 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Dragster Design – HS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Time Trials March 7 10 a.m. – 11 a.m. Exhibit Hall C
|
||||
Semifinalist Interview Sign-ups March 7 NOON – 12:15 p.m. Exhibit Hall C
|
||||
Semifinalist Interviews March 7 12:30 p.m. – 1:30 p.m. Exhibit Hall C
|
||||
Semifinalist Races March 7 3 p.m. – 4 p.m. Exhibit Hall C
|
||||
Pick-up March 7 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Drone Challenge (UAV) – HS
|
||||
Team Set-Up March 7 1:30 p.m. - 1:45 p.m. Exhibit Hall D
|
||||
Safety Check March 7 1:45 p.m. - 2:15 p.m. Exhibit Hall D
|
||||
Timed Challenge March 7 2:15 p.m. - 3:30 p.m. Exhibit Hall D
|
||||
Interviews March 7 3:45 p.m. - 4:30 p.m. Exhibit Hall D
|
||||
Electrical Applications – MS
|
||||
Preliminary Exam Opens February 12 8 a.m. Online
|
||||
Preliminary Exam Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Onsite Problem March 8 12:30 p.m. – 1:30 p.m. Mtg. Room 4
|
||||
Engineering Design - HS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 1 p.m. – 3:30 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Essays on Technology – HS
|
||||
Writing March 7 10:30 a.m. – 12:30 p.m. Mtg. Room 5
|
||||
Judging March 7 12:30 a.m. – 5 p.m. CRC
|
||||
Essays on Technology – MS
|
||||
Preliminaries March 7 10:30 a.m. – 11:30 a.m. Mtg. Room 5
|
||||
Judging March 7 10:45 a.m. – 5 p.m. CRC
|
||||
Semifinalist Writing March 8 3 p.m. – 4:30 p.m. Mtg. Room 9
|
||||
Extemporaneous Speech – HS
|
||||
Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Speech – Preparation March 8 9:30 a.m. – 1 p.m. Mtg. Room 9
|
||||
Speech – Presentations March 8 9:30 a.m. – 1 p.m. Mtg. Room 10
|
||||
Fashion Design and Technology – HS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. – 7 p.m. Online
|
||||
Pick-up (Semifinalists only) March 8 10:30 a.m. – 1:00 p.m. Exhibit Hall C
|
||||
Semifinalist Presentations/Interviews March 8 10:30 a.m. – 1 p.m. Mtg. Room 7
|
||||
Pick-up (Everyone) March 8 4 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Flight – MS
|
||||
Submit Entry & Sign-up March 7 8 a.m. – 9 a.m. Exhibit Hall D
|
||||
Preliminary Round Testing March 7 10 a.m. – 10:30 a.m. Exhibit Hall D
|
||||
Semifinalist Construction and Flights March 7 1 p.m. – 3:30 p.m. Exhibit Hall D
|
||||
All event materials picked up March 7 4 p.m. – 4:30 p.m. Exhibit Hall D
|
||||
Flight Endurance – HS
|
||||
Submit Entry for Impound March 7 8 a.m. – 9 a.m. Exhibit Hall D
|
||||
Pilot’s Meeting March 7 10:30 a.m. – 11 a.m. Exhibit Hall D
|
||||
Flights March 7 11 a.m. – 12:30 p.m. Exhibit Hall D
|
||||
Forensic Science – HS
|
||||
Preliminary Exam Opens February 12 8 a.m. Online
|
||||
Preliminary Exam Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Onsite Problem March 8 9:30 a.m. – 2:30 p.m. Mtg. Room 5
|
||||
Semifinalist Onsite Written Analysis March 8 9:50 a.m. – 2:50 p.m. Mtg. Room 6
|
||||
Forensic Technology – MS
|
||||
Preliminary Exam Opens February 12 8 a.m. Online
|
||||
Preliminary Exam Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 7 6 p.m. – 7 p.m. Online
|
||||
Semifinalist Presentations March 8 NOON – 2 p.m. Mtg. Room 2
|
||||
Future Technology and Engineering Teacher – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations March 7 1 p.m. - 4 p.m. Mtg. Room 13
|
||||
Geospatial Technology – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Display Drop Off March 7 8 a.m - 9 a.m. Exhibit Hall C
|
||||
Presentation Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Presentations/Interviews March 8 3 p.m. - 5 p.m. Mtg. Room 10
|
||||
Inventions and Innovations – MS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 10:30 a.m. – 11:30 a.m. Exhibit Hall C
|
||||
Pick-up March 8 4:00 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Junior Solar Sprint – MS
|
||||
Submit Entry March 7 8 a.m. - 9 a.m. Exhibit Hall D
|
||||
Judging March 7 9 a.m. - 2 p.m. Exhibit Hall D
|
||||
Races March 8 9:30 a.m. - 11:30 a.m. Exhibit Hall D
|
||||
Leadership Strategies – MS
|
||||
Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Presentation - Holding Room March 8 1:30 p.m. – 2:30 p.m. Mtg. Room 9
|
||||
Presentation - Delivery March 8 1:30 p.m. – 2:30 p.m. Mtg. Room 10
|
||||
Manufacturing Prototype – HS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Sales Pitches March 8 2 p.m. – 3:30 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Mass Production – MS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 NOON – 1 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Mechanical Engineering – MS
|
||||
Submit Entry & Sign-up March 7 8 a.m. – 9 a.m. Exhibit Hall D
|
||||
Car Trials March 7 10 a.m. - 11 a.m. Exhibit Hall D
|
||||
Pick-up March 8 4:00 p.m. – 4:30 p.m. Exhibit Hall D
|
||||
Medical Technology – MS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 12:30 p.m. – 1:30 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Microcontroller Design – MS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 1:30 p.m. – 2 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4:00 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Music Production – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews March 8 2:30 p.m. – 5 p.m. Mtg. Room 2
|
||||
Off the Grid – MS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews March 8 2 p.m. – 3 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
On Demand Video – HS
|
||||
Orientation & Prompt March 7 1:00 p.m. – 1:30 p.m. Mtg. Room 6
|
||||
Submission Deadline March 8 2:30 p.m. Online Submission
|
||||
Judging March 8 2:30 p.m. – 6 p.m. CRC
|
||||
Photographic Technology – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
24-Hour Challenge Prompt Release March 7 11 a.m. Online
|
||||
(Semifinalists only)
|
||||
24-Hour Challenge Due March 8 11 a.m. Online
|
||||
Semifinalist Interviews March 8 2:00 p.m. – 4:30 p.m. Mtg. Room 13
|
||||
Prepared Presentation – HS
|
||||
Sign-up March 7 6 p.m. - 7 p.m. Online
|
||||
Presentations March 8 2 p.m. – 5 p.m. Mtg. Room 7
|
||||
Prepared Speech – MS
|
||||
Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Speeches March 7 4 p.m. – 5 p.m. Mtg. Room 5
|
||||
Problem Solving – MS
|
||||
Peer Kit Check March 8 NOON – 12:30 p.m. Exhibit Hall D
|
||||
Onsite Problem March 8 12:30 p.m. – 3:00 p.m. Exhibit Hall D
|
||||
Promotional Design – HS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – NOON CRC
|
||||
Semifinalist Set-up & Onsite Problem March 7 2:30 p.m. – 5 p.m. Mtg. Room 14
|
||||
Promotional Marketing – MS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Set-up & Onsite Problem March 7 10:30 a.m. – NOON Mtg. Room 14
|
||||
Senior Solar Sprint – HS
|
||||
Submit Entry March 7 8 a.m. - 9 a.m. Exhibit Hall D
|
||||
Judging March 7 9 a.m. - 2 p.m. Exhibit Hall D
|
||||
Races March 8 9:30 a.m. - 11:30 a.m. Exhibit Hall D
|
||||
Software Development – HS
|
||||
Presentation Sign-Up March 6 6 p.m. - 7 p.m. Online
|
||||
Presentations March 7 1 p.m. – 3 p.m. Mtg. Room 3
|
||||
STEM Animation – MS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 6 6 p.m. – 7 p.m. Online
|
||||
Semifinalist Presentations March 7 3:30 p.m. – 4:30 p.m. Mtg. Room 5
|
||||
STEM Mass Media – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Press Conference March 7 11:30 a.m. - 12:30 p.m. Mtg. Room 8
|
||||
Print Journalism Piece Submission Opens March 7 12:30 p.m. Online
|
||||
Print Journalism Piece Submission Closes March 8 12:30 p.m Online
|
||||
Structural Design and Engineering – HS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Pre-built Testing March 7 TBD Exhibit Hall C
|
||||
Semifinalist Build March 8 9 a.m. – NOON Exhibit Hall C
|
||||
Semifinalist Testing March 8 3 p.m. – 3:30 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4:00 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Structural Engineering – MS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Pre-built Testing March 7 TBD Exhibit Hall C
|
||||
Semifinalist Build March 8 9 a.m. – NOON Exhibit Hall C
|
||||
Semifinalist Testing March 8 3:30 p.m. – 4:00 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4:30 p.m. – 5 p.m. Exhibit Hall C
|
||||
System Control Technology HS
|
||||
Set-up, Performance, and Judging March 7 1 p.m. – 4:30 p.m. Mtg. Room 8
|
||||
System Control Technology – MS
|
||||
Set-up, Performance, and Judging March 7 1 p.m. – 4:30 p.m. Mtg. Room 8
|
||||
Tech Bowl – MS
|
||||
Preliminary Exam Opens February 12 8 a.m. Online
|
||||
Preliminary Exam Closes February 18 11:59 p.m. Online
|
||||
Bracket Released March 7 6 p.m. Online
|
||||
Semifinalist - Holding March 8 9:30 a.m. – NOON Mtg. Room 3
|
||||
Semifinalist – Orals March 8 9:30 a.m. – NOON Banquet Hall
|
||||
Technical Design – MS
|
||||
Prompt Release March 7 10 a.m. Online
|
||||
Solution Submit March 8 9 a.m. – 10 a.m. Meeting Room 11
|
||||
Judging March 8 10 a.m. – 2 p.m. CRC
|
||||
Technology Bowl - HS
|
||||
Preliminary Exam Opens February 12 8 a.m. Online
|
||||
Preliminary Exam Closes February 18 11:59 p.m. Online
|
||||
Bracket Released March 7 5 p.m. Online
|
||||
Semifinalist – Holding March 8 NOON - 5 p.m. Mtg. Room 3
|
||||
Semifinalist – Orals March 8 NOON – 5 p.m. Banquet Hall
|
||||
Technology Problem Solving – HS
|
||||
Kit Check March 8 NOON – 12:30 p.m. Exhibit Hall D
|
||||
Onsite Problem March 8 12:30 p.m. – 3:00 p.m. Exhibit Hall D
|
||||
Transportation Modeling – HS
|
||||
Submit Entry March 7 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Time Sign-Up March 7 6 p.m. - 7 p.m. Online
|
||||
Interviews March 8 2:30 p.m. - 3:30 p.m. Exhibit Hall C
|
||||
Pick-up March 8 4 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
VEX IQ Robotics – MS
|
||||
Schedule Posted on RobotEvents.com
|
||||
Inspection/Note Turn-in/Interview Sign-Up March 7 1 p.m. - 5 p.m. Exhibit Hall C
|
||||
Fields Open for Practice March 7 1 p.m. - 5 p.m. Exhibit Hall C
|
||||
Skills Challenge / Interviews March 8 9 a.m. - 11 a.m. Exhibit Hall C
|
||||
Teamwork Challenge March 8 11 a.m.-12 p.m. Exhibit Hall C
|
||||
VEX VRC Robotics – HS
|
||||
Schedule Posted on RobotEvents.com
|
||||
Inspection/Note Turn-in/Interview Sign-Up March 7 12 p.m. - 5 p.m. Exhibit Hall C
|
||||
Fields Open for Practice March 7 12 p.m. - 3 p.m. Exhibit Hall C
|
||||
Skills Challenge / Interviews March 8 9:30 a.m. - 12:30 p.m. Exhibit Hall C
|
||||
Alliance Selection March 8 1:30 p.m. - 2 p.m. Exhibit Hall C
|
||||
Elimination Tournament March 8 2:30 p.m. - 5 p.m. Exhibit Hall C
|
||||
Video Game Design – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews March 7 3 p.m. - 5 p.m. Mtg. Room 2
|
||||
Video Game Design – MS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews March 7 11 a.m. – 12:30 p.m. Mtg. Room 3
|
||||
Virtual Reality Visualization (VR) – HS
|
||||
Submit Entry March 7 8 a.m. - 9 a.m. Exhibit Hall C
|
||||
Judging March 7 9 a.m. – 3 p.m. CRC
|
||||
Semifinalist Interviews March 7 4 p.m. – 5 p.m. Mtg. Room 15
|
||||
Vlogging – MS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Orientation Meeting March 7 12:30 p.m. - 1 p.m. Mtg. Room 14
|
||||
Semifinalist Submission Opens March 7 1:30 p.m. Online
|
||||
Semifinalist Submission Closes March 8 1:30 p.m. Online
|
||||
Webmaster – HS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews March 7 3:30 p.m. – 5:30 p.m. Mtg. Room 7
|
||||
Website Design – MS
|
||||
Pre-Conference Submission Opens February 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes February 18 11:59 p.m. Online
|
||||
Semifinalist Sign-up March 6 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews March 7 10:30 a.m. – NOON Mtg. Room 15
|
||||
|
||||
General Session
|
||||
General Session 1: Opening Session March 7 9:00 a.m. - 10:00 a.m. Exhibit Hall A
|
||||
General Session 2: Business Session March 8 8:00 a.m. - 8:45 a.m. Exhibit Hall A
|
||||
General Session 3: Awards Ceremony March 9 8:30 a.m. - 11:30 a.m. Exhibit Hall A
|
||||
|
||||
Voting Delegates
|
||||
Business Meeting Tutorial - led by TNTSA Alumni March 7 12:30 p.m. - 1:15 p.m. Exhibit Hall
|
||||
Meet the Candidates Session 1 March 7 1:30 p.m. - 2:30 p.m. Exhibit Hall
|
||||
Meet the Candidates Session 2 March 7 4:30 p.m. - 5:30 p.m. Exhibit Hall
|
||||
Voting Delegates Meeting March 8 7:00 a.m. - 7:45 a.m. Exhibit Hall
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
Event,Short Name,Level of Effort,Format,Semifinalist Activity,Team Size,Eligibility,Theme,Description,Documentation,State Count,State Presubmission,State Pretesting,State Preliminary Round,State Submit Entry,State Time Semifinalist Sign-up,State Time Semifinalist Presentations/Interviews,State Time Pick-up,Regional Count,Regional Presubmission,Regional Notes
|
||||
Biotechnology,Biotech,2,Team,Interview (3 Team Members),2 to 6,five (5) teams per state,Biotechnology that supports sustainable cosmetics packaging to reduce waste to landfills,"To address the annual theme, participants select a contemporary biotechnology issue and demonstrate understanding of the topic through their documented research and an original display. Semifinalists participate in an interview.",Portfolio,2,,,,,,,,,,
|
||||
Career Prep,Career Prep,1,Individual,Interview,1,one (1) individual per chapter,"Theme: Select a career from one (1) of the following: Bioenergy Technicians, Data Architect, Machine Learning Engineer, Nurse Practitioner","Based on the annual theme, participants conduct research on a technology-related career, prepare a letter of introduction to a potential employer, and develop a job-specific resume. Semifinalists participate in a mock job interview.","Cover Letter, Resume",2,TRUE,,,,,,,3,TRUE,12:50pm-1:00pm
|
||||
Challenging Technology Issues,Chlg. Tech Issues,1,Team,Debate Presentation,2,three (3) teams of two (2) individuals per state,"Topics:, Genetic Testing and Counseling, Animal Testing for Scientific Research, The Use of Drones for Surveillance, Privatization of Space Travel, Nanotechnology in Consumer Goods","Following the onsite random selection of a technology topic from a group of pre-conference posted topics, participants work to prepare for and deliver a debate-style presentation, in which they explain opposing views of the selected topic.",Note Cards,2,,,TRUE,,,,,3,,"Competition, Video due by Noon"
|
||||
Chapter Team,Chapter Team,,Team,Ceremony,6,one (1) team of six (6) individuals per chapter,,"Participants take a parliamentary procedure test to qualify for the semifinal round of competition. Semifinalists conduct an opening ceremony, items of business, parliamentary actions, and a closing ceremony.",,2,,TRUE,,,,,,,,Practice
|
||||
Children's Stories,Children's Stories,3,Team,Interview (2 Team Members),3 to 6,three (3) teams per state; individual entries are permitted,An interactive or pop-up book that focuses on making friends in-person,"Participants create an illustrated children’s story based on the annual theme. The entry product is a physical storybook of artistic, instructional, and social value. Semifinalists read their story aloud and participate in an interview.","Portfolio, Book",2,,,,,,,,3,TRUE,RMS Interview
|
||||
Coding,Coding,2,Team,Challenge,2,one (1) team of two (2) individuals per chapter,"To prepare for MS Coding competition, teams should have knowledge of concepts (software development, computer science, and coding topics) that will be on the Coding written test. They also should be familiar and comfortable with using the Scratch programming language. , , Scratch is a free visual programming language available from the MIT Media Lab (https://scratch.mit.edu/download). An offline version of the Scratch tool should be downloaded and available on each team’s laptop. , , Teams that advance to the semifinalist level, based on written test performance, will perform a challenge using the Scratch programming language. Semifinalist teams will receive the challenge on site and will have two hours to complete it. (PLEASE NOTE: Semifinalist teams MUST have a version of this program available for offline use, as there will be no Internet access available during the semifinalist level of the competition.) , , Examples of the types of challenges students may be asked to complete can be found at this link: https://scratch.mit.edu/starter-projects","To qualify for the semifinal round of competition, participants take a test that concentrates on computer science and coding. Semifinalists demonstrate their programming knowledge by developing a solution to an onsite coding challenge.",,2,,TRUE,,,,,,,,
|
||||
Community Service Video,Comm. Service Vid,2,Team,Presentation and Interview,1 to 6,one (1) team per chapter; individual entries are permitted,,Participants create a video that depicts the local TSA chapter’s involvement in a community service project. Semifinalists deliver a presentation on the project and participate in an interview.,"Copyright Checklist, Release Forms, Video Link",2,TRUE,,,,,,,3,TRUE,RMS Interview
|
||||
CAD foundations,CAD,1,Individual,Challenge,1,two (2) individuals per state,,Participants demonstrate their understanding of CAD fundamentals by creating a two-dimensional (2D) graphic representation of an engineering part or object and answering questions from evaluators about their entry.,Laptop w/CAD Software,2,,,,,,,,,,
|
||||
Construction Challenge,Construction Chlg.,3,Team,Presentation and Interview (2-4 Team Members),3 to 6,one (1) team of at least two (2) individuals per chapter,,"Participants submit a scale model, display, and documentation portfolio for a design that fulfills a community need related to construction. Semifinalists deliver a presentation about their entry and participate in an interview.","Prototype, Display, Portfolio",2,,,,,,,,,,
|
||||
Cybersecurity,Cybersecurity,2,Individual,Presentation,1,three (3) individuals per chapter,Problem Statement: Byte Inc.'s Internet of things and Bluetooth are acting strangely on devices in the company’s network. Address the potential cause and propose a solution.,"Participants take a test that assesses knowledge of cybersecurity vocabulary and the skills needed to execute common cybersecurity tasks. Using digital presentation software, semifinalists deliver a presentation that addresses the annual theme/problem.",Presentation,2,,TRUE,,,,,,,,Practice
|
||||
Data Science & Analytics,Data Sci.,2,Team,Challenge and Presentation,2 to 3,three (3) teams of two to three (2-3) individuals per state,"Determine the potential ""movie success"" of a fictitious feature film based on different public metrics, such as, but not limited to box office revenue, date of release, movie genre (selected by the team), movie production budget, and more.","Participants conduct research on the annual topic, collect data, use analytics to assess the data and make predictions, and document their work in a portfolio and a display. To address a challenge presented onsite at the conference, semifinalists review specific data sets, provide insights, make predictions, and present their findings for evaluation.",Display,2,,,,,,,,,,
|
||||
Digital Photography,Digital Photography,2,Individual,Onsite Photography and Presentation,1,three (3) individuals per state,Students will take four photographs that fit the theme “Through the Eye of an Animal.”,Participants produce and submit a digital photographic portfolio that relates to the annual theme. Semifinalists participate in an onsite photographic challenge and a presentation/interview.,"Portfolio, Camera, Laptop",2,TRUE,,,,,,,3,TRUE,
|
||||
Dragster,Dragster,2,Individual,Race and Interview,1,two (2) individuals per chapter,Address weights and lengths only; there are no special design challenges.,"Participants design, draw, and construct a CO2-powered dragster that adheres to the annual specifications, design and documentation requirements, and theme. Semifinalists participate in an interview and compete in a double-elimination race.","Dragster, Technical Drawing, Parts and Materials",2,,,,,,,,,,
|
||||
Electrical Applications,Electrical App.,1,Team,Circuit Build and Interview,2,one (1) team of two (2) individuals per chapter,,"Participants take a test on basic electrical and electronic theory. In response to an onsite challenge, semifinalists assemble a specified circuit from a schematic diagram, make required electrical measurements, and explain their solution in an interview.",,2,,TRUE,,,,,,,,
|
||||
Essays on Technology ,Essays on Tech ,1,Individual,Written Essay,1,three (3) individuals per state,"Topic: Reducing our impact on the planet. Subtopics: Reducing microplastics in our oceans, Reducing forever chemicals in soil, Reducing energy consumption for cooling in residential and commercial buildings as temperatures rise","Participants conduct research on specific subtopics from a broad technology area posted as part of the annual theme. Using a previously prepared note card as an approved resource, participants draft an outline of the subtopic randomly selected onsite at the conference. Semifinalists write an essay on that subtopic.",Note Cards,2,,,,,,,,,,
|
||||
Flight,Flight,2,Individual,Constuct and Fly Glider,1,two (2) individuals per chapter,,Participants submit a documentation portfolio and fabricate a glider designed to stay in flight for the greatest elapsed time. Semifinalists use their technical drawing skills to construct a glider that is flown onsite.,"Glider, Portfolio, Eyewear",2,,,,,,,,,,
|
||||
Forensic Technology,Forensic Tech,1,Team,Demonstration,2,one (1) team of two (2) individuals per chapter,"Be familiar with, and be able to demonstrate, the following forensic concepts: Tool mark identification, Hair and fiber analysis , Forensic biometrics",Participants take a test of basic forensic science theory to qualify for the semifinal round of competition. Semifinalists participate in an onsite forensic skills demonstration.,,2,,TRUE,,,,,,3,,Practice Test
|
||||
Inventions & Innovations,I&I,3,Team,Presentation and Interview (2 Team Members),3 to 6,one (1) team of three (3) to six (6) individuals per chapter,Create a product that enhances the daily productivity of a middle school student. ,"To address the annual theme, participants research a need - and brainstorm a solution - for an invention or innovation of a device, system, or process. Participants document their work in an interactive display and the creation of a model/prototype. Semifinalists deliver a presentation about their work and participate in an interview.","Display, Prototype",2,,,,,,,,,,
|
||||
Junior Solar Sprint,JSS,2,Team,Race and Interview,2 to 4,one (1) team of two to four (2-4) individuals per chapter,,"Participants apply STEM concepts, creativity, teamwork, and problem-solving skills to design, construct, and race a solar-powered model car. Documentation of the process is required. Learn more about JSS, then register via an Army Educational Outreach Program (AEOP) portal to begin the JSS journey.","Car, Portfolio, Display",2,TRUE,,,,,,,,,
|
||||
Leadership Strategies,Leadership Str.,1,Team,Presentation,3,three (3) teams of three (3) individuals per state,,Participants prepare for and deliver a presentation about a specific challenge that officers of a TSA chapter might encounter. Semifinalists follow the same competition procedure but must respond to a different chapter challenge.,Note Cards,2,,,TRUE,,,,,3,,10:10am-10:20am
|
||||
Mass Production,Mass Production,3,Team,Demonstration and Interview (2 Team Members),3 to 6,one (1) team of at least three (3) individuals per chapter,Pet supply storage tower ,"Participants manufacture a marketable product that addresses the annual theme. The development of the product prototype is documented in a portfolio that presents participant knowledge and skills related to the mass production process. Through a demonstration of the prototype and an interview, semifinalists support the viability of the prototype.","Portfolio, Photo Timeline",2,,,,,,,,,,
|
||||
Mechanical Engineering,Mechanical Eng.,3,Team,Race and Interview,2 to 3,one (1) team of two to three (2-3) individuals per chapter,"Problem Statement: A vehicle must go forward at least ten (10) feet, then reverse to a full stop at seven (7) feet from the original starting line. The floor surface for the 2025 National TSA Conference will be convention center concrete. The floor surfaces for state conferences may vary.","Participants design, document, and build a mechanical device (mousetrap car) that incorporates the elements of the annual theme/problem – and then race the car. Finalists are determined based on an evaluation of the documentation portfolio, the race exit interview, and the race placement.","Car, Portfolio, Technical Drawing",2,,,,,,,,,,
|
||||
Medical Technology,Medical Tech,2,Team,Presentation and Interview (3 Team Members),3,three (3) teams per state,Medical Drugs and Genetics: Why do some people respond to medicines differently than others?,"Participants conduct research on a contemporary medical technology issue related to the annual theme, document their research, create a display, and build a prototype. Semifinalists deliver a presentation about their entry and participate in an interview.","Display, Prototype",2,,,,,,,,,,
|
||||
Microcontroller Design,Microcontroller,3,Team,Presentation and Interview,1 to 6,one (1) team per chapter; individual entries are permitted,Interactive gift box ,"To address the annual theme/problem, participants design and create a working digital device, document the development process, and demonstrate their product as part of a presentation.","Device, Portfolio",2,,,,,,,,,,
|
||||
Off the Grid,Off the Grid,3,Team,Presentation and Interview (2 Team Members),3 to 6,three (3) teams per state; individual entries are permitted,"Design a home for a family of four (4) in a country (of your choice) in which a boreal forest (taiga) biome is found. The house must be designed for an area that does not have access to a power grid. In addition, the house must include a renewable energy source, one (1) agricultural system, and must solve one (1) problem that is specific to the area.","Based on the annual theme, participants conduct research on a sustainable architectural design for a home in a country not their own. Participants produce a portfolio and create a display and a model. Semifinalists present their design and participate in an interview.","Display, Model, Portfolio",2,,,,,,,,,,
|
||||
Prepared Speech,Prepared Speech,2,Individual,Speech,1,three (3) individuals per state,2025 National Conference Theme: Tune into Technology,Participants deliver a timed speech that relates to the theme of the current national TSA conference. Semifinalists and finalists are determined using the same competition procedure.,"Note Cards permitted, memorization is better",2,,,TRUE,,,,,3,TRUE,
|
||||
Problem Solving,Problem Solving,1,Team,Challenge,2,one (1) team of two (2) individuals per chapter,,"Participants use problem-solving skills to design and build a solution to an onsite challenge. Solutions are evaluated using measures appropriate to the challenge, such as elapsed time, horizontal or vertical distance, and/or strength.",Toolkit,1,,,,,,,,,,Practice Prompt
|
||||
Promotional Marketing,Promo Marketing,2,Individual,Challenge,1,one (1) individual per chapter,"Charitable and service organizations are the backbone of our communities. A group called “Students Helping Grandparents” has contacted your chapter advisor about your chapter hosting an event at a public library, during which chapter members will lead focus group discussions with senior citizens. The topic for the focus groups will be helping senior citizens understand and avoid online cybercrime. The event is Tuesday May 27, 2025, from 4:00 PM – 6:00 PM. Printable: Design a tri-fold brochure. Wearable: Design a hat that can be given to participants. Digital Signage: Create an auto-advancing slide presentation that is no longer than two (2) minutes in length.",Participants create and submit a marketing portfolio and required elements that address the annual theme/problem. Semifinalists complete a layout and design assignment for evaluation.,"Advertisement, Design, Digital Signage",2,TRUE,,,,,,,3,TRUE,
|
||||
STEM Animation,STEM Ani.,3,Team,Presentation and Interview (2 Team Members),3 to 6,three (3) teams per state,Robotics in automobile manufacturing,Participants design and create a STEM animation video and documentation portfolio to address the annual theme/problem. Semifinalists present their animation and explain the elements of their portfolio/entry.,"Portfolio, Video Link",2,TRUE,,,,,,,,,
|
||||
Structural Engineering,Structural Eng.,2,Team,Challenge,2,one (1) team of two (2) individuals per chapter,,Participants apply the principles of structural engineering to design and construct a structure that complies with the annual challenge. An assessment of the required documentation and the destructive testing of the structure (to determine its design efficiency) determine both semifinalists and finalists.,"Technical 3D drawing, cuts part list of materials",2,,,,,,,,,,
|
||||
System Control Technology,System Control Tech,2,Team,Challenge,3,one (1) team of three (3) individuals per state,,"In response to a challenge presented onsite at the conference, participants analyze a problem (typically one in an industrial setting), build and program a computer-controlled mechanical model to solve the problem, explain the program and the features of the mechanical model solution, and provide instructions for evaluators to operate the device.","Construction Kit, Inventor's Log",2,,,,,,,,,,
|
||||
Tech Bowl,Tech Bowl,1,Team,Test,3,one (1) team of three (3) individuals per chapter,,"Participants demonstrate their knowledge of TSA and concepts addressed in technology content standards by completing an objective test. Semifinalists participate in a head-to-head, team competition.",,2,,TRUE,,,,,,2,,12:30 (Arrive 10 min early)
|
||||
Technical Design,Tech Design,2,Team,Challenge,2,one (1) team of two (2) individuals per chapter,,Participants demonstrate their ability to use the technical design process to solve an engineering design problem provided onsite at the conference. Required elements of the entry are presented in a portfolio that includes technical drawings for a minimum of three viable solutions.,Portfolio incl. Technical Drawings,2,,,,,,,,,,
|
||||
Video Game Design,Video Game,3,Team,Presentation and Interview,2 to 6,One (1) team of two (2) to six (6) individuals per chapter,,"Participants design, build, provide documentation for, and launch an E-rated, online game on a subject of their choice. Onsite at the conference, semifinalists deliver a presentation and participate in an interview to demonstrate the knowledge and expertise gained during the development of the game.","Portfolio, Game Link",2,TRUE,,,,,,,3,TRUE,
|
||||
Vlogging,Vlogging,3,Team,Challenge,2 to 6,two (2) teams of two (2) to six (6) members per chapter,Setting and achieving goals; the minimum number of audio pieces is four (4).,"Participants use digital video technology to create original content about a pre-determined technology theme. Semifinalists compete in an onsite challenge to produce additional video(s) based on specified criteria, such as provided props, lines of dialog, and topics.","Portfolio, Video Link",2,TRUE,,,,,,,3,TRUE,RMS Interview (?)
|
||||
Website Design,Website,3,Team,Presentation and Interview,3 to 6,one (1) team of at least three (3) and a maximum of six (6) individuals per chapter,Topic: Website for food preparation recipes. Challenge – Develop an original website with simple recipes for young cooks (MS and HS age). It should have an interactive element that will ask a few questions to direct the user to the desired ingredients and recipe. ,"To address the annual challenge, participants design, build, provide documentation for, and launch a website that incorporates the elements of website design, graphic layout, and proper coding techniques. Semifinalists participate in an interview to demonstrate the knowledge and expertise gained during the development of the website.","Copyright Checklist, Release Forms, Work Log, Website Link",2,TRUE,,,,,,,3,TRUE,RMS Interview
|
||||
|
Binary file not shown.
+11
@@ -0,0 +1,11 @@
|
||||
Student Name,Grade,TSA year,Officer,National ID,State ID,Regional ID,1,2,3,4,5,6,7,TOTAL # OF EVENTS
|
||||
"Schlesser, Abby",6,2,,924211,12227005,12227016,Children's Stories,Problem Solving,Mass Production,Digital Photography,Prepared Speech,,,
|
||||
"Chittenden, Lilah",7,1,,(1038456),12227010,,Off the Grid,Children's Stories,Digital Photography,Mass Production,Forensic Technology,,,
|
||||
"Eldridge, AJ ",7,2,Reporter,924310,12227012,12227009,I&I,Prepared Speech,Leadership Strategies,Off the Grid,Dragster,,,
|
||||
"Fischer, Avery",7,3,Vice President,800321,12227013,12227011,Construction Challenge,Structural Engineering,I&I,Digital Photography,CAD Foundations,,,
|
||||
"McKee, Ellie",7,2,,924314,12227016,12227013,Construction Challenge,Off the Grid,Structural Engineering,Digital Photography,,,,
|
||||
"Blanco, Tavi",8,3,,800323,12227008,12227006,Off the Grid,Promotional Marketing,Website Design,Leadership Strategies,Tech Bowl,,,
|
||||
"Carmon, Adaiah",8,3,,800328,12227006,12227007,STEM Animation,Community Service Video,Technical Design,CAD Foundations,Promotional Marketing,,,
|
||||
"Hermann, Eliam",8,3,President,831172,12227014,12227010,I&I,Tech Bowl,Med Tech,CAD Foundations,Challenging Tech Issues,Cybersecurity,Website Design,
|
||||
"Kolpack, Grant",8,3,Sergeant-At-Arms,800315,12227015,12227011,STEM Animation,Tech Bowl,Children's Stories,Website Design,CAD Foundations,Essays on Technology,,
|
||||
"White, Thomas",8,3,,800319,12227021,12227019,Challenging Tech Issues,I&I,Leadership Strategies,Tech Bowl,Prepared Speech,,,
|
||||
|
@@ -0,0 +1,22 @@
|
||||
Event Name,Team Name,Notes,Student 1,Student 2,Student 3,Student 4,Student 5
|
||||
Challenging Technology Issues,,? (reg) (act)2,Thomas,Eliam,,
|
||||
Children's Stories,,? (reg) 3-6,Abby,Lilah,Tavi,,
|
||||
Community Service Video,,? (reg) 1-6,Adaiah,,,,
|
||||
Construction Challenge,,? 3-6,Avery,Lilah,Ellie,,
|
||||
Forensic Technology,,? (reg) 2,Ellie,Lilah,,,
|
||||
Inventions & Innovations,I&I Team 1,? (reg) 3-6,Eliam,Avery,Thomas,,
|
||||
Leadership Strategies,,? (reg) 3,Tavi,AJ,Thomas,,,
|
||||
Mass Production,,? 3-6,AJ,Abby,Tavi,,
|
||||
Mechanical Engineering,,? (act)2-3,,,,,
|
||||
Medical Technology,,? (reg) 3,Eliam,Thomas,Adaiah,
|
||||
Off the Grid,,? (reg) 3-6,Ellie,Lilah,Tavi,,
|
||||
Problem Solving,,? (act)2,Abby,Avery,,,,
|
||||
STEM Animation,,? 3-6,Grant,Adaiah,Thomas,,
|
||||
Tech Bowl,,? (reg) (act)3,Eliam,Grant,AJ,
|
||||
Vlogging,,? (reg) (act)2-6,AJ,Adaiah,,,
|
||||
Website Design,,? 3-6,Grant,Tavi,Eliam,,,
|
||||
Career Prep,,? (ind) (reg) 1,,,,
|
||||
CAD foundations,,? (ind) (act)1,Avery,Grant,,,
|
||||
Digital Photography,,? (ind) (act)1,Ellie,,,,
|
||||
Dragster,,? (ind) (act)1,AJ,,,,
|
||||
Prepared Speech,,? (ind) (reg) (act)1,Abby,Thomas,,,
|
||||
|
@@ -0,0 +1,17 @@
|
||||
Student Name,Grade,TSA year,Officer,State ID,Regional ID,1,2,3,4,5,6,7,TOTAL # OF EVENTS
|
||||
"Alden, Ainsley",6,2,,12227007,12227005,Mechanical Engineering,Construction Challenge,Mass Production,Med Tech,Off the Grid,,,
|
||||
"Broscious, Emberly",6,1,,12227009,,Mechanical Engineering,Junior Solar Sprint,Flight,Problem Solving,Structural Eng,,,
|
||||
"Dean, Lucas",6,2,,12227011,12227008,Microcontroller,Digital Photography,Flight,Junior Solar Sprint,Tech Bowl,,,
|
||||
"Schlesser, Abby",6,2,,12227005,12227016,Children's Stories,Problem Solving,Mass Production,Digital Photography,Prepared Speech,,,
|
||||
"Chittenden, Lilah",7,1,,12227010,,Off the Grid,Children's Stories,Digital Photography,Mass Production,Forensic Technology,,,
|
||||
"Eldridge, AJ ",7,2,Reporter,12227012,12227009,I&I,Prepared Speech,Leadership Strategies,Off the Grid,Dragster,,,
|
||||
"Fischer, Avery",7,3,Vice President,12227013,12227011,Construction Challenge,Structural Engineering,I&I,Digital Photography,CAD Foundations,,,
|
||||
"McKee, Ellie",7,2,,12227016,12227013,Construction Challenge,Off the Grid,Structural Engineering,Digital Photography,,,,
|
||||
"Moulton, Kyle",7,3,,12227017,12227014,I&I,Med Tech,Microcontroller Design,Vlogging,Career Prep,,,
|
||||
"Naeve, Suse",7,2,Secretary,12227018,12227015,Construction Challenge,Digital Photography,Off the Grid,Children's Stories,Med Tech,,,
|
||||
"Blanco, Tavi",8,3,,12227008,12227006,Off the Grid,Promotional Marketing,Website Design,Leadership Strategies,Tech Bowl,,,
|
||||
"Carmon, Adaiah",8,3,,12227006,12227007,STEM Animation,Community Service Video,Technical Design,CAD Foundations,Promotional Marketing,,,
|
||||
"Hermann, Eliam",8,3,President,12227014,12227010,I&I,Tech Bowl,Med Tech,CAD Foundations,Challenging Tech Issues,Cybersecurity,Website Design,
|
||||
"Kolpack, Grant",8,3,Sergeant-At-Arms,12227015,12227011,STEM Animation,Tech Bowl,Children's Stories,Website Design,CAD Foundations,Essays on Technology,,
|
||||
"Shifra, Caleb",8,2,Treasurer,12227020,12227017,Career Prep,Electrical Applications,I&I,Flight,Junior Solar Sprint,,,
|
||||
"White, Thomas",8,3,,12227021,12227019,Challenging Tech Issues,I&I,Leadership Strategies,Tech Bowl,Prepared Speech,,,
|
||||
|
@@ -0,0 +1,28 @@
|
||||
Event Name,Team Name,Notes,Student 1,Student 2,Student 3,Student 4,Student 5
|
||||
Challenging Technology Issues,,? (reg) (act)2,Thomas,Eliam,,
|
||||
Children's Stories,,? (reg) 3-6,Abby,Suse,Lilah,Tavi,
|
||||
Community Service Video,,? (reg) 1-6,Adaiah,,,,
|
||||
Construction Challenge,,? 3-6,Avery,Lilah,Ellie,Suse,
|
||||
Electrical Applications,,? (act)2,Caleb,Lucas,,
|
||||
Forensic Technology,,? (reg) 2,Suse,Ellie,,,,
|
||||
Inventions & Innovations,I&I Team 1,? (reg) 3-6,Eliam,Avery,Caleb,Thomas,,
|
||||
Inventions & Innovations,I&I Team 2,? (reg) 3-6,AJ,Kyle,Grant,,
|
||||
Junior Solar Sprint,,? (act)2-4,Caleb,Lucas,,,,
|
||||
Leadership Strategies,,? (reg) 3,Tavi,Ainsley,AJ,,,
|
||||
Mass Production,,? 3-6,AJ,Ainsley,Abby,,,
|
||||
Mechanical Engineering,,? (act)2-3,Ainsley,Emberly,,,
|
||||
Medical Technology,,? (reg) 3,Emberly,Ainsley,Eliam,,
|
||||
Microcontroller Design,,? 1-6,Lucas,Kyle,,,,
|
||||
Off the Grid,,? (reg) 3-6,Ellie,Lilah,Tavi,,
|
||||
Problem Solving,,? (act)2,Abby,Emberly,,,,,
|
||||
STEM Animation,,? 3-6,Grant,Adaiah,Thomas,,
|
||||
Tech Bowl,,? (reg) (act)3,Eliam,Lucas,Grant,,
|
||||
Vlogging,,? (reg) (act)2-6,Kyle,AJ,,,,
|
||||
Website Design,,? 3-6,Grant,Tavi,Eliam,,,
|
||||
Career Prep,,? (ind) (reg) 1,Caleb,,,
|
||||
CAD foundations,,? (ind) (act)1,Avery,Grant,,,
|
||||
Digital Photography,,? (ind) (act)1,Ellie,Suse,,,
|
||||
Dragster,,? (ind) (act)1,AJ,,,,
|
||||
Essays on Technology,,? (ind) (act)1,Lilah,,,,
|
||||
Flight,,? (ind) (act)1,Emberly,,,,
|
||||
Prepared Speech,,? (ind) (reg) (act)1,Abby,,,,
|
||||
|
@@ -0,0 +1,37 @@
|
||||
,Abby, Adaiah, Ainsley, AJ, Avery, Caleb, Eliam, Ellie, Ember, Emberly, Grant, Kyle, Lilah, Lucas, Maryonna, Riley, Suse, Tavi, Thomas
|
||||
Biotech,,,,,,,,,,,,,,,,,,,
|
||||
Career Prep,,x,,,,,,,,x,,,x,,,x,,,
|
||||
Chlg. Tech Issues,,x,,,,,,x,,x,,,x,,,x,,,i
|
||||
Chapter Team,,,,,,,,,,,,,,,,,,,
|
||||
Children's Stories,,,,,,,,,,,x,,,,,,,,
|
||||
Coding,,,,,,,,,,,,,,,,,,,
|
||||
Comm. Service Vid,,,,,,,,,,,,,,,,,,,
|
||||
CAD,,,,,,,,,,,i,,,,,,,,
|
||||
Construction Chlg.,,,,,,,,,,,,,i,,,,,,
|
||||
Cybersecurity,,,,,,,,,,,,,,,,,,,
|
||||
Data Sci.,,,,,,,,,,,,,,,,,,,
|
||||
Digital Photography,,,,,,,,,,,,,,,,,i,,
|
||||
Dragster,,,,,,,,,,,,,,,,,,,
|
||||
Electrical App.,,,,,,,,,,,,,,,,,,,
|
||||
Essays on Tech,,,,,,,,,i,,,,i,,,,,,
|
||||
Flight,,,,,,,,,,,,,,,,,,,
|
||||
Forensic Tech,,x,,,,,,,,x,,,x,,,x,,,
|
||||
I&I,,,,,,,,,,,,,,,,,,,
|
||||
JSS,,,,,,,,,,,,,,,,,,,
|
||||
Leadership Str.,,x,i,,,,,,,x,,,x,,,x,,,
|
||||
Mass Production,,,,,,,,,,,,,,,,,,,
|
||||
Mechanical Eng.,,,,,,,,,,,,,,,,,,,
|
||||
Medical Tech,,,,,,,,,,,,,,,,,,,
|
||||
Microcontroller,,,,,,,,,,,,,,,,,,,
|
||||
Off the Grid,,,,,,,,,,,,,,,,,,,
|
||||
Prepared Speech,,x,,,,,,x,,x,,,x,,,x,,,i
|
||||
Problem Solving,,,,,,,,,,,,,,,,,,,
|
||||
Promo Marketing,,,,,,,,,,,,,,,,,,,
|
||||
STEM Ani.,,,,,,,,,,,,,,,,,,,
|
||||
Structural Eng.,,,,,,,,,,,,,,,i,,,,
|
||||
System Control Tech,,,,,,,,,,,,,,,,,,,
|
||||
Tech Bowl,,,,,,,,,,,,,,,,,,,
|
||||
Tech Design,,,,,,,,,,,,,,,,,,,
|
||||
Video Game,,,,,,,,,,,,,,,,,,,
|
||||
Vlogging,,,,,,,,,,,,,,,,,,,
|
||||
Website,,,,,,,i,,,,,,,,,,,,x
|
||||
|
Binary file not shown.
@@ -0,0 +1,429 @@
|
||||
Animatronics – HS
|
||||
Time Sign-Up April 2 6 p.m. - 7 p.m. Online
|
||||
Presentations April 3 1:30 p.m. - 3:30 p.m. Mtg. Room 18
|
||||
Architectural Design - HS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Submit Entry April 3 8 a.m. – 9:00 a.m. Exhibit Hall C
|
||||
Semifinalist Time Sign-Up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations April 4 9:30 a.m. - 11:30 a.m. Exhibit Hall C
|
||||
Pick-Up April 4 5 p.m. - 5:30 p.m. Exhibit Hall C
|
||||
Audio Podcasting – HS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Prompt Pick-Up April 2 6 p.m. - 9 p.m. Banquet Hall E
|
||||
Semifinalist Submissions Due April 4 9 a.m. Online
|
||||
Biotechnology – MS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews April 4 9:30 a.m. – 11:30 a.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Biotechnology Design – HS
|
||||
Submit Entry April 3 8 a.m. – 9:00 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews April 4 10:30 a.m. – 12:30 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Board Game Design – HS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews April 4 12:30 pm - 4:30 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
CAD Foundations – MS
|
||||
Setup, Event, & Interviews April 3 10:30 a.m. – 2 p.m. Mtg. Room 6
|
||||
Career Prep – MS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Sign-up April 2 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews April 3 3 p.m. – 5 p.m. Mtg. Room 16
|
||||
Challenging Technology Issues – MS
|
||||
Preliminary Round Time Sign-up April 2 6 p.m. - 7 p.m. Online
|
||||
Prelims Presentation – Holding Room April 3 2:30 p.m. - 5 p.m. Mtg. Room 7
|
||||
Prelims Presentation – Presentation April 3 2:30 p.m. - 5 p.m. Mtg. Room 8
|
||||
Semifinalist Round Time Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinals Presentation – Holding Room April 4 9:30 a.m. – 11 a.m. Mtg. Room 9
|
||||
Semifinals Presentation – Presentation April 4 9:30 a.m. – 11 a.m. Mtg. Room 10
|
||||
Chapter Team – HS
|
||||
On-Site Preliminary Exam Testing Window April 2 6 p.m. - 9 p.m. Banquet Hall H
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations April 4 3:30 p.m. – 5 p.m. Mtg. Room 16
|
||||
Chapter Team – MS
|
||||
On-Site Preliminary Exam Testing Window April 2 6 p.m. - 9 p.m. Banquet Hall I
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations April 4 1:30 p.m. – 3 p.m. Mtg. Room 16
|
||||
Children’s Stories – HS
|
||||
Submit Entry April 2 6 p.m. - 9 p.m. Banquet Hall G
|
||||
Judging April 3 9 a.m. – 5 p.m. Mtg. Room 13
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Reading/Interviews April 4 9:30 a.m. – 12:30 p.m. Mtg. Room 18
|
||||
Pick-up April 4 5 p.m. - 5:30 p.m. Exhibit Hall C
|
||||
*The books of semifinalist teams will be available in Meeting Room 18 for the semifinalist reading/interview and will
|
||||
be returned to teams with all other projects during project pick-up in Exhibit Hall C.
|
||||
Children’s Stories – MS
|
||||
Submit Entry April 2 6 p.m. - 9 p.m. Banquet Hall G
|
||||
Judging April 3 9 a.m. – 5 p.m. Mtg. Room 13
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Reading/Interviews April 4 1 p.m. – 4 p.m. Mtg. Room 18
|
||||
Pick-up (everyone) April 4 5 p.m. - 5:30 p.m. Exhibit Hall C
|
||||
*The books of semifinalist teams will be available in Meeting Room 18 for the semifinalist reading/interview and will
|
||||
be returned to teams with all other projects during project pick-up in Exhibit Hall C.
|
||||
Coding – HS
|
||||
On-Site Preliminary Exam Testing Window April 2 6 p.m. - 9 p.m. Banquet Hall H
|
||||
On-Site Event April 4 9:30 a.m. – NOON Mtg. Room 19
|
||||
Coding – MS
|
||||
On-Site Preliminary Exam Testing Window April 2 6 p.m. - 9 p.m. Banquet Hall I
|
||||
Event & Judging April 4 12:30 p.m. – 3 p.m. Mtg. Room 19
|
||||
Community Service Video – MS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Sign-up April 2 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations April 3 3 p.m. - 5 p.m. Mtg. Room 17
|
||||
Computer-Aided Design (CAD), Architecture – HS
|
||||
Setup, Event, & Judging April 3 10:30 a.m. – 4 p.m. Mtg. Room 6
|
||||
Computer-Aided Design (CAD), Engineering – HS
|
||||
Setup, Event, & Judging April 3 10:30 a.m. – 4 p.m. Mtg. Room 6
|
||||
Construction Challenge – MS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews April 4 10:30 a.m. – 12:30 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Cybersecurity – MS
|
||||
On-Site Preliminary Exam Testing Window April 2 6 p.m. - 9 p.m. Banquet Hall I
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations April 4 NOON - 1 p.m. Mtg. Room 16Data Science and Analytics – MS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. - 5 p.m. Exhibit Hall C
|
||||
Semifinalist Time Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Preparation April 4 3 p.m. – 4:30 p.m. Mtg. Room 5
|
||||
Semifinalist Presentations April 4 3 p.m. – 4:30 p.m. Mtg. Room 4
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Data Science and Analytics – HS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Presentation Time Sign-up April 2 6 p.m. - 7 p.m. Online
|
||||
Preliminary Presentations April 3 12:30 p.m. – 5 p.m. Mtg. Room 4
|
||||
Semifinalist Live Challenge April 4 3 p.m. - 5 p.m. Mtg. Room 6
|
||||
Debating Technological Issues – HS
|
||||
Preliminary Time Sign-ups April 2 6 p.m. - 7 p.m. Online
|
||||
Preliminary Pre-Debate Meeting April 3 10 a.m. – 10:30 a.m. Mtg. Room 5
|
||||
Preliminary Debate Holding Room April 3 11:30 a.m. – 2:30 p.m. Mtg. Room 7
|
||||
Preliminary Debate Presentation Heat 1 April 3 11:30 a.m. – 2:30 p.m. Mtg. Room 8
|
||||
Preliminary Debate Presentation Heat 2 April 3 11:30 a.m. – 2:30 p.m. Mtg. Room 9
|
||||
Semifinals Time Sign-ups April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinals Pre-Debate Meeting April 4 9:30 a.m. – 10 a.m. Mtg. Room 7
|
||||
Semifinals Debate Holding Room April 4 10:30 a.m. - 12:30 p.m. Mtg. Room 7
|
||||
Semifinals Debate Presentation April 4 10:30 a.m. - 12:30 p.m. Mtg. Room 8
|
||||
Digital Photography – MS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Setup, Onsite Problem April 3 10 a.m. – 1 p.m. Mtg. Room 19
|
||||
Semifinalist Time Sign-Up April 3 10 a.m. - 1 p.m. Mtg. Room 19
|
||||
Semifinalist Interviews April 3 4 p.m. - 5 p.m. Mtg. Room 19
|
||||
Digital Video Production – HS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Sign-Up April 2 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews April 3 10 a.m. - 12 p.m. Mtg. Room 17
|
||||
Dragster – MS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall B
|
||||
Time Trials April 3 10 a.m. – 11 a.m. Exhibit Hall B
|
||||
Semifinalist Interview Sign-ups April 3 NOON – 12:15 p.m. Exhibit Hall B
|
||||
Semifinalist Interviews April 3 12:30 p.m. – 1:30 p.m. Exhibit Hall B
|
||||
Semifinalist Races April 3 2:30 p.m. – 3 p.m. Exhibit Hall B
|
||||
Pick-up April 3 5 p.m. – 5:30 p.m. Exhibit Hall B
|
||||
Dragster Design – HS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall B
|
||||
Time Trials April 3 10 a.m. – 11 a.m. Exhibit Hall B
|
||||
Semifinalist Interview Sign-ups April 3 NOON – 12:15 p.m. Exhibit Hall B
|
||||
Semifinalist Interviews April 3 12:30 p.m. – 1:30 p.m. Exhibit Hall B
|
||||
Semifinalist Races April 3 3 p.m. – 4 p.m. Exhibit Hall B
|
||||
Pick-up April 3 5 p.m. – 5:30 p.m. Exhibit Hall B
|
||||
Drone Challenge (UAV) – HS
|
||||
Time Sign-Up April 2 6 p.m. - 7 p.m. Online
|
||||
Team Set-Up April 3 9:45 a.m. - 3 p.m. Exhibit Hall B
|
||||
Safety Check/Flights/Interviews April 3 10 a.m. - 4 p.m. Exhibit Hall B
|
||||
*Note: Teams will sign up for a time that will start their rotation through 4 stations: 1. set-up, 2. safety
|
||||
check/testing, 3. flight/challenge, and 4. interview. These windows will be an hour long and will be spaced in
|
||||
20 minute intervals. A reduced amount of pre-challenge fly time may be necessary due to the number of teams.
|
||||
All participants will be given the same amount of time prior to their challenge run to test flight their drone.
|
||||
Electrical Applications – MS
|
||||
On-Site Preliminary Exam Testing Window April 2 6 p.m. - 9 p.m. Banquet Hall I
|
||||
Semifinalist Onsite Problem April 3 1:30 p.m. – 3 p.m. Mtg. Room 19
|
||||
Engineering Design - HS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews April 4 11:30 a.m. – 2:30 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Essays on Technology – MS
|
||||
Preliminaries April 3 2:30 p.m. – 4 p.m. Mtg. Room 5
|
||||
Judging April 4 10:00 a.m. – 1 p.m. Mtg. Room 13
|
||||
Semifinalist Writing April 4 3:30 p.m. – 4:30 p.m. Mtg. Room 19
|
||||
Extemporaneous Speech – HS
|
||||
Preliminary Time Sign-ups April 2 6 p.m. - 7 p.m. Online
|
||||
Preliminary Speech – Holding Room April 3 10 a.m. – 11:30 a.m. Mtg. Room 7
|
||||
Preliminary Speech – Presentations Heat 1 April 3 10 a.m. – 11:30 a.m. Mtg. Room 8
|
||||
Preliminary Speech – Presentations Heat 2 April 3 10 a.m. – 11:30 a.m. Mtg. Room 9
|
||||
Semifinalist Time Sign-ups April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Speech – Holding Room April 4 1 p.m. - 2:30 p.m. Mtg. Room 7
|
||||
Semifinalist Speech – Presentations April 4 1 p.m. - 2:30 p.m. Mtg. Room 8
|
||||
Fashion Design and Technology – HS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. – 7 p.m. Online
|
||||
Pick-up (Semifinalists only) April 4 10:30 a.m. – 1:00 p.m. Exhibit Hall C
|
||||
Semifinalist Gallery Walk (Optional) April 4 2:30 p.m. - 4:30 p.m. Exhibit Hall B
|
||||
Semifinalist Presentations/Interviews April 4 2:30 p.m. - 4:30 p.m. Mtg. Room 17
|
||||
Pick-up (Everyone) April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Flight – MS
|
||||
Submit Entry & Sign-up April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Preliminary Round Testing April 3 10 a.m. – 11:30 a.m. Exhibit Hall C
|
||||
Semifinalist Construction and Flights April 3 1 p.m. – 3:30 p.m. Exhibit Hall C
|
||||
All event materials picked up April 3 4 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Flight Endurance – HS
|
||||
Submit Entry for Impound April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Pilot’s Meeting April 3 11:30 a.m. – 12 p.m. Exhibit Hall C
|
||||
Flights April 3 12 p.m. – 1:30 p.m. Exhibit Hall C
|
||||
Forensic Science – HS
|
||||
On-Site Preliminary Exam Testing Window April 2 6 p.m. - 9 p.m. Banquet Hall H
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist CSI April 4 9:30 a.m. – 2:30 p.m. Mtg. Room 4
|
||||
Semifinalist Onsite Written Analysis April 4 9:30 a.m. – 2:30 p.m. Mtg. Room 5
|
||||
Forensic Technology – MS
|
||||
On-Site Preliminary Exam Testing Window April 2 6 p.m. - 9 p.m. Banquet Hall I
|
||||
Semifinalist Sign-up April 3 6 p.m. – 7 p.m. Online
|
||||
Semifinalist Presentations April 4 1:30 p.m. - 4:30 p.m. Mtg. Room 9
|
||||
Future Technology and Engineering Teacher – HS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Sign-up April 2 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations April 3 10 a.m. - 1 p.m. Mtg. Room 18
|
||||
Geospatial Technology – HS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Display Drop Off April 3 8 a.m - 9 a.m. Exhibit Hall C
|
||||
Semifinalist Presentation Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews April 4 1 p.m. - 3 p.m. Exhibit Hall C
|
||||
Inventions and Innovations – MS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews April 4 11:30 a.m. – 1:30 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Junior Solar Sprint – MS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Submit Entry April 3 8 a.m. - 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. - 2 p.m. Exhibit Hall C
|
||||
Races April 4 9:30 a.m. - 11:30 a.m. Exhibit Hall C
|
||||
Leadership Strategies – MS
|
||||
Preliminary TIme Sign-ups April 2 6 p.m. - 7 p.m. Online
|
||||
Preliminary Presentation - Holding Room April 3 2:30 p.m. - 5 p.m. Mtg. Room 7
|
||||
Preliminary Presentation - Delivery April 3 2:30 p.m. - 5 p.m. Mtg. Room 9
|
||||
Semifinals Time Sign-ups April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinals Presentation - Holding Room April 4 11:30 a.m. – 1 p.m. Mtg. Room 9
|
||||
Semifinals Presentation - Delivery April 4 11:30 a.m. – 1 p.m. Mtg. Room 10
|
||||
Manufacturing Prototype – HS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Sales Pitches April 4 3:30 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Mass Production – MS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews April 4 12:30 p.m. – 2:30 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Mechanical Engineering – MS
|
||||
Submit Entry & Sign-up April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Car Trials April 3 3 p.m. - 4 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Medical Technology – MS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews April 4 1:30 p.m. – 3:30 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
Microcontroller Design – MS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Presentation Time Sign-ups April 3 6 p.m. - 7 p.m. Online
|
||||
Presentations/Interviews April 4 2 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Music Production – HS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Sign-up April 2 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews April 3 12:30 p.m. – 2:30 p.m. Mtg. Room 17
|
||||
Off the Grid – MS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations/Interviews April 4 2:30 p.m. – 4:30 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
On Demand Video – HS
|
||||
Prompt Pick-Up April 2 6 p.m. - 9 p.m. Banquet Hall E
|
||||
Submission Deadline April 4 9 a.m. Online
|
||||
Judging April 4 10 a.m. – 4 p.m. Mtg. Room 13
|
||||
Photographic Technology – HS
|
||||
Pre-Conference Submission Opens March 12 NOON Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
(Semifinalists only)
|
||||
24-Hour Challenge Prompt Pick-Up April 2 6 p.m. - 9 p.m. Banquet Hall E
|
||||
24-Hour Challenge Due April 3 9 p.m. Online
|
||||
Semifinalist Time Sign-Ups April 3 6 p.m. - 7 p.m. Online
|
||||
24-Hour Challenge Judging April 4 9 a.m. - 2:30 p.m. Mtg. Room 13
|
||||
Semifinalist Interviews April 4 3 p.m. – 5 p.m. Mtg. Room 7
|
||||
Prepared Presentation – HS
|
||||
Preliminary Time Sign-Ups April 2 6 p.m. - 7 p.m. Online
|
||||
Preliminary Presentations April 3 10 a.m. – 2 p.m. Mtg. Room 10
|
||||
Semifinalist Time Sign-ups April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations April 4 3 p.m. – 5 p.m. Mtg. Room 8
|
||||
Prepared Speech – MS
|
||||
Preliminary Time Sign-Ups April 2 6 p.m. - 7 p.m. Online
|
||||
Preliminary Presentations April 3 2:30 p.m. – 4:30 p.m. Mtg. Room 10
|
||||
Semifinalist Time Sign-ups April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Presentations April 4 1:30 p.m. – 3 p.m. Mtg. Room 10
|
||||
Problem Solving – MS
|
||||
Peer Kit Check April 4 NOON – 12:30 p.m. Exhibit Hall C
|
||||
Onsite Problem April 4 12:30 p.m. – 3:00 p.m. Exhibit Hall C
|
||||
Promotional Design – HS
|
||||
Submit Entry April 2 6 p.m. – 9 p.m. Banquet Hall G
|
||||
Judging April 3 9 a.m. – 5 p.m. Mtg. Room 13
|
||||
Semifinalist Set-up & Onsite Problem April 4 11:30 p.m. – 2:30 p.m. Mtg. Room 6
|
||||
Promotional Marketing – MS
|
||||
Pre-Conference Submission Opens March 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Set-up & Onsite Problem April 4 9:30 a.m. – 11 a.m. Mtg. Room 6
|
||||
TSA Robotics – HS
|
||||
Time Sign-Ups April 3 8 a.m. - 9 a.m. Exhibit Hall B
|
||||
Pit Set-Up and Safety Testing April 3 10:30 a.m. - 11:00 a.m. Exhibit Hall B
|
||||
On Site Challenge Trials April 3 11:00 a.m. - 4:30 p.m. Exhibit Hall B
|
||||
Semifinalist Time Sign-Ups April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews (Closed Viewing) April 4 10:30 a.m. - 2 p.m. Exhibit Hall B
|
||||
Senior Solar Sprint – HS
|
||||
Submit Entry April 3 8 a.m. - 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. - 2 p.m. Exhibit Hall C
|
||||
Races April 4 9:30 a.m. - 11:30 a.m. Exhibit Hall C
|
||||
Software Development – HS
|
||||
Presentation Sign-Up April 2 6 p.m. - 7 p.m. Online
|
||||
Presentations April 3 10 a.m. – NOON Mtg. Room 4
|
||||
STEM Animation – MS
|
||||
Pre-Conference Submission Opens March 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Sign-up April 2 6 p.m. – 7 p.m. Online
|
||||
Semifinalist Presentations April 4 9:30 a.m. – 11:30 a.m. Mtg. Room 16
|
||||
STEM Mass Media – HS
|
||||
Pre-Conference Submission Opens March 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Press Conference April 3 11:30 a.m. - 12:30 p.m. Mtg. Room 5
|
||||
Print Journalism Piece Submission Opens April 3 12:30 p.m. Online
|
||||
Print Journalism Piece Submission Closes April 4 12:30 p.m Online
|
||||
Structural Design and Engineering – HS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall B
|
||||
Semifinalist Build April 4 9 a.m. – NOON Exhibit Hall B
|
||||
Semifinalist Testing April 4 3 p.m. – 3:30 p.m. Exhibit Hall B
|
||||
Pick-up April 4 4 p.m. – 4:30 p.m. Exhibit Hall B
|
||||
Structural Engineering – MS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall B
|
||||
Semifinalist Build April 4 9 a.m. – NOON Exhibit Hall B
|
||||
Semifinalist Testing April 4 3:30 p.m. – 4:00 p.m. Exhibit Hall B
|
||||
Pick-up April 4 4:30 p.m. – 5 p.m. Exhibit Hall B
|
||||
System Control Technology HS
|
||||
Set-up, Performance, and Judging April 3 10 a.m. – 2 p.m. Mtg. Room 3
|
||||
System Control Technology – MS
|
||||
Set-up, Performance, and Judging April 3 10 a.m. – 2 p.m. Mtg. Room 3
|
||||
Tech Bowl – MS
|
||||
On-Site Preliminary Exam Testing Window April 2 6 p.m. - 9 p.m. Banquet Hall I
|
||||
Bracket Released April 3 6 p.m. Online
|
||||
Semifinalist - Holding April 4 9 a.m. – 1 p.m. Banquet Hall H
|
||||
Semifinalist – Orals April 4 9 a.m. – 1 p.m. Banquet Hall G
|
||||
*Semifinalist competitors will be playing in short, twenty-minute matches throughout the day. We will allow them to
|
||||
leave the holding room for other competitions. Overlapping event times with this event do not necessarily warrant a
|
||||
time conflict. Check with event coordinators to ensure you/your team are accommodated.
|
||||
Technical Design – MS
|
||||
Prompt Release April 3 10 a.m. Online
|
||||
Solution Submit April 4 9 a.m. – 10 a.m. Online
|
||||
Judging April 4 10 a.m. – 2 p.m. CRC
|
||||
Technology Bowl - HS
|
||||
On-Site Preliminary Exam Testing Window April 2 6 p.m. - 9 p.m. Banquet Hall I
|
||||
Bracket Released April 3 6 p.m. Online
|
||||
Semifinalist - Holding April 4 1 p.m. – 5 p.m. Banquet Hall H
|
||||
Semifinalist – Orals April 4 1 p.m. – 5 p.m. Banquet Hall G
|
||||
*Semifinalist competitors will be playing in short, twenty-minute matches throughout the day. We will allow them to
|
||||
leave the holding room for other competitions. Overlapping event times with this event do not necessarily warrant a
|
||||
time conflict. Check with event coordinators to ensure you/your team are accommodated.
|
||||
Technology Problem Solving – HS
|
||||
Kit Check April 4 NOON – 12:30 p.m. Exhibit Hall C
|
||||
Onsite Problem April 4 12:30 p.m. – 4 p.m. Exhibit Hall C
|
||||
Transportation Modeling – HS
|
||||
Submit Entry April 3 8 a.m. – 9 a.m. Exhibit Hall C
|
||||
Judging April 3 9 a.m. – 5 p.m. Exhibit Hall C
|
||||
Time Sign-Up April 3 6 p.m. - 7 p.m. Online
|
||||
Interviews April 4 2:30 p.m. - 4 p.m. Exhibit Hall C
|
||||
Pick-up April 4 5 p.m. – 5:30 p.m. Exhibit Hall C
|
||||
VEX IQ Robotics – MS
|
||||
Inspection/Check-In April 3 10:30 a.m. - 11:15 a.m. Exhibit Hall C
|
||||
Verbal Instructions/Restatement of Skills April 3 11:30 a.m. - 11:45 a.m. Exhibit Hall C
|
||||
*Note: At least one member from each team must be in attendance for the instructions
|
||||
Skills Runs (3 programming/3 Drivers) April 3 12 p.m. - 3:30 p.m. Exhibit Hall C
|
||||
Teams Determined for Teamwork Challenge April 3 3:45 p.m. - 4 p.m. Exhibit Hall C
|
||||
*Note: At least one member from each team must be in attendance for the team determination
|
||||
Teamwork Challenge April 3 4:15 p.m. - 4:45 p.m. Exhibit Hall C
|
||||
VEX VRC Robotics – HS
|
||||
Inspection/Check-In April 3 10:30 a.m. - 11:15 a.m. Exhibit Hall C
|
||||
Verbal Instructions/Restatement of Skills April 3 11:15 a.m. - 11:30 a.m. Exhibit Hall C
|
||||
*Note: At least one member from each team must be in attendance for the instructions
|
||||
Skills Runs April 3 11:45 a.m. - 3:30 p.m. Exhibit Hall C
|
||||
Alliance Selection/Drivers Meeting April 3 3:30 p.m. - 4 p.m. Exhibit Hall C
|
||||
*Note: At least one member from each team must be in attendance for the alliance selections
|
||||
2 Vs. 2 Elimination Bracket April 3 4:30 p.m. - 5:45 p.m. Exhibit Hall C
|
||||
Video Game Design – HS
|
||||
Pre-Conference Submission Opens March 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews April 4 NOON - 2 p.m. Mtg. Room 17
|
||||
Video Game Design – MS
|
||||
Pre-Conference Submission Opens March 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Sign-up April 2 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews April 3 12:30 p.m. - 2:30 p.m. Mtg. Room 16
|
||||
Virtual Reality Visualization (VR) – HS
|
||||
Submit Entry April 2 6 p.m. - 9 p.m. Banquet Hall G
|
||||
Judging April 3 9 a.m. – 1 p.m. Mtg. Room 12
|
||||
Semifinalist Interviews April 3 2:30 p.m. – 4:30 p.m. Mtg. Room 3
|
||||
Vlogging – MS
|
||||
Pre-Conference Submission Opens March 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Prompt Pick-Up April 2 6 p.m. - 9 p.m. Banquet Hall E
|
||||
Semifinalist Submission Opens April 2 9 p.m. Online
|
||||
Vlogging Recording and Production April 3 9 a.m. - 5 p.m. Hallway and Hotel
|
||||
Semifinalist Submission Closes April 4 9 a.m. Online
|
||||
Webmaster – HS
|
||||
Pre-Conference Submission Opens March 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Sign-up April 3 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews April 4 9:30 a.m. – 11:30 a.m. Mtg. Room 17
|
||||
Website Design – MS
|
||||
Pre-Conference Submission Opens March 12 8 a.m. Online
|
||||
Pre-Conference Submission Closes March 14 11:59 p.m. Online
|
||||
Semifinalist Sign-up April 2 6 p.m. - 7 p.m. Online
|
||||
Semifinalist Interviews April 3 10 a.m. – NOON Mtg. Room 16
|
||||
|
||||
|
||||
General Session
|
||||
General Session 1: Opening Session April 3 9:00 a.m. - 10:00 a.m. Exhibit Hall A
|
||||
General Session 3: Awards Ceremony April 5 8:30 a.m. - 11:30 a.m. Exhibit Hall A
|
||||
Silent Disco Night April 3 8:00 p.m. - 9:30 p.m. Exhibit Hall D
|
||||
Workshop - Assembling the Dream Cast April 3 11:30 a.m. - 12:15 p.m. Banquet Room F
|
||||
Workshop - Networking Like a Star April 3 3:30 p.m. - 4:15 p.m. Banquet Room F
|
||||
General Session 2: Business Session April 4 7:30 p.m. - 8:15 p.m. Not Attended
|
||||
|
||||
Voting Delegates
|
||||
Meet the Candidates Session 1 April 3 1:30 p.m. - 2:30 p.m. Main Hallway
|
||||
Meet the Candidates Session 2 April 3 4:30 p.m. - 5:30 p.m. Main Hallway
|
||||
Voting Delegate Meeting April 4 8:00 a.m. - 8:45 a.m. Banquet Room F
|
||||
Chapter Officer Meeting April 4 8:30 p.m. - 9:00 p.m. Banquet Room G
|
||||
@@ -0,0 +1,181 @@
|
||||
|
||||
Challenging Technology Issues – MS
|
||||
Preliminary Round – check-in and sign-up for heat time Cheekwood D Friday, June 27; 8:00 PM – 9:00 PM
|
||||
Preliminary Round – heats prep room and heat room assignment Ryman Studio L Sunday, June 29; 1:00 PM – 5:00 PM
|
||||
Preliminary Round – heat rooms Ryman Studio M-N-O Sunday, June 29; 1:00 PM – 5:00 PM
|
||||
Semifinalist team representative report for presentation time Ryman Studio R Monday, June 30; 12:30 PM – 12:40 PM
|
||||
Semifinal Round – preparation room Ryman Studio R Monday, June 30; 1:00 PM – 3:30 PM
|
||||
Semifinal Round – presentation room Ryman Studio Q Monday, June 30; 1:00 PM – 3:30 PM
|
||||
|
||||
Children’s Stories – MS
|
||||
Preliminary Round – check-in and submit entry Lincoln B Friday, June 27; 8:00 PM – 9:30 PM
|
||||
Semifinalist team representative report for presentation time Cheekwood B Monday, June 30; 1:00 PM – 1:10 PM
|
||||
Semifinal Round – presentations/interviews Cheekwood B Monday, June 30; 1:30 PM – 4:00 PM
|
||||
All entries MUST be picked up Ryman Exhibit Hall B3 Monday, June 30; 4:00 PM – 4:30 PM
|
||||
|
||||
|
||||
CAD Foundations – MS
|
||||
Preliminary Round – check-in and orientation/set up Bayou E Sunday, June 29; 11:30 AM – 12:00 PM
|
||||
Preliminary Round – solution development Bayou E Sunday, June 29; 12:00 PM – 2:00 PM
|
||||
Preliminary Round – evaluation Bayou E Sunday, June 29; 2:00 PM – 3:30 PM
|
||||
|
||||
Community Service Video - MS
|
||||
Semifinalist team representative report for interview time Cheekwood A Saturday, June 28; 1:00 PM – 1:10 PM
|
||||
Semifinal Round – interviews Cheekwood A Saturday, June 28; 1:30 PM – 4:00 PM
|
||||
|
||||
|
||||
Construction Challenge - MS
|
||||
Preliminary Round – check-in and submit entry Ryman Exhibit Hall B3 Saturday, June 28; 2:00 PM – 4:00 PM
|
||||
Semifinalist team representative report for presentation/interview time Ryman Exhibit Hall B3 Monday, June 30; 11:00 AM – 11:10 AM
|
||||
Semifinal Round – presentation/interviews Ryman Exhibit Hall B3 Monday, June 30; 11:30 AM – 2:00 PM
|
||||
All entries MUST be picked up Ryman Exhibit Hall B3 Monday, June 30; 4:00 PM – 4:30 PM
|
||||
|
||||
|
||||
Digital Photography – MS
|
||||
Semifinalists set up Cheekwood C Saturday, June 28; 12:00 PM – 12:30 PM
|
||||
Semifinal Round – on-site task Cheekwood C Saturday, June 28; 12:30 PM – 3:30 PM
|
||||
Semifinal Round – interviews Cheekwood C Saturday, June 28; 3:30 PM – 5:30 PM
|
||||
|
||||
|
||||
Dragster – MS
|
||||
Preliminary Round – check-in and submit entry Ryman Exhibit Hall B5 Friday, June 27; 7:30 PM – 9:30 PM
|
||||
Preliminary Round – time trials Ryman Exhibit Hall B5 Saturday, June 28; 12:00 PM – 4:00 PM
|
||||
Semifinalists report for interview time Ryman Exhibit Hall B5 Sunday, June 29; 11:00 AM – 11:10 AM
|
||||
Semifinal Round – interviews (Top 16 cars) Ryman Exhibit Hall B5 Sunday, June 29; 11:15 AM – 12:45 PM
|
||||
Semifinal Round – head-to-head double elimination bracket Ryman Exhibit Hall B5 Sunday, June 29; 1:00 PM – 3:00 PM
|
||||
All entries MUST be picked up Ryman Exhibit Hall B5 Sunday, June 29; 5:30 PM – 6:00 PM
|
||||
|
||||
|
||||
Forensic Technology – MS
|
||||
Preliminary Round – test Ryman Exhibit Hall B1 Saturday, June 28; 5:00 PM – 6:30 PM
|
||||
Semifinalist team representative report for presentation time Cheekwood E Monday, June 30; 12:00 PM – 12:10 PM
|
||||
Semifinal Round – presentations Cheekwood E Monday, June 30; 12:30 PM – 3:00 PM
|
||||
|
||||
|
||||
|
||||
Inventions and Innovations – MS
|
||||
Preliminary Round – check-in and submit entry Ryman Exhibit Hall B3 Saturday, June 28; 6:45 AM – 8:45 AM
|
||||
Semifinalist team representative report for presentation/interview time Ryman Exhibit Hall B3 Monday, June 30; 11:00 AM – 11:10 AM
|
||||
Semifinal Round – presentation/interviews Ryman Exhibit Hall B3 Monday, June 30; 11:30 AM – 2:00 PM
|
||||
All entries MUST be picked up Ryman Exhibit Hall B3 Monday, June 30; 4:00 PM – 4:30 PM
|
||||
|
||||
|
||||
|
||||
|
||||
Leadership Strategies – MS
|
||||
Preliminary Round – check-in and sign-up for heat time Magnolia Boardroom B Friday, June 27; 8:00 PM – 9:00 PM
|
||||
Preliminary Round – preparation room and heat room assignment Ryman Studio L Saturday, June 28; 1:00 PM – 5:00 PM
|
||||
Preliminary Round – Heat rooms Ryman Studio M-N-O Saturday, June 28; 1:00 PM – 5:00 PM
|
||||
Semifinalist team representative report for presentation time Ryman Studio M Monday, June 30; 12:30 PM – 12:40 PM
|
||||
Semifinal Round – preparation room Ryman Studio M Monday, June 30; 1:00 PM – 3:30 PM
|
||||
Semifinal Round – presentation room Ryman Studio N Monday, June 30; 1:00 PM – 3:30 PM
|
||||
|
||||
|
||||
Mass Production – MS
|
||||
Preliminary Round – check-in and submit entry Ryman Exhibit Hall B3 Saturday, June 28; 2:00 PM – 4:00 PM
|
||||
Semifinalist team representative report for presentation/interview time Ryman Exhibit Hall B3 Monday, June 30; 11:00 AM – 11:10 AM
|
||||
Semifinal Round – presentation/interviews Ryman Exhibit Hall B3 Monday, June 30; 11:30 AM – 2:00 PM
|
||||
All entries MUST be picked up Ryman Exhibit Hall B3 Monday, June 30; 4:00 PM – 4:30 PM
|
||||
|
||||
|
||||
|
||||
Medical Technology – MS
|
||||
Preliminary Round – check-in and submit entry Ryman Exhibit Hall B3 Saturday, June 28; 2:00 PM – 4:00 PM
|
||||
Semifinalist team representative report for presentation/interview time Ryman Exhibit Hall B3 Monday, June 30; 11:00 AM – 11:10 AM
|
||||
Semifinal Round – presentation/interviews Ryman Exhibit Hall B3 Monday, June 30; 11:30 AM – 2:00 PM
|
||||
All entries MUST be picked up Ryman Exhibit Hall B3 Monday, June 30; 4:00 PM – 4:30 PM
|
||||
|
||||
|
||||
Off the Grid – MS
|
||||
Preliminary Round – check-in and submit entry Ryman Exhibit Hall B3 Saturday, June 28; 2:00 PM – 4:00 PM
|
||||
Semifinalist team representative report for presentation/interview time Ryman Exhibit Hall B3 Monday, June 30; 11:00 AM – 11:10 AM
|
||||
Semifinal Round – presentation/interviews Ryman Exhibit Hall B3 Monday, June 30; 11:30 AM – 2:00 PM
|
||||
All entries MUST be picked up Ryman Exhibit Hall B3 Monday, June 30; 4:00 PM – 4:30 PM
|
||||
|
||||
|
||||
Prepared Speech – MS
|
||||
Preliminary Round – check-in and sign-up for heat time Cheekwood F Friday, June 27; 8:00 PM – 9:00 PM
|
||||
Preliminary Round – report for heat room assignment Belle Meade D Sunday, June 29; 1:00 PM – 5:00 PM
|
||||
Preliminary Round – heat rooms Belle Meade A-B-C Sunday, June 29; 1:00 PM – 5:00 PM
|
||||
Semifinalists report for speech time Ryman Studio F Monday, June 30; 12:30 PM – 12:40 PM
|
||||
Semifinal Round – speeches Ryman Studio G Monday, June 30; 1:00 PM – 3:30 PM
|
||||
|
||||
|
||||
Problem Solving – MS
|
||||
Preliminary Round – check-in, design solution, and evaluation Ryman Exhibit Hall B6 Sunday, June 29; 3:00 PM – 6:30 PM
|
||||
|
||||
|
||||
STEM Animation – MS
|
||||
Semifinalist team representative report for presentation time Cheekwood C Sunday, June 29; 11:00 AM – 11:10 AM
|
||||
Semifinal Round – presentations Cheekwood C Sunday, June 29; 11:30 AM – 2:00 PM
|
||||
|
||||
|
||||
Tech Bowl - MS
|
||||
Preliminary Round – test Ryman Exhibit Hall B6 Saturday, June 28; 11:00 AM – 12:30 PM
|
||||
Semifinal Round – holding room Cheekwood G Monday, June 30; 1:00 PM – 4:00 PM
|
||||
Semifinal Round – competition room Cheekwood F Monday, June 30; 1:00 PM – 4:00 PM
|
||||
|
||||
|
||||
|
||||
Vlogging – MS
|
||||
Semifinalists team representative meeting to receive the on-site challenge Lincoln A Saturday, June 28; 7:00 PM – 7:30 PM
|
||||
Semifinal Round – submit entry by 36 hour deadline Online submission Monday, June 30; 7:00 AM – 7:30 AM
|
||||
|
||||
|
||||
Website Design – MS
|
||||
Semifinalists team representative report for interview time Cheekwood A Sunday, June 29; 11:00 AM – 11:10 AM
|
||||
Semifinal Round – interviews Cheekwood A Sunday, June 29; 11:30 AM – 2:00 PM
|
||||
|
||||
|
||||
|
||||
General Schedule
|
||||
#TSA, Inc. Board of Directors Meeting June 26 5:00 PM — 6:00 PM Bayou E
|
||||
#TSA, Inc. Board of Directors/National Officers Dinner June 26 6:00 PM — 8:00 PM TBD
|
||||
#National TSA Officer Candidates Meeting June 27 3:00 PM — 4:00 PM Delta Ballroom
|
||||
#Mandatory Coordinators Meeting June 27 5:00 PM — 6:00 PM Presidential Chamber B
|
||||
#Information Desk Open June 27 5:00 PM — 8:00 PM Delta Ballroom Reg Desk C
|
||||
Individual Packet Pick Up - Information Desk June 27 6:00 PM — 8:00 PM Delta Ballroom Reg Desk C
|
||||
Mandatory State Delegation Meetings June 27 6:00 PM — 7:30 PM Various Locations
|
||||
#Competitive Event Check-In (for selected events) June 27 7:30 PM — 9:30 PM Various Locations
|
||||
#Curfew June 27 10:00 PM
|
||||
#Competitive Event Submission - Select Events June 28 6:45 AM — 8:45 AM Various Locations
|
||||
#State Flag Representatives Meeting June 28 7:15 AM — 8:45 AM Delta Ballroom
|
||||
#Information Desk Open June 28 8:00 AM — 5:00 PM Delta Ballroom Reg Desk C
|
||||
Opening General Session (General Session I) June 28 9:00 AM — 11:00 AM Delta Ballroom
|
||||
TSA Pin Exchange June 28 11:00 AM — 1:00 PM Presidential Lobby
|
||||
#Advisor Update Meeting June 28 11:30 AM — 12:30 PM Presidential Ballroom D
|
||||
#Competitive Events June 28 11:00 AM — 7:00 PM Various Locations
|
||||
#State Advisor Forum June 28 12:30 PM — 2:30 PM Bayou C
|
||||
#State Presidents Meeting June 28 1:00 PM — 2:00 PM Delta Island E
|
||||
#State Officers Network Session June 28 2:00 PM — 3:00 PM Delta Island E
|
||||
#Middle School - Static Event Submission June 28 2:00 PM — 4:00 PM Ryman Exhibit Hall B3
|
||||
#High School - Static Event Submission June 28 4:30 PM — 6:30 PM Ryman Exhibit Hall B4
|
||||
#State Delegation Meetings June 28 6:00 PM — 9:30 PM Various Locations
|
||||
#Curfew June 28 10:00 PM
|
||||
#Competitive Event Submission - Select Events June 29 7:00 AM — 8:30 AM Various Locations
|
||||
#Information Desk Open June 29 8:00 AM — 5:00 PM Delta Ballroom Reg Desk C
|
||||
Recognition Assembly (General Session II) June 29 9:00 AM — 11:00 AM Delta Ballroom
|
||||
TSA Pin Exchange June 29 11:00 AM — 1:00 PM Presidential Lobby
|
||||
#Competitive Events June 29 11:00 AM — 7:00 PM Various Locations
|
||||
#Advisor Update Meeting June 29 11:30 AM — 12:30 PM Presidential Ballroom D
|
||||
TSA Meet and Greet June 29 1:00 PM — 5:00 PM Delta Lobby B/C/D
|
||||
#State Delegation Meetings June 29 6:00 PM — 9:30 PM Various Locations
|
||||
#Curfew June 29 10:00 PM
|
||||
#Voting Delegate Seating June 30 7:00 AM — 7:30 AM Delta Ballroom
|
||||
#Voting Delegate Session June 30 7:30 AM — 9:00 AM Delta Ballroom
|
||||
#Information Desk Open June 30 8:00 AM — 5:00 PM Delta Ballroom Reg Desk C
|
||||
Annual Business Meeting (General Session III) June 30 9:00 AM — 11:00 AM Delta Ballroom
|
||||
TSA Pin Exchange June 30 11:00 AM — 1:00 PM Presidential Lobby
|
||||
#Competitive Events June 30 11:00 AM — 6:00 PM Various Locations
|
||||
#Advisor Update Meeting June 30 11:30 AM — 12:30 PM Presidential Ballroom D
|
||||
#TSA, Inc. Corporate Member Annual Meeting June 30 12:30 PM — 2:30 PM Bayou E
|
||||
#CRC/Students Forum June 30 12:30 PM — 1:15 PM Delta Island E
|
||||
#CRC/Advisors Forum June 30 1:15 PM — 2:30 PM Delta Island E
|
||||
#State Delegation Meetings June 30 6:00 PM — 9:30 PM Various Locations
|
||||
#Curfew June 30 10:00 PM
|
||||
#Information Desk Open July 1 7:30 AM — 8:30 AM Delta Ballroom Reg Desk C
|
||||
Awards Ceremony (General Session IV) July 1 7:30 AM — 10:30 AM Delta Ballroom
|
||||
#National TSA Officers Meeting (new officers) July 1 11:00 AM — 12:00 PM Delta Island Boardroom
|
||||
|
||||
Volunteer - Grant
|
||||
State Flag Representative Meeting June 28 7:00 AM - 8:00 AM Jackson F
|
||||
Binary file not shown.
@@ -0,0 +1,35 @@
|
||||
"Member Type","Member ID","First Name","Middle Initial","Last Name","Home Phone","Cell Phone","Email","Grade","Gender","Individual Affiliation Type","Demographic","Member Title","T-Shirt Size","Paid"
|
||||
"Chapter Advisor","","Sandra","G","Burnette","","(865) 310-1399","sgburnette@ortn.edu","","","Middle School","","Primary","XL","Yes"
|
||||
"Chapter Advisor","","Jim","","Kolpack","","(865) 924-7600","james.kolpack@gmail.com","","","Middle School","","Secondary","","Yes"
|
||||
"Chapter Advisor","","Bryson","","Leftwich","","(865) 617-3552","blleftwich@ortn.edu","","","Middle School","","Secondary","","Yes"
|
||||
"Student","831177","Ifeoluwa","","Abiodun-Adeniyi","","","osu4mech@yahoo.com","8","Male","Middle School","Black/African-American","Member","","Yes"
|
||||
"Student","924213","Ainsley","","Alden","","","","5","Female","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","800323","Tavaris","","Blanco","","","blancosd@gmail.com","8","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","831173","Chase","","Bolin","","","wilkerson103@comcast.net","6","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","831174","Rylan","","Bolin","","","bolineev@gmail.com","8","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","702470","Lillian","","Borboa","","","BORBOLIL000@ortn.edu","8","Female","Middle School","White/Caucasian","Member","S","Yes"
|
||||
"Student","820332","Tucker","","Brady","","","jbrady08@hotmail.com","7","Male","Middle School","White/Caucasian","Member","S","Yes"
|
||||
"Student","924305","Cole","","Callaghan","","","","7","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","800328","Adaiah","","Carmon","","","adaiahhcarmon@gmail.com","7","Male","Middle School","Black/African-American","Member","M","Yes"
|
||||
"Student","924210","Isaiah","","Carmon","","","","5","Male","Middle School","Black/African-American","Member","","Yes"
|
||||
"Student","922730","Isabella","","Chesson","","","","8","Female","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","924216","Peter","","Cromwell","","","","6","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","924302","Lucas","","Dean","","","","5","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","924310","Aston","","Eldridge","","","","6","Male","Middle School","Hispanic/Latino","Member","","Yes"
|
||||
"Student","800321","Avery","","Fischer","","","chipfischer@att.net","6","Female","Middle School","White/Caucasian","Member","S","Yes"
|
||||
"Student","712415","Ben","","Greear","","","benmgreear@gmail.com","8","Male","Middle School","White/Caucasian","Member","S","Yes"
|
||||
"Student","831172","Eliam","","Herman","","","hermann.sevrin@gmail.com","7","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","800316","Miauna","","Jones","","","miaunajones671@gmail.com","8","Female","Middle School","Asian/Asian-American/Pacific Islander","Member","M","Yes"
|
||||
"Student","800315","Grant","","Kolpack","","","grant.kolpack@gmail.com","7","Male","Middle School","White/Caucasian","Member","S","Yes"
|
||||
"Student","702477","Wyatt","","Laney","","","mekboyz@hotmail.com","8","Male","Middle School","White/Caucasian","Member","S","Yes"
|
||||
"Student","800320","Ryen","","Marx","","","jamjen2k@gmail.com","8","Male","Middle School","Hispanic/Latino","Member","M","Yes"
|
||||
"Student","800317","Raylee","","McDonald-Tolve","","","rayleesmommy@gmail.com","8","Female","Middle School","White/Caucasian","Member","S","Yes"
|
||||
"Student","924314","Ellie","","McKee","","","","6","Female","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","800322","Kyle","","Moulton","","","bkm1953@hotmail.com","6","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","924208","Lydia","","Naeve","","","","8","Female","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","924317","Susanna","","Naeve","","","","6","Female","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","924211","Abby","","Schlesser","","","","5","Female","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","702464","David","","Schlesser","","","krittenmarie@yahoo.com","8","Male","Middle School","White/Caucasian","Member","L","Yes"
|
||||
"Student","831171","Keegan","","Toth","","","tothgaggle@gmail.com","8","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","800325","Ian","","Underwood","","","reginau.0710@gmail.com","8","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
"Student","800319","Thomas","","White","","","Littletraci76@yahoo.com","7","Male","Middle School","White/Caucasian","Member","","Yes"
|
||||
|
@@ -0,0 +1,37 @@
|
||||
Team Name,Event Name,Student 1,Student 2,Student 3,Student 4,Student 5,Student 6,Student 7
|
||||
Biotechnology,,,,,,,,
|
||||
Career Prep ⁱ,,"Underwood, Ian",,,,,
|
||||
Challenging Technology Issues ᵃ,,"Schlesser, David","White, Thomas",,,,,
|
||||
Chapter Team ᵃ,,,,,,,,
|
||||
Children's Stories,,"Borboa, Lillian","Fischer, Avery","Jones, Miauna","Kolpack, Grant","Schlesser, Abby",,
|
||||
Coding ᵃ,,"Callaghan, Cole","Carmon, Isaiah","Toth, Keegan","Eldridge, AJ",,,
|
||||
Community Service Video,,"Carmon, Isaiah",,,,,,
|
||||
CAD foundations ᵃ ⁱ,,"Carmon, Adaiah","Kolpack, Grant",,,,,
|
||||
Construction Challenge,,"Alden, Ainsley","Bolin, Rylan","Fischer, Avery","Greear, Ben","Marx, Ryen","McKee, Ellie",
|
||||
Cybersecurity ᵃ ⁱ,,,,,,,,
|
||||
Data Science & Analytics ᵃ,,,,,,,,
|
||||
Digital Photography ᵃ ⁱ,,"McDonald, Raylee","Naeve, Suse",,,,,
|
||||
Dragster ᵃ ⁱ,,"Abiodun-Adeniyi, Ife","Schlesser, David",,,,,
|
||||
Electrical Applications ᵃ,,"Eldridge, AJ","Bolin, Rylan",,,,,
|
||||
Essays on Technology ᵃ ⁱ,,"Jones, Miauna",,,,,,
|
||||
Flight ᵃ ⁱ,,"Blanco, Tavi","Greear, Ben",,,,,
|
||||
Forensic Technology ᵃ,,,,,,,,
|
||||
Inventions & Innovations,,"Blanco, Tavi","Cromwell, Peter","Hermann, Eliam","Moulton, Kyle","Toth, Keegan","White, Thomas",
|
||||
Junior Solar Sprint ᵃ,,"Abiodun-Adeniyi, Ife","Dean, Lucas","Marx, Ryen","Schlesser, David",,,
|
||||
Leadership Strategies,,"Blanco, Tavi","Borboa, Lillian","Chesson, Bella","Hermann, Eliam","Underwood, Ian","White, Thomas",
|
||||
Mass Production,,"Jones, Miauna",Ellie McKee,"Schlesser, Abby",,,,
|
||||
Mechanical Engineering ᵃ,,"Alden, Ainsley","Cromwell, Peter","Marx, Ryen","McDonald, Raylee","Moulton, Kyle","Schlesser, David",
|
||||
Medical Technology ᵃ,,"Chesson, Bella","McDonald, Raylee","Naeve, Lydia",,,,
|
||||
Microcontroller Design ᵃ,,"Dean, Lucas",,,,,,
|
||||
Off the Grid,,"Alden, Ainsley","Blanco, Tavi","Chesson, Bella","McKee, Ellie","Naeve, Lydia","Naeve, Suse",Avery Fischer
|
||||
Prepared Speech ᵃ ⁱ,,"Hermann, Eliam","Toth, Keegan",,,,,
|
||||
Problem Solving ᵃ,,"Greear, Ben","Schlesser, Abby",,,,,
|
||||
Promotional Marketing ᵃ ⁱ,,"Borboa, Lillian","Naeve, Lydia",,,,,
|
||||
STEM Animation,,"Borboa, Lillian","Brady, Tucker","Callaghan, Cole","Carmon, Adaiah","Kolpack, Grant",,
|
||||
Structural Engineering ᵃ,,"Bolin, Rylan","Fischer, Avery","Laney, Wyatt",Ben Greear,,,
|
||||
System Control Technology ᵃ,,"Brady, Tucker","Hermann, Eliam","Schlesser, David",,,,
|
||||
Tech Bowl ᵃ,,"Bolin, Rylan","Cromwell, Peter","Greear, Ben","Laney, Wyatt","White, Thomas","Abiodun-Adeniyi, Ife",
|
||||
Technical Design ᵃ,,,,,,,,
|
||||
Video Game Design,,"Brady, Tucker","Callaghan, Cole","Carmon, Adaiah","Carmon, Isaiah","Dean, Lucas","Toth, Keegan","Herman, Eliam"
|
||||
Vlogging ᵃ,,"Laney, Wyatt","Moulton, Kyle","Naeve, Suse","Naeve, Lydia",,,
|
||||
Website Design,,"Bolin, Rylan","Brady, Tucker","Kolpack, Grant","Laney, Wyatt","Marx, Ryen","Eldridge, AJ",
|
||||
|
Binary file not shown.
@@ -0,0 +1,78 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<None Remove="Parsers\TestInput\2023-24 RMS TSA student & event - Event Definitions.csv" />
|
||||
<None Remove="Parsers\TestInput\2023-24 RMS TSA student & event - Student Event Rankings.csv" />
|
||||
<None Remove="Parsers\TestInput\2023-24 RMS TSA student & event - Teams.csv" />
|
||||
<None Remove="Parsers\TestInput\2024 TN TSA State Competition Event Times.txt" />
|
||||
<None Remove="Parsers\TestInput\2024-25 RMS TSA student & event - assumptions.csv" />
|
||||
<None Remove="Parsers\TestInput\2024-25 RMS TSA student & event - Event Definitions.csv" />
|
||||
<None Remove="Parsers\TestInput\2024-25 RMS TSA student & event - Student Event Rankings.csv" />
|
||||
<None Remove="Parsers\TestInput\2024-25 RMS TSA student & event - Teams.csv" />
|
||||
<None Remove="Parsers\TestInput\teams 20231025.csv" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||
<PackageReference Include="NUnit" Version="3.13.3" />
|
||||
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" />
|
||||
<PackageReference Include="NUnit.Analyzers" Version="3.6.1" />
|
||||
<PackageReference Include="coverlet.collector" Version="3.2.0" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Core\Core.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Parsers\TestInput\2024-25 RMS TSA student & event - assumptions.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Parsers\TestInput\2024-25 RMS TSA student & event - Event Definitions.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Parsers\TestInput\2023-24 RMS TSA student & event - Event Definitions.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Parsers\TestInput\2024-25 RMS TSA student & event - Nationals Student Event Rankings.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Parsers\TestInput\2024-25 RMS TSA student & event - Student Event Rankings.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Parsers\TestInput\2023-24 RMS TSA student & event - Student Event Rankings.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Parsers\TestInput\2023-24 RMS TSA student & event - Teams.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Parsers\TestInput\2024 TN TSA State Competition Event Times.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Parsers\TestInput\2024-25 RMS TSA student & event - Nationals Teams.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Parsers\TestInput\2024-25 RMS TSA student & event - Teams.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Include="Parsers\TestInput\teams 20231025.csv">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Update="Parsers\TestInput\2025 TSA Nationals Competition Event Times.txt.bak">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="Parsers\TestInput\2025 TSA Nationals Competition Event Times.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="Parsers\TestInput\2025 TN TSA State Competition Event Times.txt">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,356 @@
|
||||
using System.Diagnostics;
|
||||
using System.Text.Json;
|
||||
using System.Text.RegularExpressions;
|
||||
using Core.Calculation;
|
||||
using Core.Entities;
|
||||
using Core.Parsers;
|
||||
using Core.Utility;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Web.Models;
|
||||
|
||||
namespace Web.Controllers
|
||||
{
|
||||
public partial class HomeController : Controller
|
||||
{
|
||||
private const string ContentDirectory = @"C:\Users\james\source\TSA Chapter Organizer\Tests\Parsers\TestInput\";
|
||||
|
||||
private CompetitiveEvent[] GetCompetitiveEvents()
|
||||
{
|
||||
var fileInfo = FileUtility.GetContentFile(ContentDirectory, "2024-25 RMS TSA student & event - Event Definitions.csv");
|
||||
var eventRankingsParser = new EventDefinitionParser(fileInfo);
|
||||
return eventRankingsParser.Parse();
|
||||
}
|
||||
|
||||
private Student[] GetStudents(IList<CompetitiveEvent> events)
|
||||
{
|
||||
var fileInfo = FileUtility.GetContentFile(ContentDirectory, "2024-25 RMS TSA student & event - Nationals Student Event Rankings.csv");
|
||||
var eventRankingsParser = new StudentParser(fileInfo);
|
||||
return eventRankingsParser.Parse(events);
|
||||
}
|
||||
|
||||
public Team[] GetTeams(IList<CompetitiveEvent> competitiveEvents, IList<Student> students)
|
||||
{
|
||||
var studentEventRankingsCsv = "2024-25 RMS TSA student & event - Nationals Teams.csv";
|
||||
|
||||
var fileInfo = FileUtility.GetContentFile(ContentDirectory, studentEventRankingsCsv);
|
||||
var eventRankingsParser = new TeamParser(fileInfo);
|
||||
var teams = eventRankingsParser.Parse(competitiveEvents, students);
|
||||
|
||||
foreach (var student in students)
|
||||
{
|
||||
student.Teams = teams.Where(t => t.Students.Contains(student)).ToList();
|
||||
}
|
||||
return teams;
|
||||
}
|
||||
|
||||
public AssignmentAssumption[] GetAssignmentAssumptions(IList<CompetitiveEvent> competitiveEvents, IList<Student> students)
|
||||
{
|
||||
var assumptionsCsv = "2024-25 RMS TSA student & event - assumptions.csv";
|
||||
|
||||
var fileInfo = FileUtility.GetContentFile(ContentDirectory, assumptionsCsv);
|
||||
var assumptionParser = new AssignmentAssumptionParser(fileInfo);
|
||||
var assumptions = assumptionParser.Parse(competitiveEvents, students);
|
||||
|
||||
return assumptions;
|
||||
}
|
||||
|
||||
public IDictionary<CompetitiveEvent, List<EventOccurrence>> GetStateEventOccurrences(IList<CompetitiveEvent> competitiveEvents)
|
||||
{
|
||||
var eventTimesFilename = "2025 TN TSA State Competition Event 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)
|
||||
{
|
||||
var eventTimesFilename = "2025 TSA Nationals Competition Event Times.txt";
|
||||
var fileInfo = FileUtility.GetContentFile(ContentDirectory, eventTimesFilename);
|
||||
var parser = new EventOccurrenceParser(fileInfo, competitiveEvents);
|
||||
var nationalEventOccurrences = parser.Parse();
|
||||
|
||||
var locationPrefixes = new[] { "Cheekwood", "Ryman", "Lincoln", "Canal", "Online", "Magnolia", "Tennessee", "Bayou", "Hermitage", "Belmont", "Davidson", "Washington", "Belle Meade"};
|
||||
var oredLocations = string.Join("|", locationPrefixes);
|
||||
var regex = new Regex($"^(.*)((?:{oredLocations}).*)");
|
||||
|
||||
foreach (var occurrence in nationalEventOccurrences)
|
||||
{
|
||||
foreach (var eventOccurrence in occurrence.Value)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(eventOccurrence.Location))
|
||||
continue;
|
||||
var match = regex.Match(eventOccurrence.Name);
|
||||
if (!match.Success)
|
||||
continue;
|
||||
eventOccurrence.Name = match.Groups[1].Value.Trim();
|
||||
eventOccurrence.Location = match.Groups[2].Value.Trim();
|
||||
}
|
||||
}
|
||||
return nationalEventOccurrences;
|
||||
|
||||
}
|
||||
|
||||
private readonly ILogger<HomeController> _logger;
|
||||
|
||||
public HomeController(ILogger<HomeController> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public IActionResult Index()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
public IActionResult Events()
|
||||
{
|
||||
var competitiveEvents = GetCompetitiveEvents().Where(e => e.Name != "Chapter Team").ToArray();
|
||||
return View(competitiveEvents);
|
||||
}
|
||||
|
||||
public IActionResult StudentEventHandout()
|
||||
{
|
||||
var competitiveEvents = GetCompetitiveEvents();
|
||||
var students = GetStudents(competitiveEvents);
|
||||
var teams = GetTeams(competitiveEvents, students);
|
||||
|
||||
return View(Tuple.Create(students));
|
||||
}
|
||||
|
||||
public IActionResult StudentEvents()
|
||||
{
|
||||
var competitiveEvents = GetCompetitiveEvents();
|
||||
var students = GetStudents(competitiveEvents);
|
||||
|
||||
var eventStudentPicksArray = DataProcessing.GetEventStudentPicks(competitiveEvents, students);
|
||||
var assignmentParameters = new AssignmentParameters
|
||||
{
|
||||
EffortUpperBound = 9,
|
||||
RequireOnSite = true,
|
||||
RequireRegional = true,
|
||||
TeamSizeLimit = 4
|
||||
};
|
||||
|
||||
var eventAssignment = new EventAssigner(competitiveEvents, students, assignmentParameters);
|
||||
|
||||
var assignmentAssumptions = GetAssignmentAssumptions(competitiveEvents, students);
|
||||
|
||||
foreach (var assumption in assignmentAssumptions)
|
||||
{
|
||||
switch (assumption.Assumption)
|
||||
{
|
||||
case Assumption.Exclude:
|
||||
eventAssignment.ExcludeFromEvent(assumption.EventAssignment);
|
||||
break;
|
||||
case Assumption.Include:
|
||||
eventAssignment.AssignToEvent(assumption.EventAssignment);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
eventAssignment.RemoveEvent(new List<CompetitiveEvent>
|
||||
{
|
||||
competitiveEvents.First(e => e.Name == "Chapter Team")
|
||||
});
|
||||
|
||||
eventAssignment.IncludedEvents(new List<CompetitiveEvent>
|
||||
{
|
||||
//competitiveEvents.First(e => e.Name == "System Control Technology")
|
||||
});
|
||||
|
||||
|
||||
var eventAssignmentsList = eventAssignment.Solve();
|
||||
return View(Tuple.Create(competitiveEvents, students, eventStudentPicksArray, eventAssignmentsList, assignmentParameters));
|
||||
}
|
||||
|
||||
public IActionResult Teams()
|
||||
{
|
||||
var competitiveEvents = GetCompetitiveEvents();
|
||||
var students = GetStudents(competitiveEvents);
|
||||
var teams = GetTeams(competitiveEvents, students);
|
||||
|
||||
//teams = teams.Where(t => t.Event.RegionalEvent).ToArray();
|
||||
|
||||
return View(Tuple.Create(teams));
|
||||
}
|
||||
|
||||
public IActionResult Regionals()
|
||||
{
|
||||
var competitiveEvents = GetCompetitiveEvents();
|
||||
var students = GetStudents(competitiveEvents);
|
||||
var teams = GetTeams(competitiveEvents, students);
|
||||
|
||||
teams = teams.Where(t => t.Event.RegionalEvent).ToArray();
|
||||
var enumerable = students.Where(s => !teams.SelectMany(ts => ts.Students).Contains(s)).ToArray();
|
||||
|
||||
return View(Tuple.Create(teams, enumerable));
|
||||
}
|
||||
|
||||
public IActionResult State()
|
||||
{
|
||||
var competitiveEvents = GetCompetitiveEvents();
|
||||
var students = GetStudents(competitiveEvents);
|
||||
var teams = GetTeams(competitiveEvents, students);
|
||||
var eventOccurrences = GetStateEventOccurrences(competitiveEvents);
|
||||
|
||||
// Filter out pre-conference
|
||||
eventOccurrences =
|
||||
(from kv in eventOccurrences
|
||||
let newV = kv.Value.Where(eo => !eo.Name.Contains("Pre-Conference"))
|
||||
select Tuple.Create(kv.Key, newV))
|
||||
.ToDictionary(s => s.Item1, s => s.Item2.ToList());
|
||||
|
||||
return View(Tuple.Create(teams, students, eventOccurrences));
|
||||
}
|
||||
public IActionResult Nationals()
|
||||
{
|
||||
var competitiveEvents = GetCompetitiveEvents();
|
||||
var students = GetStudents(competitiveEvents);
|
||||
var teams = GetTeams(competitiveEvents, students);
|
||||
var eventOccurrences = GetNationalEventOccurrences(competitiveEvents);
|
||||
|
||||
// Filter out pre-conference
|
||||
eventOccurrences =
|
||||
(from kv in eventOccurrences
|
||||
let newV = kv.Value.Where(eo => !eo.Name.Contains("Pre-Conference"))
|
||||
select Tuple.Create(kv.Key, newV))
|
||||
.ToDictionary(s => s.Item1, s => s.Item2.ToList());
|
||||
|
||||
return View(Tuple.Create(teams, students, eventOccurrences));
|
||||
}
|
||||
|
||||
public IActionResult TeamGrid()
|
||||
{
|
||||
var competitiveEvents = GetCompetitiveEvents();
|
||||
var students = GetStudents(competitiveEvents);
|
||||
var teams = GetTeams(competitiveEvents, students);
|
||||
|
||||
return View(Tuple.Create(teams, students));
|
||||
}
|
||||
|
||||
public IActionResult Students()
|
||||
{
|
||||
var competitiveEvents = GetCompetitiveEvents();
|
||||
var students = GetStudents(competitiveEvents);
|
||||
GetTeams(competitiveEvents, students);
|
||||
|
||||
return View(Tuple.Create(students));
|
||||
}
|
||||
|
||||
public static Func<T, bool> And<T>(params Func<T, bool>[] predicates)
|
||||
{
|
||||
return t => predicates.All(predicate => predicate(t));
|
||||
}
|
||||
|
||||
public IActionResult Schedule()
|
||||
{
|
||||
var scheduleOptions =
|
||||
new ScheduleOptions(
|
||||
timeSlots: 3,
|
||||
mustIncludeEvents:new []
|
||||
{
|
||||
"Medical Technology", "Electrical Applications" //, "RegionalTeam",
|
||||
,"Dragster", "Flight"
|
||||
},
|
||||
extended: new string[]
|
||||
{
|
||||
"Invention", "Construction Challenge", "Mechanical", "Mass", "Micro"
|
||||
//"STEM"
|
||||
//"Community", "Vlogging"// "Microcontroller"
|
||||
},
|
||||
omittedEvents: new string[]
|
||||
{
|
||||
"Vlogging", "Junior", "Community Service Video", "Digital Photography",
|
||||
"STEM"
|
||||
|
||||
//"Leadership",// "Electrical", //"Construction"
|
||||
// "Forensic",
|
||||
//"CAD"
|
||||
//"I&I Team 1", "I&I Team 2"//, "Website Design",
|
||||
},
|
||||
absentStudents: new string[]
|
||||
{
|
||||
//"Eliam"
|
||||
},
|
||||
reverse: true,
|
||||
slotPush:0);
|
||||
|
||||
var events = GetCompetitiveEvents();
|
||||
var students = GetStudents(events);
|
||||
|
||||
var allTeams = GetTeams(events, students);
|
||||
|
||||
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 RegionalTeamPredicate(Team t) => RegionalPredicate(t) && TeamPredicate(t);
|
||||
bool HighEffort(Team t) => t.Event.LevelOfEffort == 3;
|
||||
bool LowEffort(Team t) => t.Event.LevelOfEffort == 1;
|
||||
|
||||
bool RegionalTeamSomeEffortPredicate(Team t) => RegionalTeamPredicate(t) && !LowEffort(t);
|
||||
|
||||
bool IndividualPredicate(Team t) => t.Event.Format is EventFormat.Individual;
|
||||
bool negativePredicate(Team t) => false;
|
||||
|
||||
var mustIncludeTeams =
|
||||
from e in events
|
||||
from t in allTeams
|
||||
where t.Event == e &&
|
||||
(scheduleOptions.MustIncludeEvents?.Any(s => s == "RegionalTeam") == true && RegionalTeamSomeEffortPredicate(t)
|
||||
|| scheduleOptions.MustIncludeEvents?.Any( t.Event.Name.Contains) == true
|
||||
|| HighEffort(t))
|
||||
select t;
|
||||
|
||||
Debug.WriteLine("Must Include: " + string.Join(", ", mustIncludeTeams.Select(t => t.ToStringWithIndividualAndRegional())));
|
||||
Debug.WriteLine("Omitted: " + string.Join(", ", omittedEvents.Select(t => t.ToStringWithIndividualAndRegional())));
|
||||
|
||||
var teamScheduler = new TeamScheduler(mustIncludeTeams.ToArray(), scheduleOptions.TimeSlots);
|
||||
var schedule = teamScheduler.Solve();
|
||||
|
||||
//schedule = schedule.OrderByDescending(ts => new Random(schedule.GetHashCode() + 1).Next()).ToArray();
|
||||
|
||||
if (scheduleOptions.SlotPush != 0)
|
||||
{
|
||||
schedule = schedule.Skip(scheduleOptions.SlotPush).Concat(schedule.Take(scheduleOptions.SlotPush))
|
||||
.ToArray();
|
||||
}
|
||||
if (scheduleOptions.Reverse)
|
||||
schedule = schedule.Reverse().ToArray();
|
||||
|
||||
////// extend schedules
|
||||
var extendedTeams =
|
||||
from t in allTeams
|
||||
where
|
||||
scheduleOptions.MustIncludeEvents?.Any(s => scheduleOptions.ExtendedTeams?.Any(et => t.Name.Contains(et)) == true) == true
|
||||
select t;
|
||||
|
||||
foreach (var extendedTeam in extendedTeams)
|
||||
{
|
||||
schedule = new UnassignedStudentScheduler(allTeams, schedule).AddAdditionalTimeSlot(extendedTeam);
|
||||
}
|
||||
|
||||
schedule = new UnassignedStudentScheduler(allTeams, schedule).ScheduleStrategy(UnassignedScheduleStrategy.LevelOfEffort);
|
||||
schedule = new UnassignedStudentScheduler(allTeams, schedule).ScheduleStrategy(UnassignedScheduleStrategy.BiggestGroup);
|
||||
schedule = new UnassignedStudentScheduler(allTeams, schedule).ScheduleStrategy(UnassignedScheduleStrategy.IndividualEvents);
|
||||
//schedule = new UnassignedStudentScheduler(allTeams, schedule).ScheduleStrategy(UnassignedScheduleStrategy.AnyNotMeetingAlready);
|
||||
|
||||
var unassignedStudents = UnassignedStudentScheduler.UnassignedStudents(students, schedule).ToArray();
|
||||
|
||||
return View(Tuple.Create(schedule, unassignedStudents, scheduleOptions));
|
||||
}
|
||||
|
||||
public IActionResult Privacy()
|
||||
{
|
||||
return View();
|
||||
}
|
||||
|
||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||
public IActionResult Error()
|
||||
{
|
||||
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
namespace Web.Controllers;
|
||||
|
||||
public partial class HomeController
|
||||
{
|
||||
public class ScheduleOptions(
|
||||
int timeSlots = 3,
|
||||
string[]? absentStudents = null,
|
||||
string[]? extended = null,
|
||||
string[]? omittedEvents = null,
|
||||
string[]? mustIncludeEvents = null,
|
||||
bool reverse = false,
|
||||
DateTime date = new(),
|
||||
int slotPush = 0
|
||||
)
|
||||
{
|
||||
public int TimeSlots = timeSlots;
|
||||
public string[]? AbsentStudents = absentStudents;
|
||||
public string[]? ExtendedTeams = extended;
|
||||
public string[]? OmittedEvents = omittedEvents;
|
||||
public string[]? MustIncludeEvents = mustIncludeEvents;
|
||||
public bool Reverse { get; } = reverse;
|
||||
public int SlotPush { get; } = slotPush;
|
||||
public DateTime Date { get; } = date == new DateTime() ? DateTime.Today : date;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
namespace Web
|
||||
{
|
||||
public class LabelHelper
|
||||
{
|
||||
public static string GetOrderClass(int pick)
|
||||
{
|
||||
switch (pick)
|
||||
{
|
||||
case 1:
|
||||
return "first-pick";
|
||||
case 2:
|
||||
return "second-pick";
|
||||
case 3:
|
||||
return "third-pick";
|
||||
case 4:
|
||||
return "fourth-pick";
|
||||
case 5:
|
||||
return "fifth-pick";
|
||||
case 6:
|
||||
return "sixth-pick";
|
||||
default:
|
||||
return "non-pick";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace Web.Models
|
||||
{
|
||||
public class ErrorViewModel
|
||||
{
|
||||
public string? RequestId { get; set; }
|
||||
|
||||
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
builder.Services.AddControllersWithViews();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
if (!app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseExceptionHandler("/Home/Error");
|
||||
}
|
||||
app.UseStaticFiles();
|
||||
|
||||
app.UseRouting();
|
||||
|
||||
app.UseAuthorization();
|
||||
|
||||
app.MapControllerRoute(
|
||||
name: "default",
|
||||
pattern: "{controller=Home}/{action=Index}/{id?}");
|
||||
|
||||
app.Run();
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true,
|
||||
"iisExpress": {
|
||||
"applicationUrl": "http://localhost:28852",
|
||||
"sslPort": 0
|
||||
}
|
||||
},
|
||||
"profiles": {
|
||||
"Web": {
|
||||
"commandName": "Project",
|
||||
"dotnetRunMessages": true,
|
||||
"launchBrowser": true,
|
||||
"applicationUrl": "http://localhost:5016",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
},
|
||||
"IIS Express": {
|
||||
"commandName": "IISExpress",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
@model int?
|
||||
@{
|
||||
switch (Model)
|
||||
{
|
||||
case 1:
|
||||
<text>★☆☆</text>
|
||||
break;
|
||||
case 2:
|
||||
<text>★★☆</text>
|
||||
break;
|
||||
case 3:
|
||||
<text>★★★</text>
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
@model int?
|
||||
@{
|
||||
switch (Model)
|
||||
{
|
||||
case 1:
|
||||
<text>☆</text>
|
||||
break;
|
||||
case 2:
|
||||
<text>✯</text>
|
||||
break;
|
||||
case 3:
|
||||
<text>★</text>
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,66 @@
|
||||
@using Core.Entities
|
||||
@using Core.Utility
|
||||
@model CompetitiveEvent[]
|
||||
@{
|
||||
ViewData["Title"] = "Events Page";
|
||||
}
|
||||
<div>
|
||||
@foreach (var evt in Model.OrderBy(e => e.Name))
|
||||
{
|
||||
<div class="container nobrk">
|
||||
@if (evt.RegionalEvent)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<i>Regional Event</i>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<div div class="row">
|
||||
<div class="col-4">
|
||||
<h5>@evt.Name</h5>
|
||||
</div>
|
||||
<div class="col-2">
|
||||
@if (evt.Format is EventFormat.Team)
|
||||
{
|
||||
<html><strong>@evt.Format</strong><br/>Size: <strong>@evt.TeamSize</strong></html>
|
||||
}
|
||||
else
|
||||
{
|
||||
<html>
|
||||
<strong>@evt.Format</strong>
|
||||
</html>
|
||||
}
|
||||
|
||||
</div>
|
||||
<div class="col">
|
||||
Eligibility: @evt.Eligibility
|
||||
</div>
|
||||
<div class="col-1">
|
||||
@Html.Partial("EffortStarsPartial", evt.LevelOfEffort)
|
||||
</div>
|
||||
<div class="col-2">
|
||||
@evt.SemifinalistActivity
|
||||
</div>
|
||||
</div>
|
||||
<div div class="row mt-3">
|
||||
<div class="col">@evt.Description</div></div>
|
||||
@if (!string.IsNullOrEmpty(evt.Theme))
|
||||
{
|
||||
<div div class="row mt-2">
|
||||
<div class="col-3 text-center"><i>Theme for 2024-25:</i></div>
|
||||
<div class="col">@evt.Theme</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (!string.IsNullOrEmpty(evt.Documentation))
|
||||
{
|
||||
<div div class="row mt-2">
|
||||
<div class="col-3 text-center"><i>Materials:</i></div>
|
||||
<div class="col">@evt.Documentation</div>
|
||||
</div>
|
||||
}
|
||||
<hr/>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
@@ -0,0 +1,5 @@
|
||||
@using Core.Entities
|
||||
@using Core.Utility
|
||||
@{
|
||||
ViewData["Title"] = "Home Page";
|
||||
}
|
||||
@@ -0,0 +1,355 @@
|
||||
@using System.Text.RegularExpressions
|
||||
@using Core.Entities
|
||||
@model Tuple<Team[], Student[], IDictionary<CompetitiveEvent, List<EventOccurrence>>>
|
||||
@{
|
||||
ViewData["Title"] = "Teams";
|
||||
var eventOccurrences = Model.Item3;
|
||||
}
|
||||
<div class="container nobrk pt-5">
|
||||
<h2>Nationals Events</h2>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Team</td>
|
||||
<td>Team Members</td>
|
||||
<td>Dates</td>
|
||||
<td>Materials</td>
|
||||
|
||||
</tr>
|
||||
</thead>
|
||||
@foreach (var team in Model.Item1)
|
||||
{
|
||||
var students = team.Students;
|
||||
@if (true @* team.Event.Format == EventFormat.Team *@)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
@* <strong class="@{ GetTeamClass(team);}">@team.Name</strong> *@
|
||||
@team.Name @* #@team.TeamNumber
|
||||
*@ </td>
|
||||
<td>
|
||||
@{
|
||||
var first = true;
|
||||
}
|
||||
@foreach (var student in students.OrderByDescending(s => (s.Grade + s.TsaYear) * (team.Captain == s ? 2 : 1)).ThenBy(s => s.FirstNameLastName))
|
||||
{
|
||||
@if (!first)
|
||||
{
|
||||
<text>, </text>
|
||||
|
||||
}
|
||||
first = false;
|
||||
@student.FirstNameLastName @if (team.Captain == student)
|
||||
{
|
||||
<text> (Cpt. @team.Captain.NationalID)</text>
|
||||
}
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
@* @if (team.Event.StatePresubmission)
|
||||
{
|
||||
<text>Pre-submission due Friday, March 14</text>
|
||||
}
|
||||
@if (team.Event.StatePretesting)
|
||||
{
|
||||
<text>Pre-testing Wednesday, April 2nd</text>
|
||||
}
|
||||
@if (team.Event.StatePreliminaryRound)
|
||||
{
|
||||
<text>Preliminary and Semifinalist Rounds</text>
|
||||
} *@
|
||||
</td>
|
||||
<td>
|
||||
@team.Event.Documentation
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
}
|
||||
@* else if (team.Event.Format == EventFormat.Individual)
|
||||
{
|
||||
foreach (var student in students)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
@team.Event.Name - @student.FirstNameLastName (@student.RegionalID)
|
||||
</td>
|
||||
<td>@team.RegionalTimeSlot</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
}
|
||||
} *@
|
||||
}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@{
|
||||
var s = Model.Item2.OrderBy(s => s.LastNameFirstName);
|
||||
|
||||
@foreach (var student in s)
|
||||
{
|
||||
<div class="container nobrk pt-5" style="page-break-before: always;">
|
||||
|
||||
<h3>@student.FirstNameLastName - @student.NationalID</h3>
|
||||
<h4>TSA 2025 Nationals Schedule</h4>
|
||||
<div class="row">
|
||||
<div class="col col-2">Events</div>
|
||||
<div class="col">
|
||||
@foreach (var ev in student.Teams)
|
||||
{
|
||||
<div class="row">
|
||||
|
||||
<div class="col col-2">
|
||||
@if (ev.Event.Format is EventFormat.Team)
|
||||
{
|
||||
@ev.TeamNumber
|
||||
}
|
||||
else
|
||||
{
|
||||
@ev.Captain.NationalID
|
||||
}
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<text> @ev.Name
|
||||
@if (ev.Captain == student)
|
||||
{
|
||||
<strong>(Cpt.)</strong>
|
||||
}
|
||||
</text>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
@ev.Event.SemifinalistActivity
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Time</td>
|
||||
<td>Event</td>
|
||||
<td></td>
|
||||
<td>Location</td>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
@foreach (var date in
|
||||
eventOccurrences
|
||||
.Where(eo =>
|
||||
student.Teams.Select(t => t.Event).Any(a => a == eo.Key)
|
||||
|| eo.Key == CompetitiveEvent.GeneralSchedule
|
||||
|| (eo.Key == CompetitiveEvent.VotingDelegates && student.VotingDelegate))
|
||||
.SelectMany(eo => eo.Value.Select(v => Tuple.Create(v, eo.Key)))
|
||||
.GroupBy(de => de.Item1.StartTime.Date)
|
||||
.OrderBy(d => d.Key)
|
||||
)
|
||||
{
|
||||
var eventsForThisDay =
|
||||
date
|
||||
.Where(de => de.Item1.Name != "Judging")
|
||||
.Where(de => de.Item1.StartTime > new DateTime(2024, 3, 1))
|
||||
// filter out occurrences where non-captain
|
||||
.Where(de =>
|
||||
!de.Item1.SignupSubmitPickup
|
||||
|| de.Item2.Format is EventFormat.Individual
|
||||
|| student.Teams.Any(t => t.Captain == student && t.Event == de.Item2)
|
||||
)
|
||||
.OrderBy(de => de.Item1.StartTime);
|
||||
|
||||
@if (!eventsForThisDay.Any())
|
||||
continue;
|
||||
<tr>
|
||||
|
||||
<td colspan="4" class="align-content-center text-center fw-bold">@date.Key.ToString("MMMM d")</td>
|
||||
</tr>
|
||||
@foreach (var eventOccurrence in eventsForThisDay.OrderBy(de => de.Item1.StartTime))
|
||||
{
|
||||
|
||||
string hlClass = null;
|
||||
@if (!eventOccurrence.Item2.Name.Contains("General"))
|
||||
{
|
||||
hlClass = "fw-bold";
|
||||
}
|
||||
|
||||
<tr>
|
||||
<td class="@hlClass" style="white-space:nowrap;">@eventOccurrence.Item1.Time</td>
|
||||
<td class="@hlClass">@eventOccurrence.Item2.Name</td>
|
||||
<td class="@hlClass">
|
||||
@eventOccurrence.Item1.Name
|
||||
@if (eventOccurrence.Item1.Name.Contains("Pick") && eventOccurrence.Item2.Format is EventFormat.Team)
|
||||
{
|
||||
<br/>
|
||||
<text>or coordinate with a teammate</text>
|
||||
}
|
||||
</td>
|
||||
<td>@eventOccurrence.Item1.Location
|
||||
@if (eventOccurrence.Item1.Location == "Online" && eventOccurrence.Item1.Name.Contains("Sign-up") ) { <text>by Advisor</text>}
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
|
||||
</table>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
@{
|
||||
<div class="container nobrk pt-5">
|
||||
<h2>Combined Schedule</h2>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Time</td>
|
||||
<td>Team</td>
|
||||
<td></td>
|
||||
<td>Location</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var eventsForDate
|
||||
in Model.Item3.SelectMany(eo => eo.Value.Select(e => Tuple.Create(e, eo.Key)))
|
||||
.Where(de => de.Item1.Name != "Judging")
|
||||
.GroupBy(eo => eo.Item1.StartTime.Date)
|
||||
.OrderBy(eo => eo.Key)
|
||||
)
|
||||
{
|
||||
<tr><td colspan="4"><strong>@eventsForDate.Key.ToString("MMMM d") </strong> </td></tr>
|
||||
@foreach (var occurrence in eventsForDate.OrderBy(o => o.Item1.StartTime))
|
||||
{
|
||||
var teams = Model.Item1.Where(t => t.Event == occurrence.Item2);
|
||||
if (occurrence.Item2 != CompetitiveEvent.GeneralSchedule && occurrence.Item2 != CompetitiveEvent.VotingDelegates && !teams.Any())
|
||||
continue;
|
||||
<tr>
|
||||
<td style="white-space:nowrap;">@occurrence.Item1.Time</td>
|
||||
<td>
|
||||
@if (occurrence.Item2 == CompetitiveEvent.GeneralSchedule)
|
||||
{
|
||||
<text>Everyone</text>
|
||||
}
|
||||
else if (occurrence.Item2 == CompetitiveEvent.VotingDelegates)
|
||||
{
|
||||
<text>Voting Delegates - @string.Join(", ", Model.Item2.Where(stu => stu.VotingDelegate).Select(stu => stu.FirstName))</text>
|
||||
}
|
||||
@foreach (var team in teams)
|
||||
{
|
||||
<text>@team</text>
|
||||
|
||||
|
||||
<text> - @string.Join(", ", team.Students.Select(stu => stu.FirstName))</text>
|
||||
}
|
||||
|
||||
</td>
|
||||
<td>
|
||||
@occurrence.Item1.Name
|
||||
|
||||
@if (occurrence.Item1.SignupSubmitPickup)
|
||||
{
|
||||
<br/>
|
||||
<text>1 Team Member</text>
|
||||
}
|
||||
|
||||
@if (occurrence.Item1.Name.Contains("Semifinalist") && (occurrence.Item1.Name.Contains("Interview") || occurrence.Item1.Name.Contains("Presentation")))
|
||||
{
|
||||
<br/>
|
||||
<text>@Regex.Match(@occurrence.Item2.SemifinalistActivity, @"(?<=\().*?(?=\))").Value</text>
|
||||
}
|
||||
</td>
|
||||
<td>@occurrence.Item1.Location</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
<div class="container nobrk pt-5">
|
||||
<h2>Students</h2>
|
||||
<table class="table-primary">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Student</td>
|
||||
<td>ID</td>
|
||||
</tr>
|
||||
</thead>
|
||||
@foreach (var student in Model.Item2.OrderByDescending(s => s.Officer.Contains("President")).ThenBy(s => s.LastNameFirstName))
|
||||
{
|
||||
var assignments
|
||||
= student.Teams.Where(ea => ea.Students.Contains(student))
|
||||
|
||||
.Distinct()
|
||||
.OrderBy(e => e.Name).ToList();
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<strong>@student.FirstNameLastName</strong> @if (!string.IsNullOrEmpty(student.Officer))
|
||||
{
|
||||
<text>(@student.Officer)</text>
|
||||
}
|
||||
</td>
|
||||
<td>@student.NationalID</td>
|
||||
|
||||
@foreach (var t in assignments)
|
||||
{
|
||||
<td>
|
||||
@if (t.Event.Format != EventFormat.Individual)
|
||||
{
|
||||
@t.Name
|
||||
@if (t.Captain == student)
|
||||
{
|
||||
<text> (Captain)</text>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@t.Event.Name
|
||||
}
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="container nobrk pt-5">
|
||||
<h2>Students</h2>
|
||||
@foreach (var student in Model.Item2.OrderByDescending(s => s.Officer.Contains("President")).ThenBy(s => s.LastNameFirstName))
|
||||
{
|
||||
var assignments
|
||||
= student.Teams.Where(ea => ea.Students.Contains(student))
|
||||
|
||||
.Distinct()
|
||||
.OrderBy(e => e.Name).ToList();
|
||||
|
||||
<p>
|
||||
<strong>@student.FirstNameLastName</strong>
|
||||
@if (!string.IsNullOrEmpty(student.Officer))
|
||||
{
|
||||
<text>(@student.Officer)</text>
|
||||
}
|
||||
<text>@student.NationalID</text>
|
||||
</p>
|
||||
|
||||
|
||||
@foreach (var t in assignments)
|
||||
{
|
||||
<p>
|
||||
@if (t.Event.Format != EventFormat.Individual)
|
||||
{
|
||||
@t.Name
|
||||
@if (t.Captain == student)
|
||||
{
|
||||
<text> (Captain)</text>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@t.Event.Name
|
||||
}
|
||||
</p>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
@@ -0,0 +1,6 @@
|
||||
@{
|
||||
ViewData["Title"] = "Privacy Policy";
|
||||
}
|
||||
<h1>@ViewData["Title"]</h1>
|
||||
|
||||
<p>Use this page to detail your site's privacy policy.</p>
|
||||
@@ -0,0 +1,123 @@
|
||||
@using Core.Entities
|
||||
@using Core.Utility
|
||||
@model Tuple<Team[], Student[]>
|
||||
@{
|
||||
ViewData["Title"] = "Teams";
|
||||
}
|
||||
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Team</td>
|
||||
@*<td>Time Slot</td>*@
|
||||
<td>Notes</td>
|
||||
<td>Team Members</td>
|
||||
</tr>
|
||||
</thead>
|
||||
@foreach (var team in Model.Item1.OrderBy(t => t.RegionalTimeSlotObj))
|
||||
{
|
||||
var students = team.Students;
|
||||
@if (team.Event.Format == EventFormat.Team)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
@* <strong class="@{ GetTeamClass(team);}">@team.Name</strong> *@
|
||||
@team.Name #@team.TeamNumber
|
||||
</td>
|
||||
@*<td>
|
||||
@team.RegionalTimeSlot
|
||||
</td>*@
|
||||
<td>
|
||||
@team.Event.RegionalNotes
|
||||
</td>
|
||||
<td>
|
||||
@{
|
||||
var first = true;
|
||||
}
|
||||
@foreach (var student in students.OrderByDescending(s => (s.Grade + s.TsaYear) * (team.Captain == s ? 2 : 1)).ThenBy(s => s.FirstNameLastName))
|
||||
{
|
||||
@if (!first)
|
||||
{
|
||||
<text>, </text>
|
||||
|
||||
}
|
||||
first = false;
|
||||
@student.FirstNameLastName @if (team.Captain == student)
|
||||
{
|
||||
<text> (Cpt.) (@student.RegionalID)</text>
|
||||
}
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
else if (team.Event.Format == EventFormat.Individual)
|
||||
{
|
||||
foreach (var student in students)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
@team.Event.Name #@student.RegionalID
|
||||
</td>
|
||||
<td>@team.Event.RegionalNotes</td>
|
||||
<td>@student.FirstNameLastName</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
}
|
||||
</table>
|
||||
|
||||
@{
|
||||
var s = Model.Item1.SelectMany(t => t.Students).Distinct().OrderBy(s => s.LastNameFirstName);
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Student</td>
|
||||
<td>Regional ID</td>
|
||||
<td>Team</td>
|
||||
<td>Time Slot</td>
|
||||
</tr>
|
||||
</thead>
|
||||
@foreach (var student in s)
|
||||
{
|
||||
<tr>
|
||||
<td>@student.FirstNameLastName</td>
|
||||
<td>@student.RegionalID</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
var teams = Model.Item1.Where(t => t.Students.Contains(student));
|
||||
foreach (var team in teams.OrderBy(t => t.RegionalTimeSlotObj))
|
||||
{
|
||||
<tr>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td>@team.Name
|
||||
@if (team.Captain == student)
|
||||
{
|
||||
<text>(Cpt.)</text>
|
||||
}
|
||||
</td>
|
||||
<td>@team.Event.RegionalNotes @team.RegionalTimeSlot</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</table>
|
||||
}
|
||||
<p>No regional events: @string.Join(", ", @Model.Item2.Select(s=> s.FirstName))</p>
|
||||
|
||||
@functions
|
||||
{
|
||||
public void GetOrderClass(int pick)
|
||||
{
|
||||
@Html.Raw(LabelHelper.GetOrderClass(pick))
|
||||
}
|
||||
|
||||
private void GetTeamClass(Team team)
|
||||
{
|
||||
if (team.Event.RegionalEvent)
|
||||
{
|
||||
@Html.Raw("regional")
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,130 @@
|
||||
@using Core.Entities
|
||||
|
||||
@model Tuple<IList<Team>[], IEnumerable<Student>[], Web.Controllers.HomeController.ScheduleOptions>
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Schedule";
|
||||
var slot = 0;
|
||||
|
||||
var schedule = Model.Item1;
|
||||
var unassignedStudents = Model.Item2;
|
||||
var allStudents = schedule.SelectMany(t => t).SelectMany(t => t.Students).Distinct().ToList();
|
||||
var allMeetingTeams = schedule.SelectMany(t => t).Distinct();
|
||||
}
|
||||
|
||||
<div class="bluewhite p-5">
|
||||
@{
|
||||
List<Tuple<Student, IEnumerable<Team>>> overlaps;
|
||||
}
|
||||
@foreach (var timeslot in schedule)
|
||||
{
|
||||
overlaps = Team.GetStudentTeamOverlaps(timeslot).ToList();
|
||||
var partialTeams = timeslot.Where(t => t is PartialTeam && t.Event.Format is not EventFormat.Individual);
|
||||
var fullTeams = timeslot.Where(t => !partialTeams.Contains(t));
|
||||
|
||||
<h3>Time Slot @(slot + 1)</h3>
|
||||
<p>@Model.Item3.Date.ToShortDateString()</p>
|
||||
|
||||
<h4>Teams</h4>
|
||||
<table class="table schedule">
|
||||
<thead>
|
||||
<th class="col-2"></th>
|
||||
<th class="col-3"></th>
|
||||
<th class="col-5"></th>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var team in fullTeams.Where(t => t.Event.Format is EventFormat.Team).OrderBy(t => t.Name))
|
||||
{
|
||||
@await Html.PartialAsync("ScheduleTeamPartial", Tuple.Create(team, overlaps, Model.Item3.AbsentStudents))
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
if (partialTeams.Any())
|
||||
{
|
||||
<table class="table schedule">
|
||||
<thead>
|
||||
<th class="col-2"></th>
|
||||
<th class="col-3"></th>
|
||||
<th class="col-5"></th>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var team in partialTeams.OrderBy(t => t.Name))
|
||||
{
|
||||
@await Html.PartialAsync("ScheduleTeamPartial", Tuple.Create(team, overlaps, Model.Item3.AbsentStudents))
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
}
|
||||
|
||||
<h4>Individual</h4>
|
||||
<p><i>Use time for individual event or to <strong>work on a team event</strong> </i></p>
|
||||
<table class="table schedule">
|
||||
<tbody>
|
||||
|
||||
<tr>
|
||||
|
||||
@foreach (var team in fullTeams.Where(t => t.Event.Format is EventFormat.Individual).OrderBy(t => t.Name))
|
||||
{
|
||||
<td>
|
||||
<strong>@team.Captain?.FirstName</strong> (@team.Event.Name@if(team.Event.RegionalEvent){ @* <text> (<i>Regional</i>)</text> *@})
|
||||
</td>
|
||||
@* @await Html.PartialAsync("ScheduleTeamPartial", Tuple.Create(team, overlaps)) *@
|
||||
}
|
||||
|
||||
@foreach (var student in unassignedStudents[slot])
|
||||
{
|
||||
<td>
|
||||
<strong>@student.FirstName</strong>
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
||||
slot++;
|
||||
}
|
||||
|
||||
<h3>Missed team events for today</h3>
|
||||
<table class="table schedule">
|
||||
@foreach (var student in allStudents.OrderBy(s => s.FirstName))
|
||||
{
|
||||
var studentMeetings = student.Teams.Where(t => allMeetingTeams.Any(mt => mt.Name == t.Name && mt.Students.Contains(student)));
|
||||
var studentMissed = student.Teams.Where(t => studentMeetings.All(mt => mt.Name != t.Name)).ToList();
|
||||
var studentMissedTeams = studentMissed.Where(t => t.Event.Format is EventFormat.Team);
|
||||
var studentMissedIndividual = studentMissed.Where(t => t.Event.Format is EventFormat.Individual);
|
||||
if (studentMissedTeams.Any())
|
||||
{
|
||||
<tr>
|
||||
<td class="col-4">@student.FirstName</td>
|
||||
<td>
|
||||
@string.Join(", ", studentMissedTeams.Select(t => t.ToStringWithIndividualAndRegional()))
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
if (studentMissedIndividual.Any())
|
||||
{
|
||||
<tr>
|
||||
<td class="col-4">@student.FirstName</td>
|
||||
<td>
|
||||
@string.Join(", ", studentMissedIndividual.Select(t => t.ToStringWithIndividualAndRegional()))
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
@functions
|
||||
{
|
||||
private void GetTeamClass(Team team)
|
||||
{
|
||||
if (team.Event.RegionalEvent)
|
||||
{
|
||||
@Html.Raw("regional")
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
@using Core.Entities
|
||||
@model Tuple<Core.Entities.Team, List<Tuple<Student, IEnumerable<Team>>>, string[]?>
|
||||
|
||||
@{
|
||||
var team = Model.Item1;
|
||||
var overlaps = Model.Item2;
|
||||
}
|
||||
|
||||
<tr>
|
||||
<td class="@{ GetTeamClass(team); } col-6" >
|
||||
<strong>@team</strong>
|
||||
@if (!string.IsNullOrEmpty(team.Event.EventAttributes()))
|
||||
{
|
||||
<i>(@team.Event.EventAttributes())</i>
|
||||
}
|
||||
<small><i>@team.Event.SemifinalistActivity</i></small>
|
||||
@* @if (team.Event.StatePresubmission)
|
||||
{
|
||||
<small>(pre-submission)</small>
|
||||
}
|
||||
|
||||
@if (team.Event.StatePretesting)
|
||||
{
|
||||
<small>(pre-testing)</small>
|
||||
} *@
|
||||
</td>
|
||||
|
||||
<td>
|
||||
@{ var first = true; }
|
||||
@foreach (var student in team.Students.OrderByDescending(s => (s.Grade + s.TsaYear) * (team.Captain == s ? 2 : 1)))
|
||||
{
|
||||
if (!first)
|
||||
{
|
||||
<text>, </text>
|
||||
}
|
||||
{
|
||||
first = false;
|
||||
}
|
||||
@if (overlaps.Any(t => t.Item1 == student))
|
||||
{
|
||||
<span style="color: #F66">@student.FirstName</span>
|
||||
}
|
||||
else if(Model.Item3?.Any(s => student.FirstNameLastName.Contains(s))== true)
|
||||
{
|
||||
<span style="color: lightgray">@student.FirstName</span>
|
||||
}
|
||||
else
|
||||
{
|
||||
@student.FirstName
|
||||
|
||||
}
|
||||
|
||||
@if (team.Captain == student)
|
||||
{
|
||||
<span class="text-warning small">•</span>
|
||||
@* <i class="bi bi-chevron-double-up text-warning small"></i> *@
|
||||
}
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
@team.Event.Documentation
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@functions
|
||||
{
|
||||
private void GetTeamClass(Team team)
|
||||
{
|
||||
// if (team.Event.RegionalEvent)
|
||||
// {
|
||||
// @Html.Raw("regional")
|
||||
// ;
|
||||
// }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,358 @@
|
||||
@using System.Text.RegularExpressions
|
||||
@using Core.Entities
|
||||
@using Core.Utility
|
||||
@model Tuple<Team[], Student[], IDictionary<CompetitiveEvent, List<EventOccurrence>>>
|
||||
@{
|
||||
ViewData["Title"] = "Teams";
|
||||
var eventOccurrences = Model.Item3;
|
||||
}
|
||||
<div class="container nobrk pt-5">
|
||||
<h2>State Events</h2>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Team</td>
|
||||
<td>Team Members</td>
|
||||
<td>Dates</td>
|
||||
<td>Materials</td>
|
||||
|
||||
</tr>
|
||||
</thead>
|
||||
@foreach (var team in Model.Item1)
|
||||
{
|
||||
var students = team.Students;
|
||||
@if (true @* team.Event.Format == EventFormat.Team *@)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
@* <strong class="@{ GetTeamClass(team);}">@team.Name</strong> *@
|
||||
@team.Name @* #@team.TeamNumber
|
||||
*@ </td>
|
||||
<td>
|
||||
@{
|
||||
var first = true;
|
||||
}
|
||||
@foreach (var student in students.OrderByDescending(s => (s.Grade + s.TsaYear) * (team.Captain == s ? 2 : 1)).ThenBy(s => s.FirstNameLastName))
|
||||
{
|
||||
@if (!first)
|
||||
{
|
||||
<text>, </text>
|
||||
|
||||
}
|
||||
first = false;
|
||||
@student.FirstNameLastName @if (team.Captain == student)
|
||||
{
|
||||
<text> (Cpt. @team.Captain.StateID)</text>
|
||||
}
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
@if (team.Event.StatePresubmission)
|
||||
{
|
||||
<text>Pre-submission due Friday, March 14</text>
|
||||
}
|
||||
@if (team.Event.StatePretesting)
|
||||
{
|
||||
<text>Pre-testing Wednesday, April 2nd</text>
|
||||
}
|
||||
@if (team.Event.StatePreliminaryRound)
|
||||
{
|
||||
<text>Preliminary and Semifinalist Rounds</text>
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
@team.Event.Documentation
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
}
|
||||
@* else if (team.Event.Format == EventFormat.Individual)
|
||||
{
|
||||
foreach (var student in students)
|
||||
{
|
||||
<tr>
|
||||
<td>
|
||||
@team.Event.Name - @student.FirstNameLastName (@student.RegionalID)
|
||||
</td>
|
||||
<td>@team.RegionalTimeSlot</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
}
|
||||
} *@
|
||||
}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@{
|
||||
var s = Model.Item2.OrderBy(s => s.LastNameFirstName);
|
||||
|
||||
@foreach (var student in s)
|
||||
{
|
||||
<div class="container nobrk pt-5" style="page-break-before: always;">
|
||||
|
||||
<h3>@student.FirstNameLastName - @student.StateID</h3>
|
||||
<h4>TSA 2025 TN State Schedule</h4>
|
||||
<div class="row">
|
||||
<div class="col col-2">Events</div>
|
||||
<div class="col">
|
||||
@foreach (var ev in student.Teams)
|
||||
{
|
||||
<div class="row">
|
||||
|
||||
<div class="col col-2">
|
||||
@if (ev.Event.Format is EventFormat.Team)
|
||||
{
|
||||
@ev.TeamNumber
|
||||
}
|
||||
else
|
||||
{
|
||||
@ev.Captain.StateID
|
||||
}
|
||||
</div>
|
||||
<div class="col-4">
|
||||
<text> @ev.Name
|
||||
@if (ev.Captain == student)
|
||||
{
|
||||
<strong>(Cpt.)</strong>
|
||||
}
|
||||
</text>
|
||||
</div>
|
||||
<div class="col-6">
|
||||
@ev.Event.SemifinalistActivity
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
</div>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Time</td>
|
||||
<td>Event</td>
|
||||
<td></td>
|
||||
<td>Location</td>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
@foreach (var date in
|
||||
eventOccurrences
|
||||
.Where(eo =>
|
||||
student.Teams.Select(t => t.Event).Any(a => a == eo.Key)
|
||||
|| eo.Key == CompetitiveEvent.GeneralSchedule
|
||||
|| (eo.Key == CompetitiveEvent.VotingDelegates && student.VotingDelegate))
|
||||
.SelectMany(eo => eo.Value.Select(v => Tuple.Create(v, eo.Key)))
|
||||
.GroupBy(de => de.Item1.Date + ", " + de.Item1.StartTime.DayOfWeek)
|
||||
.OrderBy(d => d.Key)
|
||||
)
|
||||
{
|
||||
var eventsForThisDay =
|
||||
date
|
||||
.Where(de => de.Item1.Name != "Judging")
|
||||
.Where(de => de.Item1.StartTime > new DateTime(2024, 3, 1))
|
||||
// filter out occurrences where non-captain
|
||||
.Where(de =>
|
||||
!de.Item1.SignupSubmitPickup
|
||||
|| de.Item2.Format is EventFormat.Individual
|
||||
|| student.Teams.Any(t => t.Captain == student && t.Event == de.Item2)
|
||||
)
|
||||
.OrderBy(de => de.Item1.StartTime);
|
||||
|
||||
@if (!eventsForThisDay.Any())
|
||||
continue;
|
||||
<tr>
|
||||
|
||||
<td colspan="4"><strong>@date.Key</strong></td>
|
||||
</tr>
|
||||
@foreach (var eventOccurrence in eventsForThisDay.OrderBy(de => de.Item1.StartTime))
|
||||
{
|
||||
<tr>
|
||||
<td>@eventOccurrence.Item1.Time</td>
|
||||
<td>@eventOccurrence.Item2.Name</td>
|
||||
<td>@eventOccurrence.Item1.Name
|
||||
@if (eventOccurrence.Item1.Name.Contains("Pick") && eventOccurrence.Item2.Format is EventFormat.Team)
|
||||
{
|
||||
<br/>
|
||||
<text>or coordinate with a teammate</text>
|
||||
}
|
||||
</td>
|
||||
<td>@eventOccurrence.Item1.Location
|
||||
@if (eventOccurrence.Item1.Location == "Online" && eventOccurrence.Item1.Name.Contains("Sign-up") ) { <text>by Advisor</text>}
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
|
||||
</table>
|
||||
</div>
|
||||
}
|
||||
}
|
||||
|
||||
@{
|
||||
<div class="container nobrk pt-5">
|
||||
<h2>Combined Schedule</h2>
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Time</td>
|
||||
<td>Team</td>
|
||||
<td></td>
|
||||
<td>Location</td>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var eventsForDate
|
||||
in Model.Item3.SelectMany(eo => eo.Value.Select(e => Tuple.Create(e, eo.Key)))
|
||||
.Where(de => de.Item1.Name != "Judging")
|
||||
.GroupBy(eo => eo.Item1.StartTime.Date)
|
||||
.OrderBy(eo => eo.Key)
|
||||
)
|
||||
{
|
||||
<tr><td colspan="4"><strong>@eventsForDate.Key.ToString("MMMM d") </strong> </td></tr>
|
||||
@foreach (var occurrence in eventsForDate.OrderBy(o => o.Item1.StartTime))
|
||||
{
|
||||
var teams = Model.Item1.Where(t => t.Event == occurrence.Item2);
|
||||
if (occurrence.Item2 != CompetitiveEvent.GeneralSchedule && occurrence.Item2 != CompetitiveEvent.VotingDelegates && !teams.Any())
|
||||
continue;
|
||||
<tr>
|
||||
<td>@occurrence.Item1.Time</td>
|
||||
<td>
|
||||
@if (occurrence.Item2 == CompetitiveEvent.GeneralSchedule)
|
||||
{
|
||||
<text>Everyone</text>
|
||||
}
|
||||
else if (occurrence.Item2 == CompetitiveEvent.VotingDelegates)
|
||||
{
|
||||
<text>Voting Delegates - @string.Join(", ", Model.Item2.Where(stu => stu.VotingDelegate).Select(stu => stu.FirstName))</text>
|
||||
}
|
||||
@foreach (var team in teams)
|
||||
{
|
||||
<text>@team</text>
|
||||
|
||||
|
||||
<text> - @string.Join(", ", team.Students.Select(stu => stu.FirstName))</text>
|
||||
}
|
||||
|
||||
</td>
|
||||
<td>
|
||||
@occurrence.Item1.Name
|
||||
|
||||
@if (occurrence.Item1.SignupSubmitPickup)
|
||||
{
|
||||
<br/>
|
||||
<text>1 Team Member</text>
|
||||
}
|
||||
|
||||
@if (occurrence.Item1.Name.Contains("Semifinalist") && (occurrence.Item1.Name.Contains("Interview") || occurrence.Item1.Name.Contains("Presentation")))
|
||||
{
|
||||
<br/>
|
||||
<text>@Regex.Match(@occurrence.Item2.SemifinalistActivity, @"(?<=\().*?(?=\))").Value</text>
|
||||
}
|
||||
</td>
|
||||
<td>@occurrence.Item1.Location</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
}
|
||||
|
||||
|
||||
<div class="container nobrk pt-5">
|
||||
<h2>Students</h2>
|
||||
<table class="table-primary">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Student</td>
|
||||
<td>ID</td>
|
||||
</tr>
|
||||
</thead>
|
||||
@foreach (var student in Model.Item2.OrderByDescending(s => s.Officer.Contains("President")).ThenBy(s => s.LastNameFirstName))
|
||||
{
|
||||
var assignments
|
||||
= student.Teams.Where(ea => ea.Students.Contains(student))
|
||||
|
||||
.Distinct()
|
||||
.OrderBy(e => e.Name).ToList();
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<strong>@student.FirstNameLastName</strong> @if (!string.IsNullOrEmpty(student.Officer))
|
||||
{
|
||||
<text>(@student.Officer)</text>
|
||||
}
|
||||
</td>
|
||||
<td>@student.StateID</td>
|
||||
|
||||
@foreach (var t in assignments)
|
||||
{
|
||||
<td>
|
||||
@if (t.Event.Format != EventFormat.Individual)
|
||||
{
|
||||
@t.Name
|
||||
@if (t.Captain == student)
|
||||
{
|
||||
<text> (Captain)</text>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@t.Event.Name
|
||||
}
|
||||
@{
|
||||
if (t.Event.Format == EventFormat.Individual)
|
||||
{
|
||||
<sup class="activity">(ind)</sup>
|
||||
}
|
||||
if (t.Event.OnSiteActivity)
|
||||
{
|
||||
<sup class="activity">(act)</sup>
|
||||
}
|
||||
}
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="container nobrk pt-5">
|
||||
<h2>Students</h2>
|
||||
@foreach (var student in Model.Item2.OrderByDescending(s => s.Officer.Contains("President")).ThenBy(s => s.LastNameFirstName))
|
||||
{
|
||||
var assignments
|
||||
= student.Teams.Where(ea => ea.Students.Contains(student))
|
||||
|
||||
.Distinct()
|
||||
.OrderBy(e => e.Name).ToList();
|
||||
|
||||
<p>
|
||||
<strong>@student.FirstNameLastName</strong>
|
||||
@if (!string.IsNullOrEmpty(student.Officer))
|
||||
{
|
||||
<text>(@student.Officer)</text>
|
||||
}
|
||||
<text>@student.StateID</text>
|
||||
</p>
|
||||
|
||||
|
||||
@foreach (var t in assignments)
|
||||
{
|
||||
<p>
|
||||
@if (t.Event.Format != EventFormat.Individual)
|
||||
{
|
||||
@t.Name
|
||||
@if (t.Captain == student)
|
||||
{
|
||||
<text> (Captain)</text>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
@t.Event.Name
|
||||
}
|
||||
</p>
|
||||
}
|
||||
}
|
||||
</div>
|
||||
@@ -0,0 +1,79 @@
|
||||
@using Core.Entities
|
||||
@model Tuple<Student[]>
|
||||
@{
|
||||
ViewData["Title"] = "Student Handout Page";
|
||||
}
|
||||
|
||||
@foreach (var s in Model.Item1.OrderBy(n => n.FirstName))
|
||||
{
|
||||
<div class="container nobrk pt-5">
|
||||
<p><i>@DateTime.Today.ToShortDateString()</i></p>
|
||||
<h2><i>TSA teams and events:</i> @s.FirstNameLastName </h2>
|
||||
|
||||
@foreach (var team in
|
||||
s.Teams.OrderByDescending(t => t.Event.Format == EventFormat.Team)
|
||||
.ThenByDescending(t => t.Event.LevelOfEffort)
|
||||
.ThenByDescending(t => t.Name))
|
||||
{
|
||||
var evt = team.Event;
|
||||
<div>
|
||||
@if (evt.RegionalEvent)
|
||||
{
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<i>Regional Event</i>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
<div div class="row">
|
||||
<div class="col-6">
|
||||
<h5>@evt.Name @Html.Partial("EffortStarsPartial", evt.LevelOfEffort)</h5>
|
||||
</div>
|
||||
<div class="col-4">
|
||||
@if (evt.Format is EventFormat.Team)
|
||||
{
|
||||
<html>
|
||||
<strong>Teammates</strong><br/>
|
||||
@string.Join(", ", team.Students.OrderByDescending(s => s.Grade + s.TsaYear).ThenBy(s => s.FirstName).Where(tm => tm != s).Select(tm => tm.FirstName))
|
||||
</html>
|
||||
}
|
||||
else
|
||||
{
|
||||
<html>
|
||||
<strong>@evt.Format</strong>
|
||||
</html>
|
||||
}
|
||||
|
||||
</div>
|
||||
<div class="col-2">
|
||||
@evt.SemifinalistActivity
|
||||
@if (evt.StatePresubmission)
|
||||
{<text>, State Presubmission <strong>due March 14th</strong></text>}
|
||||
@if (evt.StatePretesting)
|
||||
{<text>, State Pre-testing <strong>April 2nd</strong></text>}
|
||||
@if (evt.StatePreliminaryRound)
|
||||
{<text>, State Preliminary and Semifinalist Rounds</text>}
|
||||
</div>
|
||||
</div>
|
||||
<div div class="row mt-3">
|
||||
<div class="col">@evt.Description</div></div>
|
||||
@if (!string.IsNullOrEmpty(evt.Theme))
|
||||
{
|
||||
<div div class="row mt-2">
|
||||
<div class="col-3 text-center"><i>Theme for 2024-25:</i></div>
|
||||
<div class="col">@evt.Theme</div>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (!string.IsNullOrEmpty(evt.Documentation))
|
||||
{
|
||||
<div div class="row mt-2">
|
||||
<div class="col-3 text-center"><i>Materials:</i></div>
|
||||
<div class="col">@evt.Documentation</div>
|
||||
</div>
|
||||
}
|
||||
<hr/>
|
||||
</div>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
@using Core.Entities
|
||||
@using Core.Utility
|
||||
@model Tuple<CompetitiveEvent[], Student[], EventStudentPicks[], Team[], AssignmentParameters>
|
||||
@{
|
||||
ViewData["Title"] = "Home Page";
|
||||
var maxStudentPicks = Model.Item3.MaxBy(picks => picks.StudentPicks.Count).StudentPicks.Count;
|
||||
var parameters = Model.Item5;
|
||||
var unassignedEvents = Model.Item1.Where(e => Model.Item4.All(t => t.Event != e));
|
||||
|
||||
}
|
||||
|
||||
<table class="table-primary">
|
||||
<tr>
|
||||
<td colspan="8">
|
||||
Effort Limit:<strong>@parameters.EffortUpperBound</strong>
|
||||
Require Regionals:<strong>@parameters.RequireRegional</strong>
|
||||
Require On-Site Activity:<strong>@parameters.RequireOnSite</strong>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<br/>
|
||||
<table class="table-primary">
|
||||
<thead>
|
||||
<tr><td>Student</td><td>Level of Effort Total</td></tr>
|
||||
</thead>
|
||||
@foreach (var student in Model.Item2.OrderBy(s => s.FirstName))
|
||||
{
|
||||
var assignments
|
||||
= Model.Item4.Where(ea => ea.Students.Contains(student))
|
||||
.Select(ea => ea.Event)
|
||||
.Distinct()
|
||||
.OrderBy(e =>
|
||||
{
|
||||
|
||||
var r = student.RankedEventPicks.IndexOf(e);
|
||||
r = r >= 0 ? r : 10;
|
||||
//r = r * (4 - e.LevelOfEffort.Value);
|
||||
return r;
|
||||
});
|
||||
|
||||
<tr>
|
||||
<td><strong>@student.FirstName</strong></td>
|
||||
<td>@assignments.Sum(a => a.LevelOfEffort)</td>
|
||||
|
||||
@foreach (var evt in assignments)
|
||||
{
|
||||
var h = student.RankedEventPicks.IndexOf(evt) + 1;
|
||||
<td class="@{ GetOrderClass(h); }">
|
||||
@evt.ShortName @Html.Partial("EffortStarsPartial", evt.LevelOfEffort)
|
||||
@{
|
||||
if (evt.Format == EventFormat.Individual)
|
||||
{
|
||||
<sup class="activity">(ind)</sup>
|
||||
}
|
||||
if (evt.RegionalEvent)
|
||||
{
|
||||
<sup class="activity">(reg)</sup>
|
||||
}
|
||||
if (evt.OnSiteActivity)
|
||||
{
|
||||
<sup class="activity">(act)</sup>
|
||||
}
|
||||
}
|
||||
</td>
|
||||
}
|
||||
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
|
||||
<table><tr><td> </td></tr></table>
|
||||
|
||||
<table class="table-primary">
|
||||
<thead>
|
||||
<tr><td>Teams</td></tr>
|
||||
</thead>
|
||||
@foreach (var evt in Model.Item1.OrderByDescending(e => e.Format is EventFormat.Team))
|
||||
{
|
||||
var assignments = Model.Item4.FirstOrDefault(i => i.Event == evt);
|
||||
@if (assignments == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
<tr class="table-primary">
|
||||
<td class="table-primary"><strong>@evt.Name</strong></td>
|
||||
<td colspan="1">
|
||||
@Html.Partial("EffortStarsPartial", evt.LevelOfEffort)
|
||||
@if (evt.Format is EventFormat.Individual)
|
||||
{
|
||||
<text>(ind)</text>
|
||||
}
|
||||
|
||||
@if (evt.RegionalEvent)
|
||||
{
|
||||
<text>(reg)</text>
|
||||
}
|
||||
|
||||
@if (evt.OnSiteActivity)
|
||||
{
|
||||
<text>(act)</text>
|
||||
}@evt.TeamSize</td>
|
||||
@*<td style="nowrap">@evt.MaxTeamCountState</td>*@
|
||||
@if (assignments != null)
|
||||
{
|
||||
foreach (var student in assignments.Students)
|
||||
{
|
||||
var h = student.RankedEventPicks.IndexOf(evt) + 1;
|
||||
<td class="@{ GetOrderClass(h); }">@student.FirstName</td>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
|
||||
<tr>
|
||||
@{
|
||||
var unassigned = string.Join(", ", unassignedEvents.Select(e => e.Name));
|
||||
}
|
||||
<td colspan="8">Unassigned Events: @unassigned</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<table><tr><td></td></tr></table>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<th>Name</th>
|
||||
<th>Grade</th>
|
||||
<th>TSA Year</th>
|
||||
<th>1</th>
|
||||
<th>2</th>
|
||||
<th>3</th>
|
||||
<th>4</th>
|
||||
<th>5</th>
|
||||
</thead>
|
||||
@foreach (var s in Model.Item2.OrderBy(n => n.FirstName))
|
||||
{
|
||||
<tr>
|
||||
<td>@s.FirstName</td>
|
||||
<td>@s.Grade.Ordinal()</td>
|
||||
<td>@s.TsaYear.Ordinal()</td>
|
||||
@for (var i = 0; i < 7; i++)
|
||||
{
|
||||
var h = i + 1;
|
||||
var evt = s.RankedEventPicks.Skip(i).FirstOrDefault();
|
||||
if (evt == null)
|
||||
continue;
|
||||
<td class="@{ GetOrderClass(h); }">
|
||||
@evt.ShortName @Html.Partial("EffortStarsPartial", evt.LevelOfEffort)
|
||||
@if (evt.Format == EventFormat.Individual)
|
||||
{
|
||||
<sup class="activity">(ind)</sup>
|
||||
}
|
||||
@if (evt.RegionalEvent)
|
||||
{
|
||||
<sup class="activity">(reg)</sup>
|
||||
}
|
||||
@if (evt.OnSiteActivity)
|
||||
{
|
||||
<sup class="activity">(act)</sup>
|
||||
}
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr><td>Event</td><td>Level of Effort</td><td>Individual</td><td>Regional</td><td>On-site Activity</td><td>Team Size</td><td>Max Team Count</td></tr>
|
||||
</thead>
|
||||
@foreach (var evt in Model.Item1)
|
||||
{
|
||||
var esp = Model.Item3.FirstOrDefault(i => i.Event == evt);
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
@evt.Name
|
||||
</td>
|
||||
|
||||
<td>@Html.Partial("EffortStarsPartial", evt.LevelOfEffort)</td>
|
||||
<td>@if (evt.Format is EventFormat.Individual) { <text>ind</text> }</td>
|
||||
<td>@if (evt.RegionalEvent) { <text>reg</text> }</td>
|
||||
<td>@if (evt.OnSiteActivity) { <text>act</text> }</td>
|
||||
<td style="nowrap">@evt.TeamSize</td>
|
||||
<td style="nowrap">@evt.MaxTeamCountState</td>
|
||||
|
||||
@for (var i = 0; i < maxStudentPicks; i++)
|
||||
{
|
||||
var d = esp?.StudentPicks.Skip(i).FirstOrDefault();
|
||||
<td class="@{GetOrderClass(d?.Item2 ?? int.MaxValue);}">@d?.Item1.FirstName</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
|
||||
|
||||
@functions
|
||||
{
|
||||
public void GetOrderClass(int pick)
|
||||
{
|
||||
@Html.Raw(LabelHelper.GetOrderClass(pick))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
@using Core.Entities
|
||||
|
||||
@model Tuple<Student[]>
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Student Teams";
|
||||
}
|
||||
|
||||
<table class="table-primary">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Student</td><td>Level of Effort Total</td>
|
||||
</tr>
|
||||
</thead>
|
||||
@foreach (var student in Model.Item1.OrderBy(s => s.FirstName))
|
||||
{
|
||||
var assignments
|
||||
= student.Teams.Where(ea => ea.Students.Contains(student))
|
||||
.Select(ea => ea.Event)
|
||||
.Distinct()
|
||||
.OrderBy(e =>
|
||||
{
|
||||
var r = student.RankedEventPicks.IndexOf(e);
|
||||
r = r >= 0 ? r : 10;
|
||||
//r = r * (4 - e.LevelOfEffort.Value);
|
||||
return r;
|
||||
}).ToList();
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<strong>@student.FirstNameLastName</strong> @if(!string.IsNullOrEmpty(student.Officer )) {<text>(@student.Officer)</text>}
|
||||
</td>
|
||||
<td>@assignments.Sum(a => a.LevelOfEffort)</td>
|
||||
|
||||
@foreach (var evt in assignments)
|
||||
{
|
||||
var h = student.RankedEventPicks.IndexOf(evt) + 1;
|
||||
<td class="@{ GetOrderClass(h); }">
|
||||
@evt.ShortName @Html.Partial("EffortStarsPartial", evt.LevelOfEffort)
|
||||
@{
|
||||
if (evt.Format == EventFormat.Individual)
|
||||
{
|
||||
<sup class="activity">(ind)</sup>
|
||||
}
|
||||
if (evt.RegionalEvent)
|
||||
{
|
||||
<sup class="activity">(reg)</sup>
|
||||
}
|
||||
if (evt.OnSiteActivity)
|
||||
{
|
||||
<sup class="activity">(act)</sup>
|
||||
}
|
||||
}
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
@*
|
||||
<table class="table">
|
||||
<tr>
|
||||
<th>Student</th>
|
||||
<th>Team</th>
|
||||
<th>Teammates</th>
|
||||
</tr>
|
||||
@foreach (var student in Model.Item1.OrderBy(s => s.Name))
|
||||
{
|
||||
var teams = student.Teams;
|
||||
|
||||
<tr class="table-primary">
|
||||
<td class="table-primary">
|
||||
<strong>@student.FirstNameLastName</strong>
|
||||
@if (!string.IsNullOrEmpty(student.Officer))
|
||||
{
|
||||
<text>(</text> @student.Officer <text>)</text>
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
@foreach (var team in student.Teams)
|
||||
{
|
||||
<tr>
|
||||
<td></td>
|
||||
<td class="@{ GetTeamClass(team); }">@team.Name
|
||||
@{
|
||||
var ind = new List<string>();
|
||||
if (team.Captain == student)
|
||||
{
|
||||
<span>(Cpt .)</span>
|
||||
}
|
||||
if (!team.Event.InterviewOrPresentation)
|
||||
{
|
||||
ind.Add("a");
|
||||
}
|
||||
if (team.Event.Format is EventFormat.Individual)
|
||||
{
|
||||
ind.Add("i");
|
||||
}
|
||||
if (ind.Count > 0)
|
||||
{
|
||||
<span class="activity">(@string.Join(",", ind))</span>
|
||||
}
|
||||
}
|
||||
</td>
|
||||
<td>
|
||||
@string.Join(", ", team.Students.Where(s => s != student).OrderByDescending(s => s.TsaYear + s.Grade).Select(s => s.FirstName))
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
}
|
||||
</table>
|
||||
<p>
|
||||
(a) denotes an event that has activity other than interview or presentation at state
|
||||
<br />
|
||||
(i) denotes an individual event
|
||||
</p> *@
|
||||
|
||||
|
||||
<table class="table-primary">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Student</td>
|
||||
</tr>
|
||||
</thead>
|
||||
@foreach (var student in Model.Item1.OrderBy(s => s.LastNameFirstName))
|
||||
{
|
||||
var assignments
|
||||
= student.Teams.Where(ea => ea.Students.Contains(student))
|
||||
.Select(ea => ea.Event)
|
||||
.Distinct()
|
||||
.OrderBy(e =>
|
||||
{
|
||||
var r = student.RankedEventPicks.IndexOf(e);
|
||||
r = r >= 0 ? r : 10;
|
||||
//r = r * (4 - e.LevelOfEffort.Value);
|
||||
return r;
|
||||
}).ToList();
|
||||
|
||||
<tr>
|
||||
<td>
|
||||
<strong>@student.FirstName</strong>
|
||||
</td>
|
||||
|
||||
@foreach (var evt in assignments)
|
||||
{
|
||||
var h = student.RankedEventPicks.IndexOf(evt) + 1;
|
||||
<td>
|
||||
@evt.Name
|
||||
@{
|
||||
if (evt.Format == EventFormat.Individual)
|
||||
{
|
||||
<sup class="activity">(individual)</sup>
|
||||
}
|
||||
if (evt.RegionalEvent)
|
||||
{
|
||||
<sup class="activity">(regional)</sup>
|
||||
}
|
||||
}
|
||||
</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
|
||||
@functions
|
||||
{
|
||||
public void GetOrderClass(int pick)
|
||||
{
|
||||
@Html.Raw(LabelHelper.GetOrderClass(pick))
|
||||
}
|
||||
|
||||
private void GetTeamClass(Team team)
|
||||
{
|
||||
// if (team.Event.RegionalEvent)
|
||||
// {
|
||||
// @Html.Raw("regional");
|
||||
// }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
@model System.Tuple<Core.Entities.Team[],Core.Entities.Student[]>
|
||||
|
||||
@{
|
||||
ViewData["Title"] = "Team Grid";
|
||||
}
|
||||
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr> <th></th>
|
||||
@foreach (var team in Model.Item1)
|
||||
{
|
||||
if (team.Name == team.Event.Name)
|
||||
{
|
||||
<td style="writing-mode: vertical-rl;text-orientation:sideways">
|
||||
@team.Event.ShortName
|
||||
</td>
|
||||
}
|
||||
else
|
||||
{
|
||||
<td style="writing-mode: vertical-rl;text-orientation:sideways">
|
||||
@team.Name
|
||||
</td>
|
||||
}
|
||||
}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach (var student in Model.Item2.OrderBy(s => s.FirstName))
|
||||
{
|
||||
<tr>
|
||||
<td>@student.FirstName</td>
|
||||
@foreach (var team in Model.Item1)
|
||||
{
|
||||
@if (team.Students.Contains(student))
|
||||
{
|
||||
<td><strong> X</strong></td>
|
||||
}
|
||||
else
|
||||
{
|
||||
<td></td>
|
||||
}
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</tbody>
|
||||
</table>
|
||||
@@ -0,0 +1,132 @@
|
||||
@using Core.Entities
|
||||
@model Tuple<Team[]>
|
||||
@{
|
||||
ViewData["Title"] = "Teams";
|
||||
}
|
||||
|
||||
<table>
|
||||
@foreach (var team in Model.Item1.Where(t => t.Event.Documentation.Contains("Port")))
|
||||
{
|
||||
<tr>
|
||||
<td>@team.Name @if (team.Event.Format is EventFormat.Individual)
|
||||
{
|
||||
<text>(ind)</text>
|
||||
}
|
||||
</td><td>@team.Event.Documentation</td>
|
||||
@foreach(var student in @team.Students.OrderByDescending(s => s.TsaYear + s.Grade))
|
||||
{
|
||||
<td>@student.FirstName</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
@foreach (var student in Model.Item1.SelectMany(t => t.Students).Distinct().Where(s => s.Teams.Any(t => t.Event.Name.Contains("Port"))))
|
||||
{
|
||||
<tr>
|
||||
<td>@student.FirstName</td>
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
|
||||
<table class="table-primary">
|
||||
<thead>
|
||||
<tr><td>Teams</td></tr>
|
||||
</thead>
|
||||
@{
|
||||
var ind = false;
|
||||
}
|
||||
@foreach (var team in Model.Item1.OrderByDescending(t => t.Event.Format is EventFormat.Team))
|
||||
{
|
||||
@if (!ind && team.Event.Format is EventFormat.Individual)
|
||||
{
|
||||
<tr>
|
||||
<td><hr/></td><td>Individual</td><td><hr/></td>
|
||||
</tr>
|
||||
ind = true;
|
||||
}
|
||||
<tr class="table-primary">
|
||||
<td class="table-primary"><strong>@team.Name</strong></td>
|
||||
<td colspan="1">
|
||||
@* @Html.Partial("EffortStarsPartial", team.Event.LevelOfEffort) *@
|
||||
@* @if (team.Event.RegionalEvent)
|
||||
{
|
||||
<text>(reg)</text>
|
||||
}
|
||||
|
||||
@if (team.Event.OnSiteActivity)
|
||||
{
|
||||
<text>(act)</text>
|
||||
} *@
|
||||
@team.Event.TeamSize
|
||||
</td>
|
||||
@*<td style="nowrap">@evt.MaxTeamCountState</td>*@
|
||||
@foreach (var student in team.Students.OrderByDescending(s => (s.Grade + s.TsaYear) * (team.Captain == s ? 2 : 1)).ThenBy(s => s.FirstNameLastName))
|
||||
{
|
||||
<td>@student.FirstName @if (team.Captain == student) { <text>(Cpt.)</text>}</td>
|
||||
}
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
@*
|
||||
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<td>Event</td>
|
||||
<td>Pre-submission</td>
|
||||
<td>RegionalNotes</td>
|
||||
<td>Team Members</td>
|
||||
</tr>
|
||||
</thead>
|
||||
@foreach (var team in Model.Item1)
|
||||
{
|
||||
var students = team.Students;
|
||||
<tr>
|
||||
<td>
|
||||
@team.Name
|
||||
</td>
|
||||
|
||||
</tr>
|
||||
|
||||
@foreach (var student in students.OrderByDescending(s => (s.Grade + s.TsaYear) * (team.Captain == s ? 2 : 1)).ThenBy(s => s.FirstNameLastName))
|
||||
{
|
||||
<td>@student.FirstNameLastName @if (team.Captain == student) { <text>(Cpt.)</text>}</td>
|
||||
}
|
||||
|
||||
<tr>
|
||||
<td class="event-desc" colspan="4">Team Size: @team.Event.TeamSize, Max Teams: @team.Event.MaxTeamCountState
|
||||
@{
|
||||
if (!team.Event.InterviewOrPresentation)
|
||||
{
|
||||
<span class="activity"> (a)</span>
|
||||
}
|
||||
if (team.Event.Format is EventFormat.Individual)
|
||||
{
|
||||
<span class="activity"> (i)</span>
|
||||
}
|
||||
}
|
||||
</td>
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
<p>
|
||||
(a) denotes an event that has activity other than interview or presentation at state
|
||||
<br />
|
||||
(i) denotes an individual event
|
||||
</p>
|
||||
*@
|
||||
|
||||
@functions
|
||||
{
|
||||
public void GetOrderClass(int pick)
|
||||
{
|
||||
@Html.Raw(LabelHelper.GetOrderClass(pick))
|
||||
}
|
||||
|
||||
private void GetTeamClass(Team team)
|
||||
{
|
||||
// if (team.Event.RegionalEvent)
|
||||
// {
|
||||
// @Html.Raw("regional");
|
||||
// }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
@model ErrorViewModel
|
||||
@{
|
||||
ViewData["Title"] = "Error";
|
||||
}
|
||||
|
||||
<h1 class="text-danger">Error.</h1>
|
||||
<h2 class="text-danger">An error occurred while processing your request.</h2>
|
||||
|
||||
@if (Model.ShowRequestId)
|
||||
{
|
||||
<p>
|
||||
<strong>Request ID:</strong> <code>@Model.RequestId</code>
|
||||
</p>
|
||||
}
|
||||
|
||||
<h3>Development Mode</h3>
|
||||
<p>
|
||||
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
|
||||
</p>
|
||||
<p>
|
||||
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
|
||||
It can result in displaying sensitive information from exceptions to end users.
|
||||
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
|
||||
and restarting the app.
|
||||
</p>
|
||||
@@ -0,0 +1,84 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>@ViewData["Title"] - Web</title>
|
||||
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.11.2/font/bootstrap-icons.min.css">
|
||||
<link rel="stylesheet" href="~/css/site.css" asp-append-version="true" />
|
||||
<link rel="stylesheet" href="~/Web.styles.css" asp-append-version="true" />
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
|
||||
<div class="container-fluid">
|
||||
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">Web</a>
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target=".navbar-collapse" aria-controls="navbarSupportedContent"
|
||||
aria-expanded="false" aria-label="Toggle navigation">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
<div class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
|
||||
<ul class="navbar-nav flex-grow-1">
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Events">Events</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="StudentEvents">Student Event Picks</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="StudentEventHandout">Student Event Handout</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Teams">Teams</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="TeamGrid">Team Grid</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Students">Students</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Schedule">Schedule</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Regionals">Regionals</a>
|
||||
</li>
|
||||
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="State">State</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Nationals">Nationals</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
</header>
|
||||
<div class="container">
|
||||
<main role="main" class="pb-3">
|
||||
@RenderBody()
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<footer class="border-top footer text-muted">
|
||||
<div class="container">
|
||||
</div>
|
||||
</footer>
|
||||
<script src="~/lib/jquery/dist/jquery.min.js"></script>
|
||||
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="~/js/site.js" asp-append-version="true"></script>
|
||||
@await RenderSectionAsync("Scripts", required: false)
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,48 @@
|
||||
/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
|
||||
for details on configuring this project to bundle and minify static web assets. */
|
||||
|
||||
a.navbar-brand {
|
||||
white-space: normal;
|
||||
text-align: center;
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #0077cc;
|
||||
}
|
||||
|
||||
.btn-primary {
|
||||
color: #fff;
|
||||
background-color: #1b6ec2;
|
||||
border-color: #1861ac;
|
||||
}
|
||||
|
||||
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
|
||||
color: #fff;
|
||||
background-color: #1b6ec2;
|
||||
border-color: #1861ac;
|
||||
}
|
||||
|
||||
.border-top {
|
||||
border-top: 1px solid #e5e5e5;
|
||||
}
|
||||
.border-bottom {
|
||||
border-bottom: 1px solid #e5e5e5;
|
||||
}
|
||||
|
||||
.box-shadow {
|
||||
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
|
||||
}
|
||||
|
||||
button.accept-policy {
|
||||
font-size: 1rem;
|
||||
line-height: inherit;
|
||||
}
|
||||
|
||||
.footer {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
line-height: 60px;
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
|
||||
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>
|
||||
@@ -0,0 +1,3 @@
|
||||
@using Web
|
||||
@using Web.Models
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||
@@ -0,0 +1,3 @@
|
||||
@{
|
||||
Layout = "_Layout";
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="bootstrap" Version="5.3.2" />
|
||||
<PackageReference Include="RandomNameGenerator" Version="1.0.4" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\Core\Core.csproj" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<UpToDateCheckInput Remove="Views\Home\Teams.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<_ContentIncludedByDefault Remove="Views\Home\TeamGrid.cshtml" />
|
||||
<_ContentIncludedByDefault Remove="Views\Home\Teams.cshtml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<UpToDateCheckInput Remove="Views\Home\TeamGrid.cshtml" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
html {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
@media (min-width: 768px) {
|
||||
html {
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
@media print {
|
||||
body .container {
|
||||
max-width:1200px;
|
||||
}
|
||||
main {
|
||||
font-size: 11px;
|
||||
margin: 30pt;
|
||||
color: #000;
|
||||
background-color: #fff;
|
||||
}
|
||||
body header {
|
||||
display: none;
|
||||
}
|
||||
.nobrk {
|
||||
break-inside: avoid;
|
||||
}
|
||||
}
|
||||
|
||||
html {
|
||||
position: relative;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
margin-bottom: 60px;
|
||||
}
|
||||
|
||||
main {
|
||||
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif
|
||||
}
|
||||
|
||||
table {
|
||||
|
||||
}
|
||||
|
||||
.bluewhite, table.schedule {
|
||||
background-color: #4285F4;
|
||||
color: white !IMPORTANT;
|
||||
}
|
||||
|
||||
.first-pick { background-color: #dd7e6b; }
|
||||
.second-pick { background-color: #ea9999; }
|
||||
.third-pick { background-color: #f9cb9c; }
|
||||
.fourth-pick { background-color: #ffe599; }
|
||||
.fifth-pick { background-color: #fff2cc; }
|
||||
.sixth-pick { background-color: #fffaea; }
|
||||
.seventh-pick { background-color: #fffff0; }
|
||||
.non-pick { background-color: #f0f2f4; }
|
||||
.event-desc { padding-left: 40px; font-size:small; }
|
||||
.activity { font:xx-small; color:grey;}
|
||||
.regional { color: #f1c232; }
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 5.3 KiB |
@@ -0,0 +1,4 @@
|
||||
// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
|
||||
// for details on configuring this project to bundle and minify static web assets.
|
||||
|
||||
// Write your JavaScript code.
|
||||
@@ -0,0 +1,22 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2011-2021 Twitter, Inc.
|
||||
Copyright (c) 2011-2021 The Bootstrap Authors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
+4997
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user