changed casing of local assets

This commit is contained in:
2023-08-05 17:04:02 -06:00
parent 097bd635a2
commit 1ab0676881
16 changed files with 218 additions and 162 deletions

View File

@@ -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
);

View File

@@ -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, "<script.*script>", "");
canvasHtmlDescription = Regex.Replace(canvasHtmlDescription, "<link\\s+rel=\"[^\"]*\"\\s+href=\"[^\"]*\"[^>]*>", "");
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("<script.*script>")]
private static partial Regex CanvasScriptTagRegex();
[GeneratedRegex("<link\\s+rel=\"[^\"]*\"\\s+href=\"[^\"]*\"[^>]*>")]
private static partial Regex CanvasLinkTagRegex();
}

View File

@@ -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;
}

View File

@@ -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<string> 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<string, string> 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<string, string> TemplateVariables { get; init; } =
new Dictionary<string, string>();
public bool lock_at_due_date { get; init; }
public IEnumerable<RubricItem> 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<string> submission_types { get; init; } = new string[] { };
public bool LockAtDueDate { get; init; }
public IEnumerable<RubricItem> Rubric { get; init; } = new RubricItem[] { };
public DateTime? LockAt { get; init; }
public DateTime DueAt { get; init; }
public int PointsPossible { get; init; }
public IEnumerable<string> SubmissionTypes { get; init; } = new string[] { };
public string GetRubricHtml()
{
var output = "<h1>Rubric</h1><pre><code class=\"language-json\">[\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<AssignmentTemplate>? 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<string, string> entry in template_variables)
foreach (KeyValuePair<string, string> entry in TemplateVariables)
{
html = html.Replace($"%7B%7B{entry.Key}%7D%7D", entry.Value);
}
return html + "<hr>" + rubricHtml;
}
return Markdig.Markdown.ToHtml(description) + "<hr>" + rubricHtml;
return Markdig.Markdown.ToHtml(Description) + "<hr>" + rubricHtml;
}
}

View File

@@ -6,5 +6,7 @@ public record LocalModule
public IEnumerable<LocalAssignment> Assignments { get; init; } =
Enumerable.Empty<LocalAssignment>();
public IEnumerable<LocalQuiz> Quizzes { get; init; } = Enumerable.Empty<LocalQuiz>();
public ulong? CanvasId { get; set; } = null;
}

View File

@@ -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
}

View File

@@ -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<int, object>();
var i = 0;
foreach (var rubricItem in localAssignment.rubric)
foreach (var rubricItem in localAssignment.Rubric)
{
var ratings = new Dictionary<int, object>
{
@@ -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");