added assignment group support

This commit is contained in:
2023-08-25 13:40:33 -06:00
parent 1ac6cfd57c
commit 762c91c17f
8 changed files with 56 additions and 14 deletions

View File

@@ -150,7 +150,8 @@
&& planner.CanvasModules != null && planner.CanvasModules != null
&& Assignment.NeedsUpdates( && Assignment.NeedsUpdates(
planner.CanvasAssignments, planner.CanvasAssignments,
planner.LocalCourse.AssignmentTemplates planner.LocalCourse.AssignmentTemplates,
Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.AssignmentGroups)
) )
) )
{ {

View File

@@ -24,6 +24,8 @@ public static partial class AssignmentSyncronizationExtensions
localCourse.AssignmentTemplates localCourse.AssignmentTemplates
); );
var canvasAssignmentGroupId = localAssignment.GetCanvasAssignmentGroupId(localCourse.AssignmentGroups);
return canvasAssignment != null return canvasAssignment != null
? await updateAssignmentIfNeeded( ? await updateAssignmentIfNeeded(
localCourse, localCourse,
@@ -31,9 +33,10 @@ public static partial class AssignmentSyncronizationExtensions
localAssignment, localAssignment,
canvasAssignments, canvasAssignments,
canvas, canvas,
localHtmlDescription localHtmlDescription,
canvasAssignmentGroupId
) )
: await canvas.Assignments.Create(canvasCourseId, localAssignment, localHtmlDescription); : await canvas.Assignments.Create(canvasCourseId, localAssignment, localHtmlDescription, canvasAssignmentGroupId);
} }
private static async Task<LocalAssignment> updateAssignmentIfNeeded( private static async Task<LocalAssignment> updateAssignmentIfNeeded(
@@ -42,12 +45,14 @@ public static partial class AssignmentSyncronizationExtensions
LocalAssignment localAssignment, LocalAssignment localAssignment,
IEnumerable<CanvasAssignment> canvasAssignments, IEnumerable<CanvasAssignment> canvasAssignments,
CanvasService canvas, CanvasService canvas,
string localHtmlDescription string localHtmlDescription,
ulong? canvasAssignmentGroupId
) )
{ {
var assignmentNeedsUpdates = localAssignment.NeedsUpdates( var assignmentNeedsUpdates = localAssignment.NeedsUpdates(
canvasAssignments, canvasAssignments,
localCourse.AssignmentTemplates, localCourse.AssignmentTemplates,
canvasAssignmentGroupId,
quiet: false quiet: false
); );
if (assignmentNeedsUpdates) if (assignmentNeedsUpdates)
@@ -55,7 +60,8 @@ public static partial class AssignmentSyncronizationExtensions
await canvas.Assignments.Update( await canvas.Assignments.Update(
courseId: canvasCourseId, courseId: canvasCourseId,
localAssignment, localAssignment,
localHtmlDescription localHtmlDescription,
canvasAssignmentGroupId
); );
} }
return localAssignment; return localAssignment;
@@ -65,6 +71,7 @@ public static partial class AssignmentSyncronizationExtensions
this LocalAssignment localAssignment, this LocalAssignment localAssignment,
IEnumerable<CanvasAssignment> canvasAssignments, IEnumerable<CanvasAssignment> canvasAssignments,
IEnumerable<AssignmentTemplate> courseAssignmentTemplates, IEnumerable<AssignmentTemplate> courseAssignmentTemplates,
ulong? canvasAssignmentGroupId,
bool quiet = true bool quiet = true
) )
{ {
@@ -154,6 +161,9 @@ public static partial class AssignmentSyncronizationExtensions
var submissionTypesSame = canvasAssignment.SubmissionTypes.SequenceEqual( var submissionTypesSame = canvasAssignment.SubmissionTypes.SequenceEqual(
localAssignment.SubmissionTypes.Select(t => t.ToString()) localAssignment.SubmissionTypes.Select(t => t.ToString())
); );
var assignmentGroupSame =
canvasAssignmentGroupId != null
&& canvasAssignmentGroupId == canvasAssignment.AssignmentGroupId;
if (!quiet) if (!quiet)
{ {
@@ -210,6 +220,10 @@ public static partial class AssignmentSyncronizationExtensions
Console.WriteLine( Console.WriteLine(
$"Submission Types different for {localAssignment.Name}, local: {JsonSerializer.Serialize(localAssignment.SubmissionTypes.Select(t => t.ToString()))}, in canvas {JsonSerializer.Serialize(canvasAssignment.SubmissionTypes)}" $"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 return !nameSame
@@ -217,7 +231,8 @@ public static partial class AssignmentSyncronizationExtensions
|| !lockDatesSame || !lockDatesSame
|| !descriptionSame || !descriptionSame
|| !pointsSame || !pointsSame
|| !submissionTypesSame; || !submissionTypesSame
|| !assignmentGroupSame;
} }
internal static async Task<LocalCourse> SyncAssignmentsWithCanvas( internal static async Task<LocalCourse> SyncAssignmentsWithCanvas(

View File

@@ -43,14 +43,14 @@ public static partial class QuizSyncronizationExtensions
) )
{ {
var isCreated = localQuiz.QuizIsCreated(canvasQuizzes); var isCreated = localQuiz.QuizIsCreated(canvasQuizzes);
var canvasAssignmentGroupId = localQuiz.GetCanvasAssignmentGroupId(localCourse.AssignmentGroups);
if (isCreated) if (isCreated)
{ {
// TODO write update // TODO write update
} }
else else
{ {
return await canvas.Quizzes.Create(canvasCourseId, localQuiz); return await canvas.Quizzes.Create(canvasCourseId, localQuiz, canvasAssignmentGroupId);
} }
return localQuiz; return localQuiz;

View File

@@ -89,4 +89,9 @@ public record LocalAssignment
return Markdig.Markdown.ToHtml(Description) + "<hr>" + rubricHtml; return Markdig.Markdown.ToHtml(Description) + "<hr>" + rubricHtml;
} }
public ulong? GetCanvasAssignmentGroupId(IEnumerable<LocalAssignmentGroup> assignmentGroups) =>
assignmentGroups
.FirstOrDefault(g => g.Id == LocalAssignmentGroupId)?
.CanvasId;
} }

View File

@@ -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. // 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<LocalQuizQuestion> Questions { get; init; } = public IEnumerable<LocalQuizQuestion> Questions { get; init; } =
Enumerable.Empty<LocalQuizQuestion>(); Enumerable.Empty<LocalQuizQuestion>();
public ulong? GetCanvasAssignmentGroupId(IEnumerable<LocalAssignmentGroup> assignmentGroups) =>
assignmentGroups
.FirstOrDefault(g => g.Id == LocalAssignmentGroupId)?
.CanvasId;
} }

