halfway through localcourse transition

This commit is contained in:
2023-09-22 12:40:40 -06:00
parent c8ad67fd0b
commit e53222e35d
18 changed files with 152 additions and 50 deletions

View File

@@ -34,8 +34,8 @@
if(planner.LocalCourse == null) if(planner.LocalCourse == null)
{ {
var courses = await yamlManager.LoadSavedCourses(); var courses = await yamlManager.LoadSavedCourses();
planner.LocalCourse = courses.First(c => c.Name == CourseName); planner.LocalCourse = courses.First(c => c.Settings.Name == CourseName);
logger.LogInformation($"set course to '{planner.LocalCourse?.Name}'"); logger.LogInformation($"set course to '{planner.LocalCourse?.Settings.Name}'");
} }
if(assignmentContext.Assignment == null) if(assignmentContext.Assignment == null)

View File

@@ -25,7 +25,7 @@
if(planner.LocalCourse == null) if(planner.LocalCourse == null)
{ {
var courses = await yamlManager.LoadSavedCourses(); var courses = await yamlManager.LoadSavedCourses();
planner.LocalCourse = courses.First(c => c.Name == CourseName); planner.LocalCourse = courses.First(c => c.Settings.Name == CourseName);
} }
base.OnInitialized(); base.OnInitialized();
loading = false; loading = false;
@@ -66,12 +66,12 @@
<a <a
class="btn btn-outline-secondary" class="btn btn-outline-secondary"
target="_blank" target="_blank"
href="@($"{Environment.GetEnvironmentVariable("CANVAS_URL")}/courses/{planner.LocalCourse.CanvasId}")" href="@($"{Environment.GetEnvironmentVariable("CANVAS_URL")}/courses/{planner.LocalCourse.Settings.CanvasId}")"
> >
View In Canvas View In Canvas
</a> </a>
<div class="my-auto ms-2 d-inline"> <div class="my-auto ms-2 d-inline">
@planner.LocalCourse.Name @planner.LocalCourse.Settings.Name
</div> </div>
</div> </div>

View File

@@ -104,7 +104,7 @@
View In Canvas View In Canvas
</a> </a>
<div class="my-auto ms-2 d-inline"> <div class="my-auto ms-2 d-inline">
@planner.LocalCourse.Name @planner.LocalCourse.Settings.Name
</div> </div>
</div> </div>

View File

@@ -79,9 +79,9 @@
{ {
Modules = newModules Modules = newModules
}; };
if (assignment.CanvasId != null && planner.LocalCourse.CanvasId != null) if (assignment.CanvasId != null && planner.LocalCourse.Settings.CanvasId != null)
{ {
ulong courseId = planner.LocalCourse.CanvasId ?? throw new Exception("cannot delete if no course id"); ulong courseId = planner.LocalCourse.Settings.CanvasId ?? throw new Exception("cannot delete if no course id");
await canvas.Assignments.Delete(courseId, assignment); await canvas.Assignments.Delete(courseId, assignment);
} }
} }
@@ -190,7 +190,7 @@
class="btn btn-primary mx-2" class="btn btn-primary mx-2"
@onclick="@(() => { @onclick="@(() => {
assignmentContext.Assignment = null; assignmentContext.Assignment = null;
Navigation.NavigateTo("/course/" + planner.LocalCourse?.Name); Navigation.NavigateTo("/course/" + planner.LocalCourse?.Settings.Name);
})" })"
> >
Done Done

View File

