diff --git a/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor b/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor index 4864c95..8066f3a 100644 --- a/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor +++ b/Management.Web/Shared/Module/Assignment/AssignmentListItem.razor @@ -50,6 +50,16 @@ assignmentContext.Assignment = Assignment; Navigation.NavigateTo("/course/" + planner.LocalCourse?.Settings.Name + "/assignment/" + Assignment.Name); } + + private bool NeedsToBeUpdatedInCanvas => planner.LocalCourse != null + && planner.LocalCourse.Settings.CanvasId != null + && planner.CanvasAssignments != null + && planner.CanvasModules != null + && assignmentInCanvas != null + && Assignment.NeedsUpdates( + (CanvasAssignment)assignmentInCanvas, + Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.Settings.AssignmentGroups) + ); }
@if(isSyncedWithCanvas) { - @if(planner.LocalCourse != null - && planner.LocalCourse.Settings.CanvasId != null - && planner.CanvasAssignments != null - && planner.CanvasModules != null - && assignmentInCanvas != null - && Assignment.NeedsUpdates( - (CanvasAssignment)assignmentInCanvas, - Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.Settings.AssignmentGroups) - ) - ) + @if(NeedsToBeUpdatedInCanvas) { } @@ -97,6 +98,15 @@
+ @if(isSyncedWithCanvas && NeedsToBeUpdatedInCanvas) + { +
+ @Assignment.GetUpdateReason( + (CanvasAssignment)assignmentInCanvas, + Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.Settings.AssignmentGroups)) +
+ } + @if(!showAll) {
diff --git a/Management/Features/Configuration/AssignmentEditorContext.cs b/Management/Features/Configuration/AssignmentEditorContext.cs index ca8774f..494982f 100644 --- a/Management/Features/Configuration/AssignmentEditorContext.cs +++ b/Management/Features/Configuration/AssignmentEditorContext.cs @@ -93,11 +93,13 @@ public class AssignmentEditorContext logger.Log("cannot update assignment in canvas, could not find canvas assignment with id: " + canvasAssignmentId); return; } + // Console.WriteLine(JsonSerializer.Serialize(Assignment.LocalAssignmentGroupName)); + // Console.WriteLine(JsonSerializer.Serialize(planner.LocalCourse.Settings.AssignmentGroups)); + var canvasAssignmentGroupId = Assignment.GetCanvasAssignmentGroupId(planner.LocalCourse.Settings.AssignmentGroups); if (canvasAssignmentGroupId == null) { - logger.Log("cannot update assignment in canvas, could not get assignment group id: " + assignmentInCanvas.AssignmentGroupId); return; } diff --git a/Management/Features/Configuration/CoursePlanner.cs b/Management/Features/Configuration/CoursePlanner.cs index bb3120d..988c0c7 100644 --- a/Management/Features/Configuration/CoursePlanner.cs +++ b/Management/Features/Configuration/CoursePlanner.cs @@ -162,5 +162,17 @@ public class CoursePlanner CanvasAssignmentGroups = await canvas.AssignmentGroups.GetAll(canvasCourseId); await LocalCourse.EnsureAllAssignmentGroupsExistInCanvas(canvasCourseId, CanvasAssignmentGroups, canvas); + + CanvasAssignmentGroups = await canvas.AssignmentGroups.GetAll(canvasCourseId); + + LocalCourse = LocalCourse with {Settings = LocalCourse.Settings with { + AssignmentGroups = LocalCourse.Settings.AssignmentGroups.Select(g => { + var canvasGroup = CanvasAssignmentGroups.FirstOrDefault(c => c.Name == g.Name); + return canvasGroup == null + ? g + : g with {CanvasId = canvasGroup.Id}; + }) + } + }; } } diff --git a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs index b943189..f2be490 100644 --- a/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs +++ b/Management/Features/Configuration/Synchronization/AssignmentSyncronizationExtensions.cs @@ -1,3 +1,4 @@ +using System.Net.Quic; using System.Reflection; using System.Text.RegularExpressions; using CanvasModel.Assignments; @@ -5,13 +6,12 @@ using CanvasModel.Modules; using CanvasModel.Quizzes; using LocalModels; using Management.Services.Canvas; +using Markdig.Renderers.Normalize; namespace Management.Planner; public static partial class AssignmentSyncronizationExtensions { - - internal static async Task SyncAssignmentToCanvas( this LocalCourse localCourse, ulong canvasCourseId, @@ -20,7 +20,6 @@ public static partial class AssignmentSyncronizationExtensions CanvasService canvas ) { - var canvasAssignment = canvasAssignments.FirstOrDefault( ca => ca.Name == localAssignment.Name ); @@ -48,7 +47,6 @@ public static partial class AssignmentSyncronizationExtensions ulong? canvasAssignmentGroupId ) { - var assignmentNeedsUpdates = localAssignment.NeedsUpdates( canvasAssignment, canvasAssignmentGroupId, @@ -72,35 +70,24 @@ public static partial class AssignmentSyncronizationExtensions ulong? canvasAssignmentGroupId, bool quiet = true ) + { + var reason = localAssignment.GetUpdateReason(canvasAssignment, canvasAssignmentGroupId, quiet); + return reason != string.Empty; + } + public static string GetUpdateReason( + this LocalAssignment localAssignment, + CanvasAssignment canvasAssignment, + ulong? canvasAssignmentGroupId, + bool quiet = false + ) { - var localHtmlDescription = localAssignment - .GetDescriptionHtml() - .Replace("
", "
") // self closing tags are hard - .Replace("
", "
") - .Replace(">", "") - .Replace("<", "") - .Replace(">", "") - .Replace("<", "") - .Replace(""", "") - .Replace("\"", "") - .Replace("&", "") - .Replace("&", ""); + var localHtmlDescription = removeHtmlDetails(localAssignment.GetDescriptionHtml()); var canvasHtmlDescription = canvasAssignment.Description; canvasHtmlDescription = CanvasScriptTagRegex().Replace(canvasHtmlDescription, ""); canvasHtmlDescription = CanvasLinkTagRegex().Replace(canvasHtmlDescription, ""); - canvasHtmlDescription = canvasHtmlDescription - .Replace("
", "
") - .Replace("
", "
") - .Replace(">", "") - .Replace("<", "") - .Replace(">", "") - .Replace("<", "") - .Replace(""", "") - .Replace("\"", "") - .Replace("&", "") - .Replace("&", ""); + canvasHtmlDescription = removeHtmlDetails(canvasHtmlDescription); var canvasComparisonDueDate = canvasAssignment.DueAt != null @@ -162,36 +149,44 @@ public static partial class AssignmentSyncronizationExtensions canvasAssignmentGroupId != null && canvasAssignmentGroupId == canvasAssignment.AssignmentGroupId; - if (!quiet) + var reason = ""; + if (!dueDatesSame) { - if (!dueDatesSame) + reason = $"Due dates different for assignment {localAssignment.Name}, local: {localAssignment.DueAt}, in canvas {canvasAssignment.DueAt}"; + if (!quiet) { Console.WriteLine(JsonSerializer.Serialize(canvasAssignment)); Console.WriteLine(canvasComparisonDueDate); Console.WriteLine(localComparisonDueDate); - Console.WriteLine( - $"Due dates different for assignment {localAssignment.Name}, local: {localAssignment.DueAt}, in canvas {canvasAssignment.DueAt}" - ); + Console.WriteLine(reason); Console.WriteLine(JsonSerializer.Serialize(localAssignment.DueAt)); Console.WriteLine(JsonSerializer.Serialize(canvasAssignment.DueAt)); } + return reason; + } - if (!lockDatesSame) + if (!lockDatesSame) + { + reason = $"Lock dates different for assignment {localAssignment.Name}, local: {localAssignment.LockAt}, in canvas {canvasAssignment.LockAt}"; + if (!quiet) { Console.WriteLine(JsonSerializer.Serialize(canvasAssignment)); Console.WriteLine(canvasComparisonLockDate); Console.WriteLine(localComparisonLockDate); - Console.WriteLine( - $"Lock dates different for assignment {localAssignment.Name}, local: {localAssignment.LockAt}, in canvas {canvasAssignment.LockAt}" - ); + Console.WriteLine(reason); Console.WriteLine(JsonSerializer.Serialize(localAssignment.LockAt)); Console.WriteLine(JsonSerializer.Serialize(canvasAssignment.LockAt)); } + return reason; + } - if (!descriptionSame) + if (!descriptionSame) + { + reason = $"descriptions different for {localAssignment.Name}"; + if (!quiet) { Console.WriteLine(); - Console.WriteLine($"descriptions different for {localAssignment.Name}"); + Console.WriteLine(reason); Console.WriteLine(); Console.WriteLine("Local Description:"); @@ -204,34 +199,54 @@ public static partial class AssignmentSyncronizationExtensions Console.WriteLine(canvasAssignment.Description); Console.WriteLine(); } - - if (!nameSame) - Console.WriteLine( - $"names different for {localAssignment.Name}, local: {localAssignment.Name}, in canvas {canvasAssignment.Name}" - ); - if (!pointsSame) - Console.WriteLine( - $"Points different for {localAssignment.Name}, local: {localAssignment.PointsPossible}, in canvas {canvasAssignment.PointsPossible}" - ); - if (!submissionTypesSame) - 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 reason; } - return !nameSame - || !dueDatesSame - || !lockDatesSame - || !descriptionSame - || !pointsSame - || !submissionTypesSame - || !assignmentGroupSame; + if (!nameSame) + { + reason = $"names different for {localAssignment.Name}, local: {localAssignment.Name}, in canvas {canvasAssignment.Name}"; + if (!quiet) + Console.WriteLine(reason); + return reason; + } + if (!pointsSame) + { + reason = $"Points different for {localAssignment.Name}, local: {localAssignment.PointsPossible}, in canvas {canvasAssignment.PointsPossible}"; + if (!quiet) + Console.WriteLine(reason); + return reason; + } + if (!submissionTypesSame) + { + reason = $"Submission Types different for {localAssignment.Name}, local: {JsonSerializer.Serialize(localAssignment.SubmissionTypes.Select(t => t.ToString()))}, in canvas {JsonSerializer.Serialize(canvasAssignment.SubmissionTypes)}"; + if (!quiet) + Console.WriteLine(reason); + return reason; + } + if (!assignmentGroupSame) + { + reason = $"Canvas assignment group ids different for {localAssignment.Name}, local: {canvasAssignmentGroupId}, in canvas {canvasAssignment.AssignmentGroupId}"; + if (!quiet) + Console.WriteLine(reason); + return reason; + } + + return reason; } + private static string removeHtmlDetails(string canvasHtmlDescription) => canvasHtmlDescription + .Replace("
", "
") + .Replace("
", "
") + .Replace("
", "
") + .Replace("
", "
") + .Replace(">", "") + .Replace("<", "") + .Replace(">", "") + .Replace("<", "") + .Replace(""", "") + .Replace("\"", "") + .Replace("&", "") + .Replace("&", ""); [GeneratedRegex("")] private static partial Regex CanvasScriptTagRegex(); diff --git a/Management/Models/Local/Assignment/LocalAssignment.cs b/Management/Models/Local/Assignment/LocalAssignment.cs index a17f2ba..b19c4fa 100644 --- a/Management/Models/Local/Assignment/LocalAssignment.cs +++ b/Management/Models/Local/Assignment/LocalAssignment.cs @@ -30,7 +30,6 @@ public record LocalAssignment public string GetRubricHtml() { var output = "

Rubric

"; - var lineStrings = Rubric.Select( item => $"- {item.Points}pts: {item.Label}
" ); diff --git a/Management/Services/Canvas/CanvasAssignmentService.cs b/Management/Services/Canvas/CanvasAssignmentService.cs index dda6304..fbc4727 100644 --- a/Management/Services/Canvas/CanvasAssignmentService.cs +++ b/Management/Services/Canvas/CanvasAssignmentService.cs @@ -86,6 +86,7 @@ public class CanvasAssignmentService points_possible = localAssignment.PointsPossible, assignment_group_id = canvasAssignmentGroupId, }; + var bodyObj = new { assignment = body }; request.AddBody(bodyObj); diff --git a/README.md b/README.md index 40762c5..20586a1 100644 --- a/README.md +++ b/README.md @@ -42,3 +42,23 @@ AssignmentGroupName: Final Project SubmissionTypes: --- + + + +Local Description: +pMake a new C# console program./p +pAdd functionality to your program to ask the user three different questions and include their responses in a message back to the user. For example, ask the user their name then ask their age then ask their favorite food. Then tell the user Your name is {name}, your age is {age}, and you like to eat {favoriteFood}./p +pSubmit a copy of your code via canvas./p +hrh2Rubric/h2- 7pts: code submitted and correctly runs br/ + +Canvas Description: +pMake a new C# console program./p +pAdd functionality to your program to ask the user three different questions and include their responses in a message back to the user. For example, ask the user their name then ask their age then ask their favorite food. Then tell the user Your name is {name}, your age is {age}, and you like to eat {favoriteFood}./p +pSubmit a copy of your code via canvas./p +hrh2Rubric/h2- 7pts: code submitted and correctly runs br + +Canvas Raw Description: +

Make a new C# console program.

+

Add functionality to your program to ask the user three different questions and include their responses in a message back to the user. For example, ask the user their name then ask their age then ask their favorite food. Then tell the user "Your name is {name}, your age is {age}, and you like to eat {favoriteFood}".

+

Submit a copy of your code via canvas.

+

Rubric

- 7pts: code submitted and correctly runs
\ No newline at end of file