View File

@@ -32,7 +32,8 @@ public class CanvasAssignmentService
public async Task<LocalAssignment> Create( public async Task<LocalAssignment> Create(
ulong canvasCourseId, ulong canvasCourseId,
LocalAssignment localAssignment, LocalAssignment localAssignment,
string htmlDescription string htmlDescription,
ulong? canvasAssignmentGroupId
) )
{ {
Console.WriteLine($"creating assignment: {localAssignment.Name}"); Console.WriteLine($"creating assignment: {localAssignment.Name}");
@@ -45,7 +46,8 @@ public class CanvasAssignmentService
description = htmlDescription, description = htmlDescription,
due_at = localAssignment.DueAt, due_at = localAssignment.DueAt,
lock_at = localAssignment.LockAtDueDate ? localAssignment.DueAt : localAssignment.LockAt, 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 }; var bodyObj = new { assignment = body };
request.AddBody(bodyObj); request.AddBody(bodyObj);
@@ -60,7 +62,12 @@ public class CanvasAssignmentService
return updatedLocalAssignment; 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}"); Console.WriteLine($"updating assignment: {localAssignment.Name}");
var url = $"courses/{courseId}/assignments/{localAssignment.CanvasId}"; var url = $"courses/{courseId}/assignments/{localAssignment.CanvasId}";
@@ -72,7 +79,8 @@ public class CanvasAssignmentService
description = htmlDescription, description = htmlDescription,
due_at = localAssignment.DueAt, due_at = localAssignment.DueAt,
lock_at = localAssignment.LockAtDueDate ? localAssignment.DueAt : localAssignment.LockAt, 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 }; var bodyObj = new { assignment = body };
request.AddBody(bodyObj); request.AddBody(bodyObj);

View File

@@ -36,7 +36,11 @@ public class CanvasQuizService
); );
} }
public async Task<LocalQuiz> Create(ulong canvasCourseId, LocalQuiz localQuiz) public async Task<LocalQuiz> Create(
ulong canvasCourseId,
LocalQuiz localQuiz,
ulong? canvasAssignmentGroupId
)
{ {
Console.WriteLine($"Creating Quiz {localQuiz.Name}"); Console.WriteLine($"Creating Quiz {localQuiz.Name}");
@@ -56,6 +60,7 @@ public class CanvasQuizService
cant_go_back = false, cant_go_back = false,
due_at = localQuiz.DueAt, due_at = localQuiz.DueAt,
lock_at = localQuiz.LockAtDueDate ? localQuiz.DueAt : localQuiz.LockAt, lock_at = localQuiz.LockAtDueDate ? localQuiz.DueAt : localQuiz.LockAt,
assignment_group_id = canvasAssignmentGroupId,
} }
}; };
var request = new RestRequest(url); var request = new RestRequest(url);

View File

@@ -131,7 +131,11 @@ GET https://snow.instructure.com/api/v1/courses/872095/assignments/12676639?incl
Authorization: Bearer {{$dotenv CANVAS_TOKEN}} 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}} Authorization: Bearer {{$dotenv CANVAS_TOKEN}}
### ###
GET https://snow.instructure.com/api/v1/courses/871954 GET https://snow.instructure.com/api/v1/courses/871954