diff --git a/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor b/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor index 5bb608a..73b30bd 100644 --- a/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor +++ b/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor @@ -1,5 +1,6 @@ @using Management.Web.Shared.Components @using Management.Web.Shared.Components.AssignmentForm +@using CanvasModel.Assignments; @inject DragContainer dragContainer @inject CoursePlanner planner @@ -39,12 +40,14 @@ dragContainer.DropCallback = null; } - private bool isSyncedWithCanvas => - planner + private CanvasAssignment? assignmentInCanvas => planner .CanvasAssignments? .FirstOrDefault( - a => a.Id == Assignment.CanvasId - ) != null; + a => a.Name == Assignment.Name + ); + + private bool isSyncedWithCanvas => + assignmentInCanvas != null; private void OnClick() { assignmentContext.Assignment = Assignment; @@ -76,7 +79,7 @@ && planner.CanvasAssignments != null && planner.CanvasModules != null && Assignment.NeedsUpdates( - planner.CanvasAssignments, + assignmentInCanvas, Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.Settings.AssignmentGroups) ) ) diff --git a/Management/Features/Configuration/AssignmentEditorContext.cs b/Management/Features/Configuration/AssignmentEditorContext.cs index 008e225..c0f40b2 100644 --- a/Management/Features/Configuration/AssignmentEditorContext.cs +++ b/Management/Features/Configuration/AssignmentEditorContext.cs @@ -92,7 +92,7 @@ public class AssignmentEditorContext return; } - var createdAssignment = await planner.LocalCourse.SyncAssignmentToCanvas( + var createdAssignmentCanvasId = await planner.LocalCourse.SyncAssignmentToCanvas( canvasCourseId: (ulong)courseCanvasId, localAssignment: Assignment, canvasAssignments: planner.CanvasAssignments, @@ -111,7 +111,7 @@ public class AssignmentEditorContext (ulong)currentModule.CanvasId, Assignment.Name, "Assignment", - (ulong)createdAssignment.CanvasId + createdAssignmentCanvasId ); await planner.LocalCourse.Modules.First().SortModuleItems( diff --git a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs index 78a817a..a5b0469 100644 --- a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs @@ -12,7 +12,7 @@ public static partial class AssignmentSyncronizationExtensions { - internal static async Task SyncAssignmentToCanvas( + internal static async Task SyncAssignmentToCanvas( this LocalCourse localCourse, ulong canvasCourseId, LocalAssignment localAssignment, @@ -22,7 +22,7 @@ public static partial class AssignmentSyncronizationExtensions { // ignore past assignments if(localAssignment.DueAt < DateTime.Now) - return localAssignment; + return (ulong)localAssignment.CanvasId; var canvasAssignment = canvasAssignments.FirstOrDefault( ca => ca.Id == localAssignment.CanvasId @@ -36,7 +36,7 @@ public static partial class AssignmentSyncronizationExtensions localCourse, canvasCourseId, localAssignment, - canvasAssignments, + canvasAssignment, canvas, localHtmlDescription, canvasAssignmentGroupId @@ -44,18 +44,19 @@ public static partial class AssignmentSyncronizationExtensions : await canvas.Assignments.Create(canvasCourseId, localAssignment, localHtmlDescription, canvasAssignmentGroupId); } - private static async Task updateAssignmentIfNeeded( + private static async Task updateAssignmentIfNeeded( LocalCourse localCourse, ulong canvasCourseId, LocalAssignment localAssignment, - IEnumerable canvasAssignments, + CanvasAssignment canvasAssignment, CanvasService canvas, string localHtmlDescription, ulong? canvasAssignmentGroupId ) { + var assignmentNeedsUpdates = localAssignment.NeedsUpdates( - canvasAssignments, + canvasAssignment, canvasAssignmentGroupId, quiet: false ); @@ -68,17 +69,16 @@ public static partial class AssignmentSyncronizationExtensions canvasAssignmentGroupId ); } - return localAssignment; + return canvasAssignment.Id; } public static bool NeedsUpdates( this LocalAssignment localAssignment, - IEnumerable canvasAssignments, + CanvasAssignment canvasAssignment, ulong? canvasAssignmentGroupId, bool quiet = true ) { - var canvasAssignment = canvasAssignments.First(ca => ca.Id == localAssignment.CanvasId); var localHtmlDescription = localAssignment .GetDescriptionHtml() @@ -252,8 +252,8 @@ public static partial class AssignmentSyncronizationExtensions var assignmentTasks = m.Assignments.Select( async (a) => await localCourse.SyncAssignmentToCanvas(canvasCourseId, a, canvasAssignments, canvas) ); - var assignments = await Task.WhenAll(assignmentTasks); - return m with { Assignments = assignments }; + await Task.WhenAll(assignmentTasks); + return m; }); var modules = await Task.WhenAll(moduleTasks); diff --git a/Management/Services/Canvas/CanvasAssignmentService.cs b/Management/Services/Canvas/CanvasAssignmentService.cs index df4fa01..02079f4 100644 --- a/Management/Services/Canvas/CanvasAssignmentService.cs +++ b/Management/Services/Canvas/CanvasAssignmentService.cs @@ -35,7 +35,7 @@ public class CanvasAssignmentService ); } - public async Task Create( + public async Task Create( ulong canvasCourseId, LocalAssignment localAssignment, string htmlDescription, @@ -61,11 +61,10 @@ public class CanvasAssignmentService if (canvasAssignment == null) throw new Exception("created canvas assignment was null"); - var updatedLocalAssignment = localAssignment with { CanvasId = canvasAssignment.Id }; - await CreateRubric(canvasCourseId, updatedLocalAssignment); + await CreateRubric(canvasCourseId, canvasAssignment.Id, localAssignment); - return updatedLocalAssignment; + return canvasAssignment.Id; } public async Task Update( @@ -93,7 +92,7 @@ public class CanvasAssignmentService await webRequestor.PutAsync(request); - await CreateRubric(courseId, localAssignment); + await CreateRubric(courseId, (ulong)localAssignment.CanvasId, localAssignment); } public async Task Delete(ulong courseId, ulong assignmentCanvasId, string assignmentName) @@ -109,10 +108,8 @@ public class CanvasAssignmentService } } - public async Task CreateRubric(ulong courseId, LocalAssignment localAssignment) + public async Task CreateRubric(ulong courseId, ulong assignmentCanvasId, LocalAssignment localAssignment) { - if (localAssignment.CanvasId == null) - throw new Exception("cannot create rubric if no canvas id in assignment"); var criterion = new Dictionary(); @@ -136,18 +133,18 @@ public class CanvasAssignmentService // https://canvas.instructure.com/doc/api/rubrics.html#method.rubrics.create var body = new { - rubric_association_id = localAssignment.CanvasId, + rubric_association_id = assignmentCanvasId, rubric = new { title = $"Rubric for Assignment: {localAssignment.Name}", - association_id = localAssignment.CanvasId, + association_id = assignmentCanvasId, association_type = "Assignment", use_for_grading = true, criteria = criterion, }, rubric_association = new { - association_id = localAssignment.CanvasId, + association_id = assignmentCanvasId, association_type = "Assignment", purpose = "grading", use_for_grading = true, @@ -167,7 +164,7 @@ public class CanvasAssignmentService { assignment = new { points_possible = localAssignment.PointsPossible } }; - var adjustmentUrl = $"courses/{courseId}/assignments/{localAssignment.CanvasId}"; + var adjustmentUrl = $"courses/{courseId}/assignments/{assignmentCanvasId}"; var pointAdjustmentRequest = new RestRequest(adjustmentUrl); pointAdjustmentRequest.AddBody(assignmentPointCorrectionBody); var (_, _) = await webRequestor.PutAsync(pointAdjustmentRequest);