@@ -21,7 +21,7 @@
if( if(
planner.CanvasAssignments == null planner.CanvasAssignments == null
&& planner.LocalCourse != null && planner.LocalCourse != null
&& planner.LocalCourse.CanvasId != null && planner.LocalCourse.Settings.CanvasId != null
) )
{ {
await planner.LoadCanvasData(); await planner.LoadCanvasData();
@@ -48,7 +48,7 @@
{ {
<div class="py-2"> <div class="py-2">
@foreach (var month in SemesterPlanner.GetMonthsBetweenDates(planner.LocalCourse.StartDate, planner.LocalCourse.EndDate)) @foreach (var month in SemesterPlanner.GetMonthsBetweenDates(planner.LocalCourse.Settings.StartDate, planner.LocalCourse.Settings.EndDate))
{ {
<MonthDetail Month="month" /> <MonthDetail Month="month" />
<hr /> <hr />

View File

@@ -28,8 +28,11 @@
{ {
planner.LocalCourse = planner.LocalCourse with planner.LocalCourse = planner.LocalCourse with
{ {
StartDate=selectedTerm.StartAt ?? new DateTime(), Settings = planner.LocalCourse.Settings with
EndDate=selectedTerm.EndAt ?? new DateTime(), {
StartDate=selectedTerm.StartAt ?? new DateTime(),
EndDate=selectedTerm.EndAt ?? new DateTime(),
}
}; };
} }
} }
@@ -43,10 +46,10 @@
{ {
if (firstRender) if (firstRender)
{ {
if(planner.LocalCourse != null && planner.LocalCourse.CanvasId != null) if(planner.LocalCourse != null && planner.LocalCourse.Settings.CanvasId != null)
{ {
loading = true; loading = true;
ulong id = planner.LocalCourse?.CanvasId ?? throw new Exception("wtf how did i get here"); ulong id = planner.LocalCourse?.Settings.CanvasId ?? throw new Exception("wtf how did i get here");
var canvasCourse = await canvas.GetCourse(id); var canvasCourse = await canvas.GetCourse(id);
terms = await canvas.GetCurrentTermsFor(canvasCourse.StartAt); terms = await canvas.GetCurrentTermsFor(canvasCourse.StartAt);
loading = false; loading = false;

View File

@@ -19,7 +19,7 @@
{ {
@* logger.LogInformation("here"); *@ @* logger.LogInformation("here"); *@
planner.LocalCourse = course; planner.LocalCourse = course;
Navigation.NavigateTo("/course/" + course.Name); Navigation.NavigateTo("/course/" + course.Settings.Name);
Console.WriteLine("navigated to course detail"); Console.WriteLine("navigated to course detail");
} }
} }
@@ -30,10 +30,10 @@
<h3>Stored Courses</h3> <h3>Stored Courses</h3>
@foreach (var course in localCourses) @foreach (var course in localCourses)
{ {
var location = "/course/" + course.Name; var location = "/course/" + course.Settings.Name;
<div> <div>
<h4 class="m-3 hover-underline-animation" @onclick="(e) => handleClick(e, course)" role='button'> <h4 class="m-3 hover-underline-animation" @onclick="(e) => handleClick(e, course)" role='button'>
@course.Name @course.Settings.Name
</h4> </h4>
</div> </div>

View File

@@ -61,11 +61,13 @@
var course = new LocalCourse var course = new LocalCourse
{ {
Modules = new LocalModule[] {}, Modules = new LocalModule[] {},
Name = selectedCourse.Name,
CanvasId = selectedCourse.Id,
DaysOfWeek = days, DaysOfWeek = days,
StartDate = selectedTerm?.StartAt ?? new DateTime(), Settings = new LocalCourseSettings() {
EndDate = selectedTerm?.EndAt ?? new DateTime(), Name = selectedCourse.Name,
CanvasId = selectedCourse.Id,
StartDate = selectedTerm?.StartAt ?? new DateTime(),
EndDate = selectedTerm?.EndAt ?? new DateTime(),
}
}; };
await yamlManager.SaveCourseAsync(course); await yamlManager.SaveCourseAsync(course);
NewFileCreated(); NewFileCreated();
@@ -80,7 +82,7 @@
loadingCourses = true; loadingCourses = true;
localCourses = await yamlManager.LoadSavedCourses(); localCourses = await yamlManager.LoadSavedCourses();
var storedCourseIds = localCourses.Select(c => c.CanvasId); var storedCourseIds = localCourses.Select(c => c.Settings.CanvasId);
var allCourses = await canvas.GetCourses((ulong)selectedTermId); var allCourses = await canvas.GetCourses((ulong)selectedTermId);
courses = allCourses.Where(c => !storedCourseIds.Contains(c.Id)); courses = allCourses.Where(c => !storedCourseIds.Contains(c.Id));
loadingCourses = false; loadingCourses = false;

View File

@@ -48,7 +48,7 @@
private void OnClick() private void OnClick()
{ {
assignmentContext.Assignment = Assignment; assignmentContext.Assignment = Assignment;
Navigation.NavigateTo("/course/" + planner.LocalCourse.Name + "/assignment/" + Assignment.Id); Navigation.NavigateTo("/course/" + planner.LocalCourse?.Settings.Name + "/assignment/" + Assignment.Id);
} }
} }
@@ -73,7 +73,7 @@
@if(isSyncedWithCanvas) @if(isSyncedWithCanvas)
{ {
@if(planner.LocalCourse != null @if(planner.LocalCourse != null
&& planner.LocalCourse.CanvasId != null && planner.LocalCourse.Settings.CanvasId != null
&& planner.CanvasAssignments != null && planner.CanvasAssignments != null
&& planner.CanvasModules != null && planner.CanvasModules != null
&& Assignment.NeedsUpdates( && Assignment.NeedsUpdates(

View File

@@ -37,7 +37,7 @@
if(planner.LocalCourse != null) if(planner.LocalCourse != null)
{ {
assignmentContext.Assignment = Assignment; assignmentContext.Assignment = Assignment;
Navigation.NavigateTo("/course/" + planner.LocalCourse.Name + "/assignment/" + Assignment.Id); Navigation.NavigateTo("/course/" + planner.LocalCourse.Settings.Name + "/assignment/" + Assignment.Id);
logger.LogInformation("navigating to assignment page"); logger.LogInformation("navigating to assignment page");
} }
} }

View File

@@ -70,8 +70,8 @@
var isClassDay = planner.LocalCourse?.DaysOfWeek.Contains(notNullDay) ?? false; var isClassDay = planner.LocalCourse?.DaysOfWeek.Contains(notNullDay) ?? false;
var dayInSemester = var dayInSemester =
isClassDay isClassDay
&& date <= planner.LocalCourse?.EndDate && date <= planner.LocalCourse?.Settings.EndDate
&& date >= planner.LocalCourse?.StartDate; && date >= planner.LocalCourse?.Settings.StartDate;
var totalClasses = dayInSemester var totalClasses = dayInSemester
? "bg-light-subtle text-light " + baseClasses ? "bg-light-subtle text-light " + baseClasses

View File

@@ -9,6 +9,8 @@ public class SemesterPlanner
{ {
var monthsInTerm = 1 + ((endDate.Year - startDate.Year) * 12) + endDate.Month - startDate.Month; var monthsInTerm = 1 + ((endDate.Year - startDate.Year) * 12) + endDate.Month - startDate.Month;
Console.WriteLine(monthsInTerm);
return Enumerable return Enumerable
.Range(0, monthsInTerm) .Range(0, monthsInTerm)
.Select(monthDiff => .Select(monthDiff =>

View File

@@ -30,18 +30,33 @@ public class CoursePlanner
get => _localCourse; get => _localCourse;
set set
{ {
if (value == null) if (value == null)
{ {
_localCourse = null; _localCourse = null;
StateHasChanged?.Invoke(); StateHasChanged?.Invoke();
return; return;
} }
var courseWithSettings = value with
{
Settings = value.Settings with
{
AssignmentGroups = value.AssignmentGroups,
Name = value.Settings.Name,
DaysOfWeek = value.DaysOfWeek,
CanvasId = value.Settings.CanvasId,
StartDate = value.Settings.StartDate,
DefaultDueTime = value.DefaultDueTime,
AssignmentTemplates = value.AssignmentTemplates,
}
};
var verifiedCourse = value.GeneralCourseCleanup(); var verifiedCourse = courseWithSettings.GeneralCourseCleanup();
_debounceTimer?.Dispose(); _debounceTimer?.Dispose();
_debounceTimer = new Timer( _debounceTimer = new Timer(
(_) => saveCourseToFile(value), async (_) => await saveCourseToFile(courseWithSettings),
null, null,
_debounceInterval, _debounceInterval,
Timeout.Infinite Timeout.Infinite
@@ -52,7 +67,7 @@ public class CoursePlanner
} }
} }
private void saveCourseToFile(LocalCourse courseAsOfDebounce) private async Task saveCourseToFile(LocalCourse courseAsOfDebounce)
{ {
_debounceTimer?.Dispose(); _debounceTimer?.Dispose();
@@ -60,12 +75,12 @@ public class CoursePlanner
if (LocalCourse == null) if (LocalCourse == null)
{ {
Console.WriteLine("saving course as of debounce call time"); Console.WriteLine("saving course as of debounce call time");
yamlManager.SaveCourse(courseAsOfDebounce); await yamlManager.SaveCourseAsync(courseAsOfDebounce);
} }
else else
{ {
Console.WriteLine("Saving latest version of file"); Console.WriteLine("Saving latest version of file");
yamlManager.SaveCourse(LocalCourse); await yamlManager.SaveCourseAsync(LocalCourse);
} }
} }
@@ -89,7 +104,7 @@ public class CoursePlanner
StateHasChanged?.Invoke(); StateHasChanged?.Invoke();
var canvasId = var canvasId =
LocalCourse?.CanvasId ?? throw new Exception("no canvas id found for selected course"); LocalCourse?.Settings.CanvasId ?? throw new Exception("no canvas id found for selected course");
var assignmentsTask = canvas.Assignments.GetAll(canvasId); var assignmentsTask = canvas.Assignments.GetAll(canvasId);
var quizzesTask = canvas.Quizzes.GetAll(canvasId); var quizzesTask = canvas.Quizzes.GetAll(canvasId);
@@ -112,7 +127,7 @@ public class CoursePlanner
{ {
if ( if (
LocalCourse == null LocalCourse == null
|| LocalCourse.CanvasId == null || LocalCourse.Settings.CanvasId == null
|| CanvasAssignments == null || CanvasAssignments == null
|| CanvasModules == null || CanvasModules == null
|| CanvasQuizzes == null || CanvasQuizzes == null
@@ -141,7 +156,7 @@ public class CoursePlanner
); );
var canvasId = var canvasId =
LocalCourse.CanvasId ?? throw new Exception("no course canvas id to sync with canvas"); LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to sync with canvas");
var newAssignmentGroups = await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas( var newAssignmentGroups = await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas(
canvasId, canvasAssignmentGroups, canvas); canvasId, canvasAssignmentGroups, canvas);

View File

@@ -25,21 +25,24 @@ public static class CoursePlannerExtensions
.ToArray(); .ToArray();
var cleanStartDay = new DateTime( var cleanStartDay = new DateTime(
incomingCourse.StartDate.Year, incomingCourse.Settings.StartDate.Year,
incomingCourse.StartDate.Month, incomingCourse.Settings.StartDate.Month,
incomingCourse.StartDate.Day incomingCourse.Settings.StartDate.Day
); );
var cleanEndDay = new DateTime( var cleanEndDay = new DateTime(
incomingCourse.EndDate.Year, incomingCourse.Settings.EndDate.Year,
incomingCourse.EndDate.Month, incomingCourse.Settings.EndDate.Month,
incomingCourse.EndDate.Day incomingCourse.Settings.EndDate.Day
); );
return incomingCourse with return incomingCourse with
{ {
Modules = cleanModules, Modules = cleanModules,
StartDate = cleanStartDay, Settings = incomingCourse.Settings with
EndDate = cleanEndDay, {
StartDate = cleanStartDay,
EndDate = cleanEndDay,
}
}; };
} }

View File

@@ -1,3 +1,5 @@
using YamlDotNet.Serialization;
namespace LocalModels; namespace LocalModels;
public record RubricItem public record RubricItem
@@ -95,4 +97,12 @@ public record LocalAssignment
assignmentGroups assignmentGroups
.FirstOrDefault(g => g.Id == LocalAssignmentGroupId)? .FirstOrDefault(g => g.Id == LocalAssignmentGroupId)?
.CanvasId; .CanvasId;
public string ToYaml()
{
var serializer = new SerializerBuilder().DisableAliases().Build();
var yaml = serializer.Serialize(this);
return yaml;
}
} }

View File

@@ -3,6 +3,21 @@ namespace LocalModels;
public record LocalCourse public record LocalCourse
{ {
public IEnumerable<LocalModule> Modules { get; init; } = Enumerable.Empty<LocalModule>(); public IEnumerable<LocalModule> Modules { get; init; } = Enumerable.Empty<LocalModule>();
public IEnumerable<LocalAssignmentGroup> AssignmentGroups { get; init; } =
Enumerable.Empty<LocalAssignmentGroup>();
public IEnumerable<DayOfWeek> DaysOfWeek { get; init; } = Enumerable.Empty<DayOfWeek>();
public SimpleTimeOnly DefaultDueTime { get; init; } = new SimpleTimeOnly();
public IEnumerable<AssignmentTemplate> AssignmentTemplates { get; init; } =
Enumerable.Empty<AssignmentTemplate>();
public LocalCourseSettings Settings { get; set; }
}
public record LocalCourseSettings
{
public IEnumerable<LocalAssignmentGroup> AssignmentGroups { get; init; } =
Enumerable.Empty<LocalAssignmentGroup>();
public string Name { get; init; } = string.Empty; public string Name { get; init; } = string.Empty;
public IEnumerable<DayOfWeek> DaysOfWeek { get; init; } = Enumerable.Empty<DayOfWeek>(); public IEnumerable<DayOfWeek> DaysOfWeek { get; init; } = Enumerable.Empty<DayOfWeek>();
public ulong? CanvasId { get; init; } public ulong? CanvasId { get; init; }
@@ -11,8 +26,6 @@ public record LocalCourse
public SimpleTimeOnly DefaultDueTime { get; init; } = new SimpleTimeOnly(); public SimpleTimeOnly DefaultDueTime { get; init; } = new SimpleTimeOnly();
public IEnumerable<AssignmentTemplate> AssignmentTemplates { get; init; } = public IEnumerable<AssignmentTemplate> AssignmentTemplates { get; init; } =
Enumerable.Empty<AssignmentTemplate>(); Enumerable.Empty<AssignmentTemplate>();
public IEnumerable<LocalAssignmentGroup> AssignmentGroups { get; init; } =
Enumerable.Empty<LocalAssignmentGroup>();
} }
public record SimpleTimeOnly public record SimpleTimeOnly

View File

@@ -1,3 +1,5 @@
using YamlDotNet.Serialization;
namespace LocalModels; namespace LocalModels;
public record LocalQuiz public record LocalQuiz
@@ -25,4 +27,11 @@ public record LocalQuiz
assignmentGroups assignmentGroups
.FirstOrDefault(g => g.Id == LocalAssignmentGroupId)? .FirstOrDefault(g => g.Id == LocalAssignmentGroupId)?
.CanvasId; .CanvasId;
public string ToYaml()
{
var serializer = new SerializerBuilder().DisableAliases().Build();
var yaml = serializer.Serialize(this);
return yaml;
}
} }

View File

@@ -7,6 +7,7 @@ public class YamlManager
public string CourseToYaml(LocalCourse course) public string CourseToYaml(LocalCourse course)
{ {
var serializer = new SerializerBuilder().DisableAliases().Build(); var serializer = new SerializerBuilder().DisableAliases().Build();
var yaml = serializer.Serialize(course); var yaml = serializer.Serialize(course);
return yaml; return yaml;
@@ -24,16 +25,60 @@ public class YamlManager
{ {
var courseString = CourseToYaml(course); var courseString = CourseToYaml(course);
await File.WriteAllTextAsync($"../storage/{course.Name}.yml", courseString); var courseDirectory = $"../storage/{course.Settings.Name}";
if (!Directory.Exists(courseDirectory))
Directory.CreateDirectory(courseDirectory);
await SaveModules(course);
await File.WriteAllTextAsync($"../storage/{course.Settings.Name}.yml", courseString);
} }
public void SaveCourse(LocalCourse course) public async Task SaveModules(LocalCourse course)
{ {
var courseString = CourseToYaml(course); var courseDirectory = $"../storage/{course.Settings.Name}";
foreach (var module in course.Modules)
{
var moduleDirectory = courseDirectory + "/" + module.Name;
if (!Directory.Exists(moduleDirectory))
Directory.CreateDirectory(moduleDirectory);
await SaveQuizzes(course, module);
await SaveAssignments(course, module);
}
File.WriteAllText($"../storage/{course.Name}.yml", courseString);
} }
public async Task SaveQuizzes(LocalCourse course, LocalModule module)
{
var quizzesDirectory = $"../storage/{course.Settings.Name}/{module.Name}/quizzes";
if (!Directory.Exists(quizzesDirectory))
Directory.CreateDirectory(quizzesDirectory);
foreach(var quiz in module.Quizzes)
{
var filePath = quizzesDirectory + "/" + quiz.Name+ ".yml"; ;
var quizYaml = quiz.ToYaml();
await File.WriteAllTextAsync(filePath, quizYaml);
}
}
public async Task SaveAssignments(LocalCourse course, LocalModule module)
{
var assignmentsDirectory = $"../storage/{course.Settings.Name}/{module.Name}/assignments";
if (!Directory.Exists(assignmentsDirectory))
Directory.CreateDirectory(assignmentsDirectory);
foreach (var assignment in module.Assignments)
{
var filePath = assignmentsDirectory + "/" + assignment.Name + ".yml";
var assignmentYaml = assignment.ToYaml();
await File.WriteAllTextAsync(filePath, assignmentYaml);
}
}
public async Task<IEnumerable<LocalCourse>> LoadSavedCourses() public async Task<IEnumerable<LocalCourse>> LoadSavedCourses()
{ {
string path = "../storage/"; string path = "../storage/";