From c08e9b478be7f974743a0859867c790babd16667 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Tue, 28 Nov 2023 10:25:22 -0700 Subject: [PATCH] renaming modules doesnt duplicate files anymore --- .../Components/Quiz/DroppableQuiz.razor.cs | 10 +- .../Shared/Course/AssignmentGroups.razor | 20 ++++ .../Shared/Course/CourseSettings.razor | 1 + .../Shared/Module/ModuleDetail.razor | 4 +- .../Configuration/AssignmentEditorContext.cs | 1 + .../Features/Configuration/CoursePlanner.cs | 77 +++--------- .../AssignmentSyncronizationExtensions.cs | 19 --- .../ModuleSyncronizationExtensions.cs | 110 +++--------------- Management/Services/FileStorageManager.cs | 13 ++- 9 files changed, 78 insertions(+), 177 deletions(-) diff --git a/Management.Web/Shared/Components/Quiz/DroppableQuiz.razor.cs b/Management.Web/Shared/Components/Quiz/DroppableQuiz.razor.cs index addde54..94496c3 100644 --- a/Management.Web/Shared/Components/Quiz/DroppableQuiz.razor.cs +++ b/Management.Web/Shared/Components/Quiz/DroppableQuiz.razor.cs @@ -1,3 +1,4 @@ +using System.Runtime.CompilerServices; using Microsoft.AspNetCore.Components; namespace Management.Web.Shared.Components.Quiz; @@ -41,7 +42,14 @@ public class DroppableQuiz : ComponentBase ); var NewQuizList = currentModule.Quizzes - .Select(q => q.Name + q.Description != Quiz.Name + Quiz.Description ? q : q with { DueAt = defaultDueTimeDate }) + .Select(q => + q.Name + q.Description != Quiz.Name + Quiz.Description + ? q : + q with { + DueAt = defaultDueTimeDate, + LockAt = q.LockAt > defaultDueTimeDate ? q.LockAt : defaultDueTimeDate + } + ) .ToArray(); var updatedModule = currentModule with { Quizzes = NewQuizList }; diff --git a/Management.Web/Shared/Course/AssignmentGroups.razor b/Management.Web/Shared/Course/AssignmentGroups.razor index 3fe53e4..c0deae5 100644 --- a/Management.Web/Shared/Course/AssignmentGroups.razor +++ b/Management.Web/Shared/Course/AssignmentGroups.razor @@ -17,6 +17,7 @@ planner.StateHasChanged -= reload; } + private bool syncingAssignmentGroups { get; set; } = false; private void AddAssignmentGroup() { if(planner.LocalCourse != null) @@ -83,6 +84,13 @@ } }; } + + private async Task SyncAssignmentGroupsWithCanvas() + { + syncingAssignmentGroups = true; + await planner.SyncAssignmentGroups(); + syncingAssignmentGroups = false; + } } @if(planner.LocalCourse != null) @@ -119,4 +127,16 @@ + Assignment Group + + + @if(syncingAssignmentGroups) + { + + } } diff --git a/Management.Web/Shared/Course/CourseSettings.razor b/Management.Web/Shared/Course/CourseSettings.razor index 615d3f2..105abd4 100644 --- a/Management.Web/Shared/Course/CourseSettings.razor +++ b/Management.Web/Shared/Course/CourseSettings.razor @@ -56,6 +56,7 @@ } } } + } } } diff --git a/Management/Features/Configuration/AssignmentEditorContext.cs b/Management/Features/Configuration/AssignmentEditorContext.cs index f24cd53..c5df014 100644 --- a/Management/Features/Configuration/AssignmentEditorContext.cs +++ b/Management/Features/Configuration/AssignmentEditorContext.cs @@ -153,6 +153,7 @@ public class AssignmentEditorContext (ulong)courseCanvasId, canvasModule.Id, Assignment.Name, + "Assignment", createdAssignmentCanvasId ); diff --git a/Management/Features/Configuration/CoursePlanner.cs b/Management/Features/Configuration/CoursePlanner.cs index 6f524f8..4a67c77 100644 --- a/Management/Features/Configuration/CoursePlanner.cs +++ b/Management/Features/Configuration/CoursePlanner.cs @@ -109,69 +109,6 @@ public class CoursePlanner return (CanvasAssignments, CanvasModules, CanvasModulesItems, CanvasQuizzes, CanvasAssignmentGroups); } - public async Task SyncWithCanvas() - { - if ( - LocalCourse == null - || LocalCourse.Settings.CanvasId == null - || CanvasAssignments == null - || CanvasModules == null - || CanvasQuizzes == null - ) - return; - - Console.WriteLine("syncing with canvas"); - LoadingCanvasData = true; - StateHasChanged?.Invoke(); - - var ( - canvasAssignments, - canvasModules, - canvasModuleItems, - canvasQuizzes, - canvasAssignmentGroups - ) = await LoadCanvasData(); - - LoadingCanvasData = true; - StateHasChanged?.Invoke(); - - var canvasId = - LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to sync with canvas"); - - var newAssignmentGroups = await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas( - canvasId, canvasAssignmentGroups, canvas); - LocalCourse = LocalCourse with - { - Settings = LocalCourse.Settings with - { - AssignmentGroups = newAssignmentGroups - } - }; - - - await LocalCourse.CreateAllModules( - canvasId, - CanvasModules, - canvas - ); - CanvasModules = await canvas.Modules.GetModules(canvasId); - - await LocalCourse.SortCanvasModulesByLocalOrder(canvasId, CanvasModules, canvas); - CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules); - - LocalCourse = await LocalCourse.SyncAssignmentsWithCanvas(canvasId, CanvasAssignments, canvas); - CanvasAssignments = await canvas.Assignments.GetAll(canvasId); - - CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules); - - await LocalCourse.SyncModuleItemsWithCanvas(canvasId, CanvasModulesItems, canvas, CanvasAssignments); - CanvasModulesItems = await canvas.Modules.GetAllModulesItems(canvasId, CanvasModules); - - LoadingCanvasData = false; - StateHasChanged?.Invoke(); - Console.WriteLine("done syncing with canvas\n"); - } - public async Task CreateModule(LocalModule newModule) { if(LocalCourse == null) @@ -188,4 +125,18 @@ public class CoursePlanner CanvasAssignments = null; CanvasModules = null; } + + public async Task SyncAssignmentGroups() + { + if(LocalCourse == null) + return; + + var canvasCourseId = + LocalCourse.Settings.CanvasId ?? throw new Exception("no course canvas id to use to create module"); + + + CanvasAssignmentGroups = await canvas.AssignmentGroups.GetAll(canvasCourseId); + + await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas(canvasCourseId, CanvasAssignmentGroups, canvas); + } } diff --git a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs index c030d6c..2bb6627 100644 --- a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs @@ -236,25 +236,6 @@ public static partial class AssignmentSyncronizationExtensions || !assignmentGroupSame; } - internal static async Task SyncAssignmentsWithCanvas( - this LocalCourse localCourse, - ulong canvasCourseId, - IEnumerable canvasAssignments, - CanvasService canvas - ) - { - var moduleTasks = localCourse.Modules.Select(async m => - { - var assignmentTasks = m.Assignments.Select( - async (a) => await localCourse.SyncAssignmentToCanvas(canvasCourseId, a, canvasAssignments, canvas) - ); - await Task.WhenAll(assignmentTasks); - return m; - }); - - var modules = await Task.WhenAll(moduleTasks); - return localCourse with { Modules = modules }; - } [GeneratedRegex("")] private static partial Regex CanvasScriptTagRegex(); diff --git a/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs index 021ee0a..c099b4a 100644 --- a/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/ModuleSyncronizationExtensions.cs @@ -7,50 +7,28 @@ namespace Management.Planner; public static partial class ModuleSyncronizationExtensions { - internal static async Task CreateAllModules( - this LocalCourse localCourse, - ulong canvasCourseId, - IEnumerable canvasModules, - CanvasService canvas - ) - { - var moduleTasks = localCourse.Modules.Select(async module => - { - var canvasModule = canvasModules.FirstOrDefault(cm => cm.Name == module.Name); - if (canvasModule == null) - { - var newModule = await canvas.Modules.CreateModule(canvasCourseId, module.Name); - } - if (canvasModule?.Name != module.Name) // TODO: maybe check to see if we have name change here - { - await canvas.Modules.UpdateModule(canvasCourseId, canvasModule.Id, module.Name, canvasModule.Position); - } - }); - await Task.WhenAll(moduleTasks); - } + // internal static async Task SortCanvasModulesByLocalOrder( + // this LocalCourse localCourse, + // ulong canvasId, + // IEnumerable canvasModules, + // CanvasService canvas + // ) + // { + // var currentCanvasPositions = canvasModules.ToDictionary(m => m.Id, m => m.Position); + // foreach (var (localModule, i) in localCourse.Modules.Select((m, i) => (m, i))) + // { - internal static async Task SortCanvasModulesByLocalOrder( - this LocalCourse localCourse, - ulong canvasId, - IEnumerable canvasModules, - CanvasService canvas - ) - { - var currentCanvasPositions = canvasModules.ToDictionary(m => m.Id, m => m.Position); - foreach (var (localModule, i) in localCourse.Modules.Select((m, i) => (m, i))) - { + // uint correctPosition = (uint)(i + 1); + // var canvasModule = canvasModules.FirstOrDefault(c => c.Name == localModule.Name) ?? throw new Exception($"error sorting canvas module, could not find canvas module with name {localModule.Name}"); ; - uint correctPosition = (uint)(i + 1); - var canvasModule = canvasModules.FirstOrDefault(c => c.Name == localModule.Name) ?? throw new Exception($"error sorting canvas module, could not find canvas module with name {localModule.Name}"); ; - - var currentCanvasPosition = currentCanvasPositions[canvasModule.Id]; - if (currentCanvasPosition != correctPosition) - { - await canvas.Modules.UpdateModule(canvasId, canvasModule.Id, localModule.Name, correctPosition); - } - } - } + // var currentCanvasPosition = currentCanvasPositions[canvasModule.Id]; + // if (currentCanvasPosition != correctPosition) + // { + // await canvas.Modules.UpdateModule(canvasId, canvasModule.Id, localModule.Name, correctPosition); + // } + // } + // } public static async Task SortModuleItems( this LocalModule localModule, @@ -64,19 +42,11 @@ public static partial class ModuleSyncronizationExtensions var moduleItemsInCorrectOrder = canvasModuleItems .OrderBy(i => i.ContentDetails?.DueAt) .Select((a, i) => (Item: a, Position: i + 1)); - // var localItemsWithCorrectOrder = localModule.Assignments - // .OrderBy(a => a.DueAt) - // .Select((a, i) => (Assignment: a, Position: i + 1)); - - // var canvasContentIdsByCurrentPosition = - // canvasModuleItems.ToDictionary(item => item.Position, item => item.ContentId) - // ?? new Dictionary(); foreach (var (moduleItem, position) in moduleItemsInCorrectOrder) { var itemIsInCorrectOrder = moduleItem.Position == position; - // var currentCanvasItem = canvasModuleItems.First(i => i.ContentId == moduleItem.CanvasId); if (!itemIsInCorrectOrder) { await canvas.UpdateModuleItem( @@ -123,46 +93,4 @@ public static partial class ModuleSyncronizationExtensions return anyUpdated; } - internal static async Task SyncModuleItemsWithCanvas( - this LocalCourse localCourse, - ulong courseCanvasId, - Dictionary> canvasModulesItems, - CanvasService canvas, - IEnumerable canvasAssignments - ) - { - foreach (var localModule in localCourse.Modules) - { - await localModule.SyncAndSortCanvasModule(courseCanvasId, canvasModulesItems, canvas, canvasAssignments); - } - } - - public static async Task SyncAndSortCanvasModule( - this LocalModule localModule, - ulong courseCanvasId, - Dictionary> canvasModulesItems, - CanvasService canvas, - IEnumerable canvasAssignments - ) - { - var canvasModule = canvasModulesItems.Keys.FirstOrDefault(k => k.Name == localModule.Name); - if (canvasModule == null) - { - throw new Exception($"cannot sync module items in canvas, could not find module with name ${localModule.Name}"); - } - - bool anyUpdated = await localModule.EnsureAllModulesItemsCreated( - courseCanvasId, - canvasModule, - canvasModulesItems, - canvas, - canvasAssignments - ); - - var canvasModuleItems = anyUpdated - ? await canvas.Modules.GetModuleItems(courseCanvasId, canvasModule.Id) - : canvasModulesItems[canvasModule]; - - await localModule.SortModuleItems(courseCanvasId, canvasModule.Id, canvas); - } } diff --git a/Management/Services/FileStorageManager.cs b/Management/Services/FileStorageManager.cs index 3a343dc..174d722 100644 --- a/Management/Services/FileStorageManager.cs +++ b/Management/Services/FileStorageManager.cs @@ -1,7 +1,6 @@ using LocalModels; using Management.Services; using YamlDotNet.Serialization; -using YamlDotNet.Serialization.NamingConventions; public class FileStorageManager { @@ -59,6 +58,18 @@ public class FileStorageManager await saveAssignments(course, module); } + var moduleNames = course.Modules.Select(m => m.Name); + foreach (var moduleDirectoryPath in Directory.EnumerateDirectories(courseDirectory)) + { + var directoryName = Path.GetFileName(moduleDirectoryPath); + if (!moduleNames.Contains(directoryName)) + { + Console.WriteLine($"deleting extra module directory, it was probably renamed {moduleDirectoryPath}"); + Directory.Delete(moduleDirectoryPath, true); + + } + } + } private static async Task saveSettings(LocalCourse course, string courseDirectory)