diff --git a/Management.Web/Shared/Components/AssignmentForm/AssignmentDescriptionEditor.razor b/Management.Web/Shared/Components/AssignmentForm/AssignmentDescriptionEditor.razor index a36ca38..1ca9bce 100644 --- a/Management.Web/Shared/Components/AssignmentForm/AssignmentDescriptionEditor.razor +++ b/Management.Web/Shared/Components/AssignmentForm/AssignmentDescriptionEditor.razor @@ -6,25 +6,25 @@ { [Parameter] public string Description { get; set; } = default!; - [Parameter] - public bool UseTemplate { get; set; } - [Parameter] - public string? TemplateId { get; set; } - [Parameter] - public Dictionary VariableValues { get; set; } = new Dictionary(); - [Parameter] public EventCallback DescriptionChanged { get; set; } + [Parameter] + public bool UseTemplate { get; set; } [Parameter] public EventCallback UseTemplateChanged { get; set; } + [Parameter] + public string? TemplateId { get; set; } [Parameter] public EventCallback TemplateIdChanged { get; set; } + [Parameter] + public Dictionary VariableValues { get; set; } = new Dictionary(); [Parameter] public EventCallback> VariableValuesChanged { get; set; } + private AssignmentTemplate? selectedTemplate => planner .LocalCourse? diff --git a/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor b/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor index 0f4a4a2..e679956 100644 --- a/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor +++ b/Management.Web/Shared/Components/AssignmentForm/AssignmentForm.razor @@ -19,7 +19,7 @@ [Parameter] public Action OnHide { get; set; } = () => { }; - public Modal AssignmentModal { get; set; } = default!; + public Modal? AssignmentModal { get; set; } = null; private bool useTemplate { get; set; } = false; private string? templateId { get; set; } @@ -35,16 +35,16 @@ { if(Show) { - AssignmentModal.Show(); + AssignmentModal?.Show(); } - name = Assignment.name; - description = Assignment.description; - lockAtDueDate = Assignment.lock_at_due_date; - rubric = Assignment.rubric; - submissionTypes = Assignment.submission_types; - templateId = Assignment.template_id; - useTemplate = Assignment.use_template; - templateVariables = Assignment.template_variables; + name = Assignment.Name; + description = Assignment.Description; + lockAtDueDate = Assignment.LockAtDueDate; + rubric = Assignment.Rubric; + submissionTypes = Assignment.SubmissionTypes; + templateId = Assignment.TemplateId; + useTemplate = Assignment.UseTemplate; + templateVariables = Assignment.TemplateVariables; } private void submitHandler() @@ -56,15 +56,15 @@ var newAssignment = Assignment with { - name=name, - description=description, - lock_at_due_date=lockAtDueDate, - rubric=rubric, - points_possible=totalRubricPoints, - submission_types=submissionTypes, - use_template=useTemplate, - template_id=templateId, - template_variables=templateVariables, + Name=name, + Description=description, + LockAtDueDate=lockAtDueDate, + Rubric=rubric, + PointsPossible=totalRubricPoints, + SubmissionTypes=submissionTypes, + UseTemplate=useTemplate, + TemplateId=templateId, + TemplateVariables=templateVariables, }; if(planner.LocalCourse != null) @@ -77,7 +77,7 @@ : Module with { Assignments=Module.Assignments.Select(a => - a.id == newAssignment.id + a.Id == newAssignment.Id ? newAssignment : a ) @@ -85,7 +85,7 @@ ) }; } - AssignmentModal.Hide(); + AssignmentModal?.Hide(); } private void updateRubric(IEnumerable newRubric) { @@ -101,7 +101,7 @@ - @Assignment.name + @Assignment.Name
diff --git a/Management.Web/Shared/Components/AssignmentForm/SubmissionTypeSelector.razor b/Management.Web/Shared/Components/AssignmentForm/SubmissionTypeSelector.razor index 0d5272d..d12102b 100644 --- a/Management.Web/Shared/Components/AssignmentForm/SubmissionTypeSelector.razor +++ b/Management.Web/Shared/Components/AssignmentForm/SubmissionTypeSelector.razor @@ -23,7 +23,7 @@ private bool discussionIsSelected { get => Types.FirstOrDefault( - t => t == SubmissionType.discussion_topic + t => t == SubmissionType.DISCUSSION_TOPIC ) != null; } private int renderKey {get; set; } = 1; @@ -34,7 +34,7 @@ @foreach (var submissionType in SubmissionType.AllTypes) { - var isDiscussion = submissionType == SubmissionType.discussion_topic; + var isDiscussion = submissionType == SubmissionType.DISCUSSION_TOPIC; var allowedToBeChecked = !discussionIsSelected || isDiscussion;
diff --git a/Management.Web/Shared/Components/Modal.razor b/Management.Web/Shared/Components/Modal.razor index a0493cc..a531a6d 100644 --- a/Management.Web/Shared/Components/Modal.razor +++ b/Management.Web/Shared/Components/Modal.razor @@ -1,5 +1,3 @@ -@using Management.Web.Shared.Components - @code { [Parameter, EditorRequired] public RenderFragment? Title { get; set; } diff --git a/Management.Web/Shared/Components/QuizForm/QuizForm.razor b/Management.Web/Shared/Components/QuizForm/QuizForm.razor new file mode 100644 index 0000000..5e45884 --- /dev/null +++ b/Management.Web/Shared/Components/QuizForm/QuizForm.razor @@ -0,0 +1,42 @@ +@using Management.Web.Shared.Components + +@code { + public LocalModule Module { get; set; } = default!; + + [Parameter] + [EditorRequired] + public LocalQuiz Quiz + { + get; + set; + } = default!; + + [Parameter] + [EditorRequired] + public bool Show { get; set; } + + [Parameter] + public Action OnHide { get; set; } = () => { }; + private Modal? Modal { get; set; } + + private void submitHandler () + { + + } +} + + + + @Quiz.Name + + + + + + +
+ +
+
diff --git a/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor b/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor index bda29a1..759df21 100644 --- a/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor +++ b/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor @@ -35,8 +35,8 @@ .Modules .First(m => m.Assignments - .Select(a => a.id) - .Contains(Assignment.id) + .Select(a => a.Id) + .Contains(Assignment.Id) ) ?? throw new Exception("in day callback, could not find module"); @@ -52,11 +52,11 @@ var moduleWithUpdatedAssignment = currentModule with { Assignments = currentModule.Assignments.Select(a => - a.id != Assignment.id + a.Id != Assignment.Id ? a : a with { - due_at=defaultDueTimeDate + DueAt=defaultDueTimeDate } ) }; @@ -79,11 +79,11 @@ m.Name != module.Name ? m with { - Assignments = m.Assignments.Where(a => a.id != Assignment.id).DistinctBy(a => a.id) + Assignments = m.Assignments.Where(a => a.Id != Assignment.Id).DistinctBy(a => a.Id) } : m with { - Assignments = m.Assignments.Append(Assignment).DistinctBy(a => a.id) + Assignments = m.Assignments.Append(Assignment).DistinctBy(a => a.Id) } ); @@ -98,7 +98,7 @@ { if (module == null) { - dropOnDate(dropDate ?? Assignment.due_at); + dropOnDate(dropDate ?? Assignment.DueAt); } else { @@ -119,7 +119,7 @@ planner .CanvasAssignments? .FirstOrDefault( - a => a.Id == Assignment.canvasId + a => a.Id == Assignment.CanvasId ) != null; } @@ -138,7 +138,7 @@

- @Assignment.name + @Assignment.Name

@@ -172,8 +172,8 @@ @if(!showAll) {
-
Points: @Assignment.points_possible
-
Due At: @Assignment.due_at
+
Points: @Assignment.PointsPossible
+
Due At: @Assignment.DueAt
} else @@ -185,12 +185,12 @@
-
Points: @Assignment.points_possible
-
Due At: @Assignment.due_at
-
Lock At: @Assignment.lock_at
+
Points: @Assignment.PointsPossible
+
Due At: @Assignment.DueAt
+
Lock At: @Assignment.LockAt
Submission Types:
    - @foreach(var type in Assignment.submission_types) + @foreach(var type in Assignment.SubmissionTypes) {
  • @type diff --git a/Management.Web/Shared/Module/NewAssignment.razor b/Management.Web/Shared/Module/NewAssignment.razor index 0c52457..6d821aa 100644 --- a/Management.Web/Shared/Module/NewAssignment.razor +++ b/Management.Web/Shared/Module/NewAssignment.razor @@ -13,22 +13,22 @@ [StringLength(50, ErrorMessage = "Name too long (50 character limit).")] private string Name { get; set; } = ""; - private Modal? modal { get; set; } + private Modal? modal { get; set; } = null; private void submitHandler() { System.Console.WriteLine("new assignment"); var newAssignment = new LocalAssignment { - id = Guid.NewGuid().ToString(), - name = Name, - description = "", - lock_at_due_date = true, - rubric = new RubricItem[] { }, - lock_at = null, - due_at = DateTime.Now, - points_possible = 10, - submission_types = new string[] { SubmissionType.online_text_entry } + Id = Guid.NewGuid().ToString(), + Name = Name, + Description = "", + LockAtDueDate = true, + Rubric = new RubricItem[] { }, + LockAt = null, + DueAt = DateTime.Now, + PointsPossible = 10, + SubmissionTypes = new string[] { SubmissionType.ONLINE_TEXT_ENTRY } }; if(planner.LocalCourse != null) diff --git a/Management.Web/Shared/Semester/AssignmentInDay.razor b/Management.Web/Shared/Semester/AssignmentInDay.razor index 34b9150..9a1d510 100644 --- a/Management.Web/Shared/Semester/AssignmentInDay.razor +++ b/Management.Web/Shared/Semester/AssignmentInDay.razor @@ -30,8 +30,8 @@ .Modules .First(m => m.Assignments - .Select(a => a.id) - .Contains(Assignment.id) + .Select(a => a.Id) + .Contains(Assignment.Id) ) ?? throw new Exception("in day callback, could not find module"); var defaultDueTimeDate = new DateTime( @@ -46,11 +46,11 @@ var moduleWithUpdatedAssignment = currentModule with { Assignments = currentModule.Assignments.Select(a => - a.id != Assignment.id + a.Id != Assignment.Id ? a : a with { - due_at=defaultDueTimeDate + DueAt=defaultDueTimeDate } ) }; @@ -73,7 +73,7 @@ m.Name != module.Name ? m with { - Assignments = m.Assignments.Where(a => a.id != Assignment.id) + Assignments = m.Assignments.Where(a => a.Id != Assignment.Id) } : m with { @@ -92,7 +92,7 @@ { if (module == null) { - dropOnDate(dropDate ?? Assignment.due_at); + dropOnDate(dropDate ?? Assignment.DueAt); } else { @@ -117,7 +117,7 @@ @onclick="@(() => showUpdateForm = true)" role="button" > - @Assignment.name + @Assignment.Name
m.Assignments) - .Where(a => a.due_at.Date == date?.Date); + .Where(a => a.DueAt.Date == date?.Date); } } private string calculatedClass diff --git a/Management/Features/Configuration/CoursePlanner.cs b/Management/Features/Configuration/CoursePlanner.cs index d1b6dfb..8abd54c 100644 --- a/Management/Features/Configuration/CoursePlanner.cs +++ b/Management/Features/Configuration/CoursePlanner.cs @@ -149,7 +149,7 @@ public class CoursePlanner ) { var localItemsWithCorrectOrder = localModule.Assignments - .OrderBy(a => a.due_at) + .OrderBy(a => a.DueAt) .Select((a, i) => (Assignment: a, Position: i + 1)); var canvasContentIdsByCurrentPosition = @@ -160,9 +160,9 @@ public class CoursePlanner { var itemIsInCorrectOrder = canvasContentIdsByCurrentPosition.ContainsKey(position) - && canvasContentIdsByCurrentPosition[position] == localAssignment.canvasId; + && canvasContentIdsByCurrentPosition[position] == localAssignment.CanvasId; - var currentCanvasItem = canvasModuleItems.First(i => i.ContentId == localAssignment.canvasId); + var currentCanvasItem = canvasModuleItems.First(i => i.ContentId == localAssignment.CanvasId); if (!itemIsInCorrectOrder) { await canvas.UpdateModuleItem( @@ -187,15 +187,15 @@ public class CoursePlanner foreach (var localAssignment in localModule.Assignments) { var canvasModuleItemContentIds = CanvasModulesItems[moduleCanvasId].Select(i => i.ContentId); - if (!canvasModuleItemContentIds.Contains(localAssignment.canvasId)) + if (!canvasModuleItemContentIds.Contains(localAssignment.CanvasId)) { var canvasAssignmentId = - localAssignment.canvasId + localAssignment.CanvasId ?? throw new Exception("cannot create module item if assignment does not have canvas id"); await canvas.CreateModuleItem( canvasId, moduleCanvasId, - localAssignment.name, + localAssignment.Name, "Assignment", canvasAssignmentId ); diff --git a/Management/Features/Configuration/CoursePlannerSyncronizationExtensions.cs b/Management/Features/Configuration/CoursePlannerSyncronizationExtensions.cs index 7827b37..9d7b438 100644 --- a/Management/Features/Configuration/CoursePlannerSyncronizationExtensions.cs +++ b/Management/Features/Configuration/CoursePlannerSyncronizationExtensions.cs @@ -6,7 +6,7 @@ using Management.Services.Canvas; namespace Management.Planner; -public static class CoursePlannerSyncronizationExtensions +public static partial class CoursePlannerSyncronizationExtensions { internal static async Task EnsureAllModulesExistInCanvas( this LocalCourse localCourse, @@ -73,7 +73,7 @@ public static class CoursePlannerSyncronizationExtensions ) { var canvasAssignment = canvasAssignments.FirstOrDefault( - ca => ca.Id == localAssignment.canvasId + ca => ca.Id == localAssignment.CanvasId ); string localHtmlDescription = localAssignment.GetDescriptionHtml( localCourse.AssignmentTemplates @@ -105,34 +105,34 @@ public static class CoursePlannerSyncronizationExtensions bool quiet = true ) { - var canvasAssignment = canvasAssignments.First(ca => ca.Id == localAssignment.canvasId); + var canvasAssignment = canvasAssignments.First(ca => ca.Id == localAssignment.CanvasId); var localHtmlDescription = localAssignment.GetDescriptionHtml(courseAssignmentTemplates); var canvasHtmlDescription = canvasAssignment.Description; - canvasHtmlDescription = Regex.Replace(canvasHtmlDescription, "", ""); - canvasHtmlDescription = Regex.Replace(canvasHtmlDescription, "]*>", ""); + canvasHtmlDescription = CanvasScriptTagRegex().Replace(canvasHtmlDescription, ""); + canvasHtmlDescription = CanvasLinkTagRegex().Replace(canvasHtmlDescription, ""); - var dueDatesSame = canvasAssignment.DueAt == localAssignment.due_at; + var dueDatesSame = canvasAssignment.DueAt == localAssignment.DueAt; var descriptionSame = canvasHtmlDescription == localHtmlDescription; - var nameSame = canvasAssignment.Name == localAssignment.name; - var lockDateSame = canvasAssignment.LockAt == localAssignment.lock_at; - var pointsSame = canvasAssignment.PointsPossible == localAssignment.points_possible; + var nameSame = canvasAssignment.Name == localAssignment.Name; + var lockDateSame = canvasAssignment.LockAt == localAssignment.LockAt; + var pointsSame = canvasAssignment.PointsPossible == localAssignment.PointsPossible; var submissionTypesSame = canvasAssignment.SubmissionTypes.SequenceEqual( - localAssignment.submission_types.Select(t => t.ToString()) + localAssignment.SubmissionTypes.Select(t => t.ToString()) ); if (!quiet) { if (!dueDatesSame) Console.WriteLine( - $"Due dates different for {localAssignment.name}, local: {localAssignment.due_at}, in canvas {canvasAssignment.DueAt}" + $"Due dates different for {localAssignment.Name}, local: {localAssignment.DueAt}, in canvas {canvasAssignment.DueAt}" ); if (!descriptionSame) { Console.WriteLine(); - Console.WriteLine($"descriptions different for {localAssignment.name}"); + Console.WriteLine($"descriptions different for {localAssignment.Name}"); Console.WriteLine(); Console.WriteLine("Local Description:"); @@ -144,25 +144,23 @@ public static class CoursePlannerSyncronizationExtensions Console.WriteLine("Canvas Raw Description: "); Console.WriteLine(canvasAssignment.Description); Console.WriteLine(); - - } if (!nameSame) Console.WriteLine( - $"names different for {localAssignment.name}, local: {localAssignment.name}, in canvas {canvasAssignment.Name}" + $"names different for {localAssignment.Name}, local: {localAssignment.Name}, in canvas {canvasAssignment.Name}" ); if (!lockDateSame) Console.WriteLine( - $"Lock Dates different for {localAssignment.name}, local: {localAssignment.lock_at}, in canvas {canvasAssignment.LockAt}" + $"Lock Dates different for {localAssignment.Name}, local: {localAssignment.LockAt}, in canvas {canvasAssignment.LockAt}" ); if (!pointsSame) Console.WriteLine( - $"Points different for {localAssignment.name}, local: {localAssignment.points_possible}, in canvas {canvasAssignment.PointsPossible}" + $"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.submission_types.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)}" ); } @@ -193,4 +191,10 @@ public static class CoursePlannerSyncronizationExtensions var modules = await Task.WhenAll(moduleTasks); return localCourse with { Modules = modules }; } + + [GeneratedRegex("")] + private static partial Regex CanvasScriptTagRegex(); + + [GeneratedRegex("]*>")] + private static partial Regex CanvasLinkTagRegex(); } diff --git a/Management/Features/Configuration/CoursePlannerValidationExtensions.cs b/Management/Features/Configuration/CoursePlannerValidationExtensions.cs index d2c4ac8..9e902b5 100644 --- a/Management/Features/Configuration/CoursePlannerValidationExtensions.cs +++ b/Management/Features/Configuration/CoursePlannerValidationExtensions.cs @@ -13,8 +13,8 @@ public static class CoursePlannerExtensions module with { Assignments = module.Assignments - .OrderBy(a => a.due_at) - .DistinctBy(a => a.id) + .OrderBy(a => a.DueAt) + .DistinctBy(a => a.Id) .Select(a => a.validateSubmissionTypes()) } ); @@ -86,13 +86,13 @@ public static class CoursePlannerExtensions ) { var assignmentIdInCanvas = - canvasAssignments.FirstOrDefault(ca => ca.Id == assignment.canvasId) != null; + canvasAssignments.FirstOrDefault(ca => ca.Id == assignment.CanvasId) != null; if (!assignmentIdInCanvas) { Console.WriteLine( - $"no id in canvas for assignment, removing old canvas id: {assignment.name}" + $"no id in canvas for assignment, removing old canvas id: {assignment.Name}" ); - return assignment with { canvasId = null }; + return assignment with { CanvasId = null }; } return assignment; } @@ -100,12 +100,12 @@ public static class CoursePlannerExtensions public static LocalAssignment validateSubmissionTypes(this LocalAssignment assignment) { var containsDiscussion = - assignment.submission_types.FirstOrDefault(t => t == SubmissionType.discussion_topic) != null; + assignment.SubmissionTypes.FirstOrDefault(t => t == SubmissionType.DISCUSSION_TOPIC) != null; if (containsDiscussion) return assignment with { - submission_types = new string[] { SubmissionType.discussion_topic } + SubmissionTypes = new string[] { SubmissionType.DISCUSSION_TOPIC } }; return assignment; } diff --git a/Management/Models/Local/LocalAssignment.cs b/Management/Models/Local/LocalAssignment.cs index 94817d0..df59858 100644 --- a/Management/Models/Local/LocalAssignment.cs +++ b/Management/Models/Local/LocalAssignment.cs @@ -10,53 +10,53 @@ public record RubricItem public static class SubmissionType { - public static readonly string online_text_entry = "online_text_entry"; - public static readonly string online_upload = "online_upload"; - public static readonly string online_quiz = "online_quiz"; - public static readonly string on_paper = "on_paper"; - public static readonly string discussion_topic = "discussion_topic"; - public static readonly string external_tool = "external_tool"; - public static readonly string online_url = "online_url"; - public static readonly string media_recording = "media_recording"; - public static readonly string student_annotation = "student_annotation"; - public static readonly string none = "none"; + public static readonly string ONLINE_TEXT_ENTRY = "online_text_entry"; + public static readonly string ONLINE_UPLOAD = "online_upload"; + public static readonly string ONLINE_QUIZ = "online_quiz"; + public static readonly string ON_PAPER = "on_paper"; + public static readonly string DISCUSSION_TOPIC = "discussion_topic"; + public static readonly string EXTERNAL_TOOL = "external_tool"; + public static readonly string ONLINE_URL = "online_url"; + public static readonly string MEDIA_RECORDING = "media_recording"; + public static readonly string STUDENT_ANNOTATION = "student_annotation"; + public static readonly string NONE = "none"; public static readonly IEnumerable AllTypes = new string[] { - SubmissionType.online_text_entry, - SubmissionType.online_upload, - SubmissionType.online_quiz, - SubmissionType.on_paper, - SubmissionType.discussion_topic, - SubmissionType.external_tool, - SubmissionType.online_url, - SubmissionType.media_recording, - SubmissionType.student_annotation, - SubmissionType.none, + SubmissionType.ONLINE_TEXT_ENTRY, + SubmissionType.ONLINE_UPLOAD, + SubmissionType.ONLINE_QUIZ, + SubmissionType.ON_PAPER, + SubmissionType.DISCUSSION_TOPIC, + SubmissionType.EXTERNAL_TOOL, + SubmissionType.ONLINE_URL, + SubmissionType.MEDIA_RECORDING, + SubmissionType.STUDENT_ANNOTATION, + SubmissionType.NONE, }; } public record LocalAssignment { - public string id { get; init; } = ""; - public ulong? canvasId { get; init; } = null; - public string name { get; init; } = ""; - public string description { get; init; } = ""; - public bool use_template { get; init; } = false; - public string? template_id { get; init; } = string.Empty; - public Dictionary template_variables { get; init; } = + public string Id { get; init; } = ""; + public ulong? CanvasId { get; init; } = null; + public string Name { get; init; } = ""; + public string Description { get; init; } = ""; + public bool UseTemplate { get; init; } = false; + public string? TemplateId { get; init; } = string.Empty; + public Dictionary TemplateVariables { get; init; } = new Dictionary(); - public bool lock_at_due_date { get; init; } - public IEnumerable rubric { get; init; } = new RubricItem[] { }; - public DateTime? lock_at { get; init; } - public DateTime due_at { get; init; } - public int points_possible { get; init; } - public IEnumerable submission_types { get; init; } = new string[] { }; + public bool LockAtDueDate { get; init; } + public IEnumerable Rubric { get; init; } = new RubricItem[] { }; + public DateTime? LockAt { get; init; } + public DateTime DueAt { get; init; } + public int PointsPossible { get; init; } + public IEnumerable SubmissionTypes { get; init; } = new string[] { }; public string GetRubricHtml() { var output = "

Rubric

[\n";
 
-    var lineStrings = rubric.Select(
+    var lineStrings = Rubric.Select(
       item => $"  {{\"label\": \"{item.Label}\", \"points\": {item.Points}}}"
     );
     output += string.Join(",\n", lineStrings);
@@ -66,26 +66,26 @@ public record LocalAssignment
 
   public string GetDescriptionHtml(IEnumerable? templates)
   {
-    if (use_template && templates == null)
+    if (UseTemplate && templates == null)
       throw new Exception("cannot get description for assignment if templates not provided");
 
     var rubricHtml = GetRubricHtml();
 
-    if (use_template)
+    if (UseTemplate)
     {
-      var template = templates?.FirstOrDefault(t => t.Id == template_id);
+      var template = templates?.FirstOrDefault(t => t.Id == TemplateId);
       if (template == null)
-        throw new Exception($"Could not find template with id {template_id}");
+        throw new Exception($"Could not find template with id {TemplateId}");
 
       var html = Markdig.Markdown.ToHtml(template.Markdown);
 
-      foreach (KeyValuePair entry in template_variables)
+      foreach (KeyValuePair entry in TemplateVariables)
       {
         html = html.Replace($"%7B%7B{entry.Key}%7D%7D", entry.Value);
       }
       return html + "
" + rubricHtml; } - return Markdig.Markdown.ToHtml(description) + "
" + rubricHtml; + return Markdig.Markdown.ToHtml(Description) + "
" + rubricHtml; } } diff --git a/Management/Models/Local/LocalModules.cs b/Management/Models/Local/LocalModules.cs index 1aceaef..8dbb454 100644 --- a/Management/Models/Local/LocalModules.cs +++ b/Management/Models/Local/LocalModules.cs @@ -6,5 +6,7 @@ public record LocalModule public IEnumerable Assignments { get; init; } = Enumerable.Empty(); + public IEnumerable Quizzes { get; init; } = Enumerable.Empty(); + public ulong? CanvasId { get; set; } = null; } diff --git a/Management/Models/Local/LocalQuiz.cs b/Management/Models/Local/LocalQuiz.cs new file mode 100644 index 0000000..1fbbeb9 --- /dev/null +++ b/Management/Models/Local/LocalQuiz.cs @@ -0,0 +1,13 @@ +public record LocalQuiz +{ + public string Id { get; init; } = ""; public ulong? CanvasId { get; init; } = null; + public string Name { get; init; } = ""; + public string Description { get; init; } = ""; + public bool LockAtDueDate { get; init; } + public DateTime? LockAt { get; init; } + public DateTime DueAt { get; init; } + public bool ShuffleAnswers { get; init; } + public bool OneQuestionAtATime { get; init; } + public int AllowedAttempts { get; init; } + //quiz type +} \ No newline at end of file diff --git a/Management/Services/Canvas/CanvasAssignmentService.cs b/Management/Services/Canvas/CanvasAssignmentService.cs index 8e6ee5b..d8db44f 100644 --- a/Management/Services/Canvas/CanvasAssignmentService.cs +++ b/Management/Services/Canvas/CanvasAssignmentService.cs @@ -33,17 +33,17 @@ public class CanvasAssignmentService string htmlDescription ) { - System.Console.WriteLine($"creating assignment: {localAssignment.name}"); + System.Console.WriteLine($"creating assignment: {localAssignment.Name}"); var url = $"courses/{courseId}/assignments"; var request = new RestRequest(url); var body = new CanvasAssignmentCreationRequest() { - name = localAssignment.name, - submission_types = localAssignment.submission_types.Select(t => t.ToString()), + name = localAssignment.Name, + submission_types = localAssignment.SubmissionTypes.Select(t => t.ToString()), description = htmlDescription, - due_at = localAssignment.due_at, - lock_at = localAssignment.lock_at, - points_possible = localAssignment.points_possible + due_at = localAssignment.DueAt, + lock_at = localAssignment.LockAt, + points_possible = localAssignment.PointsPossible }; request.AddHeader("Content-Type", "application/json"); var bodyObj = new { assignment = body }; @@ -52,10 +52,7 @@ public class CanvasAssignmentService if (canvasAssignment == null) throw new Exception("created canvas assignment was null"); - var updatedLocalAssignment = localAssignment with - { - canvasId = canvasAssignment.Id - }; + var updatedLocalAssignment = localAssignment with { CanvasId = canvasAssignment.Id }; await CreateRubric(courseId, updatedLocalAssignment); @@ -64,17 +61,17 @@ public class CanvasAssignmentService public async Task Update(ulong courseId, LocalAssignment localAssignment, string htmlDescription) { - System.Console.WriteLine($"updating assignment: {localAssignment.name}"); - var url = $"courses/{courseId}/assignments/{localAssignment.canvasId}"; + System.Console.WriteLine($"updating assignment: {localAssignment.Name}"); + var url = $"courses/{courseId}/assignments/{localAssignment.CanvasId}"; var request = new RestRequest(url); var body = new CanvasAssignmentCreationRequest() { - name = localAssignment.name, - submission_types = localAssignment.submission_types.Select(t => t.ToString()), + name = localAssignment.Name, + submission_types = localAssignment.SubmissionTypes.Select(t => t.ToString()), description = htmlDescription, - due_at = localAssignment.due_at, - lock_at = localAssignment.lock_at, - points_possible = localAssignment.points_possible + due_at = localAssignment.DueAt, + lock_at = localAssignment.LockAt, + points_possible = localAssignment.PointsPossible }; request.AddHeader("Content-Type", "application/json"); var bodyObj = new { assignment = body }; @@ -86,13 +83,13 @@ public class CanvasAssignmentService public async Task CreateRubric(ulong courseId, LocalAssignment localAssignment) { - if (localAssignment.canvasId == null) + if (localAssignment.CanvasId == null) throw new Exception("cannot create rubric if no canvas id in assignment"); var criterion = new Dictionary(); var i = 0; - foreach (var rubricItem in localAssignment.rubric) + foreach (var rubricItem in localAssignment.Rubric) { var ratings = new Dictionary { @@ -111,18 +108,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 = localAssignment.CanvasId, rubric = new { - title = $"Rubric for Assignment: {localAssignment.name}", - association_id = localAssignment.canvasId, + title = $"Rubric for Assignment: {localAssignment.Name}", + association_id = localAssignment.CanvasId, association_type = "Assignment", use_for_grading = true, criteria = criterion, }, rubric_association = new { - association_id = localAssignment.canvasId, + association_id = localAssignment.CanvasId, association_type = "Assignment", purpose = "grading", use_for_grading = true, @@ -141,9 +138,9 @@ public class CanvasAssignmentService var assignmentPointCorrectionBody = new { - assignment = new { points_possible = localAssignment.points_possible } + assignment = new { points_possible = localAssignment.PointsPossible } }; - var adjustmentUrl = $"courses/{courseId}/assignments/{localAssignment.canvasId}"; + var adjustmentUrl = $"courses/{courseId}/assignments/{localAssignment.CanvasId}"; var pointAdjustmentRequest = new RestRequest(adjustmentUrl); pointAdjustmentRequest.AddBody(assignmentPointCorrectionBody); pointAdjustmentRequest.AddHeader("Content-Type", "application/json");