From 762c91c17f57a0efe7b93b6da94d70c622490f06 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Fri, 25 Aug 2023 13:40:33 -0600 Subject: [PATCH] added assignment group support --- .../Module/Assignment/AssignmentDetails.razor | 3 ++- .../AssignmentSyncronizationExtensions.cs | 25 +++++++++++++++---- .../QuizSyncronizationExtensions.cs | 4 +-- Management/Models/Local/LocalAssignment.cs | 5 ++++ Management/Models/Local/LocalQuiz.cs | 4 +++ .../Canvas/CanvasAssignmentService.cs | 16 +++++++++--- .../Services/Canvas/CanvasQuizService.cs | 7 +++++- requests/assignment.http | 6 ++++- 8 files changed, 56 insertions(+), 14 deletions(-) diff --git a/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor b/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor index 524f773..79fed0d 100644 --- a/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor +++ b/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor @@ -150,7 +150,8 @@ && planner.CanvasModules != null && Assignment.NeedsUpdates( planner.CanvasAssignments, - planner.LocalCourse.AssignmentTemplates + planner.LocalCourse.AssignmentTemplates, + Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.AssignmentGroups) ) ) { diff --git a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs index a360127..99057ef 100644 --- a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs @@ -24,6 +24,8 @@ public static partial class AssignmentSyncronizationExtensions localCourse.AssignmentTemplates ); + var canvasAssignmentGroupId = localAssignment.GetCanvasAssignmentGroupId(localCourse.AssignmentGroups); + return canvasAssignment != null ? await updateAssignmentIfNeeded( localCourse, @@ -31,9 +33,10 @@ public static partial class AssignmentSyncronizationExtensions localAssignment, canvasAssignments, canvas, - localHtmlDescription + localHtmlDescription, + canvasAssignmentGroupId ) - : await canvas.Assignments.Create(canvasCourseId, localAssignment, localHtmlDescription); + : await canvas.Assignments.Create(canvasCourseId, localAssignment, localHtmlDescription, canvasAssignmentGroupId); } private static async Task updateAssignmentIfNeeded( @@ -42,12 +45,14 @@ public static partial class AssignmentSyncronizationExtensions LocalAssignment localAssignment, IEnumerable canvasAssignments, CanvasService canvas, - string localHtmlDescription + string localHtmlDescription, + ulong? canvasAssignmentGroupId ) { var assignmentNeedsUpdates = localAssignment.NeedsUpdates( canvasAssignments, localCourse.AssignmentTemplates, + canvasAssignmentGroupId, quiet: false ); if (assignmentNeedsUpdates) @@ -55,7 +60,8 @@ public static partial class AssignmentSyncronizationExtensions await canvas.Assignments.Update( courseId: canvasCourseId, localAssignment, - localHtmlDescription + localHtmlDescription, + canvasAssignmentGroupId ); } return localAssignment; @@ -65,6 +71,7 @@ public static partial class AssignmentSyncronizationExtensions this LocalAssignment localAssignment, IEnumerable canvasAssignments, IEnumerable courseAssignmentTemplates, + ulong? canvasAssignmentGroupId, bool quiet = true ) { @@ -154,6 +161,9 @@ public static partial class AssignmentSyncronizationExtensions var submissionTypesSame = canvasAssignment.SubmissionTypes.SequenceEqual( localAssignment.SubmissionTypes.Select(t => t.ToString()) ); + var assignmentGroupSame = + canvasAssignmentGroupId != null + && canvasAssignmentGroupId == canvasAssignment.AssignmentGroupId; if (!quiet) { @@ -210,6 +220,10 @@ public static partial class AssignmentSyncronizationExtensions Console.WriteLine( $"Submission Types different for {localAssignment.Name}, local: {JsonSerializer.Serialize(localAssignment.SubmissionTypes.Select(t => t.ToString()))}, in canvas {JsonSerializer.Serialize(canvasAssignment.SubmissionTypes)}" ); + if(!assignmentGroupSame) + Console.WriteLine( + $"Canvas assignment group ids different for {localAssignment.Name}, local: {canvasAssignmentGroupId}, in canvas {canvasAssignment.AssignmentGroupId}" + ); } return !nameSame @@ -217,7 +231,8 @@ public static partial class AssignmentSyncronizationExtensions || !lockDatesSame || !descriptionSame || !pointsSame - || !submissionTypesSame; + || !submissionTypesSame + || !assignmentGroupSame; } internal static async Task SyncAssignmentsWithCanvas( diff --git a/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs index f6d39ae..54c6072 100644 --- a/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/QuizSyncronizationExtensions.cs @@ -43,14 +43,14 @@ public static partial class QuizSyncronizationExtensions ) { var isCreated = localQuiz.QuizIsCreated(canvasQuizzes); - + var canvasAssignmentGroupId = localQuiz.GetCanvasAssignmentGroupId(localCourse.AssignmentGroups); if (isCreated) { // TODO write update } else { - return await canvas.Quizzes.Create(canvasCourseId, localQuiz); + return await canvas.Quizzes.Create(canvasCourseId, localQuiz, canvasAssignmentGroupId); } return localQuiz; diff --git a/Management/Models/Local/LocalAssignment.cs b/Management/Models/Local/LocalAssignment.cs index 4a4d357..9136199 100644 --- a/Management/Models/Local/LocalAssignment.cs +++ b/Management/Models/Local/LocalAssignment.cs @@ -89,4 +89,9 @@ public record LocalAssignment return Markdig.Markdown.ToHtml(Description) + "
" + rubricHtml; } + + public ulong? GetCanvasAssignmentGroupId(IEnumerable assignmentGroups) => + assignmentGroups + .FirstOrDefault(g => g.Id == LocalAssignmentGroupId)? + .CanvasId; } diff --git a/Management/Models/Local/LocalQuiz.cs b/Management/Models/Local/LocalQuiz.cs index c74d9a2..f3ba5bb 100644 --- a/Management/Models/Local/LocalQuiz.cs +++ b/Management/Models/Local/LocalQuiz.cs @@ -21,4 +21,8 @@ public record LocalQuiz // If “until_after_last_attempt”, students can only see results after their last attempt. (Only valid if allowed_attempts > 1). Defaults to null. public IEnumerable Questions { get; init; } = Enumerable.Empty(); + public ulong? GetCanvasAssignmentGroupId(IEnumerable assignmentGroups) => + assignmentGroups + .FirstOrDefault(g => g.Id == LocalAssignmentGroupId)? + .CanvasId; } diff --git a/Management/Services/Canvas/CanvasAssignmentService.cs b/Management/Services/Canvas/CanvasAssignmentService.cs index 21532f3..6a32188 100644 --- a/Management/Services/Canvas/CanvasAssignmentService.cs +++ b/Management/Services/Canvas/CanvasAssignmentService.cs @@ -32,7 +32,8 @@ public class CanvasAssignmentService public async Task Create( ulong canvasCourseId, LocalAssignment localAssignment, - string htmlDescription + string htmlDescription, + ulong? canvasAssignmentGroupId ) { Console.WriteLine($"creating assignment: {localAssignment.Name}"); @@ -45,7 +46,8 @@ public class CanvasAssignmentService description = htmlDescription, due_at = localAssignment.DueAt, lock_at = localAssignment.LockAtDueDate ? localAssignment.DueAt : localAssignment.LockAt, - points_possible = localAssignment.PointsPossible + points_possible = localAssignment.PointsPossible, + assignment_group_id = canvasAssignmentGroupId, }; var bodyObj = new { assignment = body }; request.AddBody(bodyObj); @@ -60,7 +62,12 @@ public class CanvasAssignmentService return updatedLocalAssignment; } - public async Task Update(ulong courseId, LocalAssignment localAssignment, string htmlDescription) + public async Task Update( + ulong courseId, + LocalAssignment localAssignment, + string htmlDescription, + ulong? canvasAssignmentGroupId + ) { Console.WriteLine($"updating assignment: {localAssignment.Name}"); var url = $"courses/{courseId}/assignments/{localAssignment.CanvasId}"; @@ -72,7 +79,8 @@ public class CanvasAssignmentService description = htmlDescription, due_at = localAssignment.DueAt, lock_at = localAssignment.LockAtDueDate ? localAssignment.DueAt : localAssignment.LockAt, - points_possible = localAssignment.PointsPossible + points_possible = localAssignment.PointsPossible, + assignment_group_id = canvasAssignmentGroupId, }; var bodyObj = new { assignment = body }; request.AddBody(bodyObj); diff --git a/Management/Services/Canvas/CanvasQuizService.cs b/Management/Services/Canvas/CanvasQuizService.cs index 8aaad54..7dbac6a 100644 --- a/Management/Services/Canvas/CanvasQuizService.cs +++ b/Management/Services/Canvas/CanvasQuizService.cs @@ -36,7 +36,11 @@ public class CanvasQuizService ); } - public async Task Create(ulong canvasCourseId, LocalQuiz localQuiz) + public async Task Create( + ulong canvasCourseId, + LocalQuiz localQuiz, + ulong? canvasAssignmentGroupId + ) { Console.WriteLine($"Creating Quiz {localQuiz.Name}"); @@ -56,6 +60,7 @@ public class CanvasQuizService cant_go_back = false, due_at = localQuiz.DueAt, lock_at = localQuiz.LockAtDueDate ? localQuiz.DueAt : localQuiz.LockAt, + assignment_group_id = canvasAssignmentGroupId, } }; var request = new RestRequest(url); diff --git a/requests/assignment.http b/requests/assignment.http index 6fcb690..7f77f00 100644 --- a/requests/assignment.http +++ b/requests/assignment.http @@ -131,7 +131,11 @@ GET https://snow.instructure.com/api/v1/courses/872095/assignments/12676639?incl Authorization: Bearer {{$dotenv CANVAS_TOKEN}} ### -GET https://snow.instructure.com/api/v1/courses/871954/assignment_groups +GET https://snow.instructure.com/api/v1/courses/871954/assignment_groups/ +Authorization: Bearer {{$dotenv CANVAS_TOKEN}} + +### +GET https://snow.instructure.com/api/v1/courses/871954/assignment_groups/1943132 Authorization: Bearer {{$dotenv CANVAS_TOKEN}} ### GET https://snow.instructure.com/api/v1/courses/871954