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

@@ -6,25 +6,25 @@
{ {
[Parameter] [Parameter]
public string Description { get; set; } = default!; public string Description { get; set; } = default!;
[Parameter]
public bool UseTemplate { get; set; }
[Parameter]
public string? TemplateId { get; set; }
[Parameter]
public Dictionary<string, string> VariableValues { get; set; } = new Dictionary<string, string>();
[Parameter] [Parameter]
public EventCallback<string> DescriptionChanged { get; set; } public EventCallback<string> DescriptionChanged { get; set; }
[Parameter]
public bool UseTemplate { get; set; }
[Parameter] [Parameter]
public EventCallback<bool> UseTemplateChanged { get; set; } public EventCallback<bool> UseTemplateChanged { get; set; }
[Parameter]
public string? TemplateId { get; set; }
[Parameter] [Parameter]
public EventCallback<string?> TemplateIdChanged { get; set; } public EventCallback<string?> TemplateIdChanged { get; set; }
[Parameter]
public Dictionary<string, string> VariableValues { get; set; } = new Dictionary<string, string>();
[Parameter] [Parameter]
public EventCallback<Dictionary<string, string>> VariableValuesChanged { get; set; } public EventCallback<Dictionary<string, string>> VariableValuesChanged { get; set; }
private AssignmentTemplate? selectedTemplate => private AssignmentTemplate? selectedTemplate =>
planner planner
.LocalCourse? .LocalCourse?

View File

@@ -19,7 +19,7 @@
[Parameter] [Parameter]
public Action OnHide { get; set; } = () => { }; public Action OnHide { get; set; } = () => { };
public Modal AssignmentModal { get; set; } = default!; public Modal? AssignmentModal { get; set; } = null;
private bool useTemplate { get; set; } = false; private bool useTemplate { get; set; } = false;
private string? templateId { get; set; } private string? templateId { get; set; }
@@ -35,16 +35,16 @@
{ {
if(Show) if(Show)
{ {
AssignmentModal.Show(); AssignmentModal?.Show();
} }
name = Assignment.name; name = Assignment.Name;
description = Assignment.description; description = Assignment.Description;
lockAtDueDate = Assignment.lock_at_due_date; lockAtDueDate = Assignment.LockAtDueDate;
rubric = Assignment.rubric; rubric = Assignment.Rubric;
submissionTypes = Assignment.submission_types; submissionTypes = Assignment.SubmissionTypes;
templateId = Assignment.template_id; templateId = Assignment.TemplateId;
useTemplate = Assignment.use_template; useTemplate = Assignment.UseTemplate;
templateVariables = Assignment.template_variables; templateVariables = Assignment.TemplateVariables;
} }
private void submitHandler() private void submitHandler()
@@ -56,15 +56,15 @@
var newAssignment = Assignment with var newAssignment = Assignment with
{ {
name=name, Name=name,
description=description, Description=description,
lock_at_due_date=lockAtDueDate, LockAtDueDate=lockAtDueDate,
rubric=rubric, Rubric=rubric,
points_possible=totalRubricPoints, PointsPossible=totalRubricPoints,
submission_types=submissionTypes, SubmissionTypes=submissionTypes,
use_template=useTemplate, UseTemplate=useTemplate,
template_id=templateId, TemplateId=templateId,
template_variables=templateVariables, TemplateVariables=templateVariables,
}; };
if(planner.LocalCourse != null) if(planner.LocalCourse != null)
@@ -77,7 +77,7 @@
: Module with : Module with
{ {
Assignments=Module.Assignments.Select(a => Assignments=Module.Assignments.Select(a =>
a.id == newAssignment.id a.Id == newAssignment.Id
? newAssignment ? newAssignment
: a : a
) )
@@ -85,7 +85,7 @@
) )
}; };
} }
AssignmentModal.Hide(); AssignmentModal?.Hide();
} }
private void updateRubric(IEnumerable<RubricItem> newRubric) private void updateRubric(IEnumerable<RubricItem> newRubric)
{ {
@@ -101,7 +101,7 @@
<Modal @ref="AssignmentModal" OnHide="@(() => OnHide())"> <Modal @ref="AssignmentModal" OnHide="@(() => OnHide())">
<Title> <Title>
@Assignment.name @Assignment.Name
</Title> </Title>
<Body> <Body>
<form @onsubmit:preventDefault="true" @onsubmit="submitHandler"> <form @onsubmit:preventDefault="true" @onsubmit="submitHandler">

View File

@@ -23,7 +23,7 @@
private bool discussionIsSelected private bool discussionIsSelected
{ {
get => Types.FirstOrDefault( get => Types.FirstOrDefault(
t => t == SubmissionType.discussion_topic t => t == SubmissionType.DISCUSSION_TOPIC
) != null; ) != null;
} }
private int renderKey {get; set; } = 1; private int renderKey {get; set; } = 1;
@@ -34,7 +34,7 @@
@foreach (var submissionType in SubmissionType.AllTypes) @foreach (var submissionType in SubmissionType.AllTypes)
{ {
var isDiscussion = submissionType == SubmissionType.discussion_topic; var isDiscussion = submissionType == SubmissionType.DISCUSSION_TOPIC;
var allowedToBeChecked = !discussionIsSelected || isDiscussion; var allowedToBeChecked = !discussionIsSelected || isDiscussion;
<div class="col-4"> <div class="col-4">
<div class="form-check form-switch"> <div class="form-check form-switch">

View File

@@ -1,5 +1,3 @@
@using Management.Web.Shared.Components
@code { @code {
[Parameter, EditorRequired] [Parameter, EditorRequired]
public RenderFragment? Title { get; set; } public RenderFragment? Title { get; set; }

View File

@@ -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 ()
{
}
}
<Modal @ref="Modal" OnHide="@(() => OnHide())">
<Title>
@Quiz.Name
</Title>
<Body>
<form @onsubmit:preventDefault="true" @onsubmit="submitHandler">
</form>
</Body>
<Footer>
<button class="btn btn-primary" @onclick="submitHandler">
Save
</button>
</Footer>
</Modal>

View File

@@ -35,8 +35,8 @@
.Modules .Modules
.First(m => .First(m =>
m.Assignments m.Assignments
.Select(a => a.id) .Select(a => a.Id)
.Contains(Assignment.id) .Contains(Assignment.Id)
) ?? throw new Exception("in day callback, could not find module"); ) ?? throw new Exception("in day callback, could not find module");
@@ -52,11 +52,11 @@
var moduleWithUpdatedAssignment = currentModule with var moduleWithUpdatedAssignment = currentModule with
{ {
Assignments = currentModule.Assignments.Select(a => Assignments = currentModule.Assignments.Select(a =>
a.id != Assignment.id a.Id != Assignment.Id
? a ? a
: a with : a with
{ {
due_at=defaultDueTimeDate DueAt=defaultDueTimeDate
} }
) )
}; };
@@ -79,11 +79,11 @@
m.Name != module.Name m.Name != module.Name
? m with ? 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 : 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) if (module == null)
{ {
dropOnDate(dropDate ?? Assignment.due_at); dropOnDate(dropDate ?? Assignment.DueAt);
} }
else else
{ {
@@ -119,7 +119,7 @@
planner planner
.CanvasAssignments? .CanvasAssignments?
.FirstOrDefault( .FirstOrDefault(
a => a.Id == Assignment.canvasId a => a.Id == Assignment.CanvasId
) != null; ) != null;
} }
@@ -138,7 +138,7 @@
<div class="row mx-1"> <div class="row mx-1">
<div class="col offset-2 offset-lg-1 "> <div class="col offset-2 offset-lg-1 ">
<h4 class="text-center m-0"> <h4 class="text-center m-0">
@Assignment.name @Assignment.Name
</h4> </h4>
</div> </div>
<div class="col-2 col-lg-1 text-end"> <div class="col-2 col-lg-1 text-end">
@@ -172,8 +172,8 @@
@if(!showAll) @if(!showAll)
{ {
<div class="card-text overflow-hidden p-2" style="max-height: 5rem;"> <div class="card-text overflow-hidden p-2" style="max-height: 5rem;">
<div>Points: @Assignment.points_possible</div> <div>Points: @Assignment.PointsPossible</div>
<div>Due At: @Assignment.due_at</div> <div>Due At: @Assignment.DueAt</div>
</div> </div>
} }
else else
@@ -185,12 +185,12 @@
</div> </div>
<section class="px-3"> <section class="px-3">
<div>Points: @Assignment.points_possible</div> <div>Points: @Assignment.PointsPossible</div>
<div>Due At: @Assignment.due_at</div> <div>Due At: @Assignment.DueAt</div>
<div>Lock At: @Assignment.lock_at</div> <div>Lock At: @Assignment.LockAt</div>
<div>Submission Types:</div> <div>Submission Types:</div>
<ul> <ul>
@foreach(var type in Assignment.submission_types) @foreach(var type in Assignment.SubmissionTypes)
{ {
<li> <li>
@type @type

View File

@@ -13,22 +13,22 @@
[StringLength(50, ErrorMessage = "Name too long (50 character limit).")] [StringLength(50, ErrorMessage = "Name too long (50 character limit).")]
private string Name { get; set; } = ""; private string Name { get; set; } = "";
private Modal? modal { get; set; } private Modal? modal { get; set; } = null;
private void submitHandler() private void submitHandler()
{ {
System.Console.WriteLine("new assignment"); System.Console.WriteLine("new assignment");
var newAssignment = new LocalAssignment var newAssignment = new LocalAssignment
{ {
id = Guid.NewGuid().ToString(), Id = Guid.NewGuid().ToString(),
name = Name, Name = Name,
description = "", Description = "",
lock_at_due_date = true, LockAtDueDate = true,
rubric = new RubricItem[] { }, Rubric = new RubricItem[] { },
lock_at = null, LockAt = null,
due_at = DateTime.Now, DueAt = DateTime.Now,
points_possible = 10, PointsPossible = 10,
submission_types = new string[] { SubmissionType.online_text_entry } SubmissionTypes = new string[] { SubmissionType.ONLINE_TEXT_ENTRY }
}; };
if(planner.LocalCourse != null) if(planner.LocalCourse != null)

View File

@@ -30,8 +30,8 @@
.Modules .Modules
.First(m => .First(m =>
m.Assignments m.Assignments
.Select(a => a.id) .Select(a => a.Id)
.Contains(Assignment.id) .Contains(Assignment.Id)
) ?? throw new Exception("in day callback, could not find module"); ) ?? throw new Exception("in day callback, could not find module");
var defaultDueTimeDate = new DateTime( var defaultDueTimeDate = new DateTime(
@@ -46,11 +46,11 @@
var moduleWithUpdatedAssignment = currentModule with var moduleWithUpdatedAssignment = currentModule with
{ {
Assignments = currentModule.Assignments.Select(a => Assignments = currentModule.Assignments.Select(a =>
a.id != Assignment.id a.Id != Assignment.Id
? a ? a
: a with : a with
{ {
due_at=defaultDueTimeDate DueAt=defaultDueTimeDate
} }
) )
}; };
@@ -73,7 +73,7 @@
m.Name != module.Name m.Name != module.Name
? m with ? m with
{ {
Assignments = m.Assignments.Where(a => a.id != Assignment.id) Assignments = m.Assignments.Where(a => a.Id != Assignment.Id)
} }
: m with : m with
{ {
@@ -92,7 +92,7 @@
{ {
if (module == null) if (module == null)
{ {
dropOnDate(dropDate ?? Assignment.due_at); dropOnDate(dropDate ?? Assignment.DueAt);
} }
else else
{ {
@@ -117,7 +117,7 @@
@onclick="@(() => showUpdateForm = true)" @onclick="@(() => showUpdateForm = true)"
role="button" role="button"
> >
@Assignment.name @Assignment.Name
</div> </div>
<AssignmentForm <AssignmentForm

View File

@@ -35,7 +35,7 @@
else else
return planner.LocalCourse.Modules return planner.LocalCourse.Modules
.SelectMany(m => m.Assignments) .SelectMany(m => m.Assignments)
.Where(a => a.due_at.Date == date?.Date); .Where(a => a.DueAt.Date == date?.Date);
} }
} }
private string calculatedClass private string calculatedClass

View File

@@ -149,7 +149,7 @@ public class CoursePlanner
) )
{ {
var localItemsWithCorrectOrder = localModule.Assignments var localItemsWithCorrectOrder = localModule.Assignments
.OrderBy(a => a.due_at) .OrderBy(a => a.DueAt)
.Select((a, i) => (Assignment: a, Position: i + 1)); .Select((a, i) => (Assignment: a, Position: i + 1));
var canvasContentIdsByCurrentPosition = var canvasContentIdsByCurrentPosition =
@@ -160,9 +160,9 @@ public class CoursePlanner
{ {
var itemIsInCorrectOrder = var itemIsInCorrectOrder =
canvasContentIdsByCurrentPosition.ContainsKey(position) 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) if (!itemIsInCorrectOrder)
{ {
await canvas.UpdateModuleItem( await canvas.UpdateModuleItem(
@@ -187,15 +187,15 @@ public class CoursePlanner
foreach (var localAssignment in localModule.Assignments) foreach (var localAssignment in localModule.Assignments)
{ {
var canvasModuleItemContentIds = CanvasModulesItems[moduleCanvasId].Select(i => i.ContentId); var canvasModuleItemContentIds = CanvasModulesItems[moduleCanvasId].Select(i => i.ContentId);
if (!canvasModuleItemContentIds.Contains(localAssignment.canvasId)) if (!canvasModuleItemContentIds.Contains(localAssignment.CanvasId))
{ {
var canvasAssignmentId = var canvasAssignmentId =
localAssignment.canvasId localAssignment.CanvasId
?? throw new Exception("cannot create module item if assignment does not have canvas id"); ?? throw new Exception("cannot create module item if assignment does not have canvas id");
await canvas.CreateModuleItem( await canvas.CreateModuleItem(
canvasId, canvasId,
moduleCanvasId, moduleCanvasId,
localAssignment.name, localAssignment.Name,
"Assignment", "Assignment",
canvasAssignmentId canvasAssignmentId
); );

View File

@@ -6,7 +6,7 @@ using Management.Services.Canvas;
namespace Management.Planner; namespace Management.Planner;
public static class CoursePlannerSyncronizationExtensions public static partial class CoursePlannerSyncronizationExtensions
{ {
internal static async Task EnsureAllModulesExistInCanvas( internal static async Task EnsureAllModulesExistInCanvas(
this LocalCourse localCourse, this LocalCourse localCourse,
@@ -73,7 +73,7 @@ public static class CoursePlannerSyncronizationExtensions
) )
{ {
var canvasAssignment = canvasAssignments.FirstOrDefault( var canvasAssignment = canvasAssignments.FirstOrDefault(
ca => ca.Id == localAssignment.canvasId ca => ca.Id == localAssignment.CanvasId
); );
string localHtmlDescription = localAssignment.GetDescriptionHtml( string localHtmlDescription = localAssignment.GetDescriptionHtml(
localCourse.AssignmentTemplates localCourse.AssignmentTemplates
@@ -105,34 +105,34 @@ public static class CoursePlannerSyncronizationExtensions
bool quiet = true 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 localHtmlDescription = localAssignment.GetDescriptionHtml(courseAssignmentTemplates);
var canvasHtmlDescription = canvasAssignment.Description; var canvasHtmlDescription = canvasAssignment.Description;
canvasHtmlDescription = Regex.Replace(canvasHtmlDescription, "<script.*script>", ""); canvasHtmlDescription = CanvasScriptTagRegex().Replace(canvasHtmlDescription, "");
canvasHtmlDescription = Regex.Replace(canvasHtmlDescription, "<link\\s+rel=\"[^\"]*\"\\s+href=\"[^\"]*\"[^>]*>", ""); canvasHtmlDescription = CanvasLinkTagRegex().Replace(canvasHtmlDescription, "");
var dueDatesSame = canvasAssignment.DueAt == localAssignment.due_at; var dueDatesSame = canvasAssignment.DueAt == localAssignment.DueAt;
var descriptionSame = canvasHtmlDescription == localHtmlDescription; var descriptionSame = canvasHtmlDescription == localHtmlDescription;
var nameSame = canvasAssignment.Name == localAssignment.name; var nameSame = canvasAssignment.Name == localAssignment.Name;
var lockDateSame = canvasAssignment.LockAt == localAssignment.lock_at; var lockDateSame = canvasAssignment.LockAt == localAssignment.LockAt;
var pointsSame = canvasAssignment.PointsPossible == localAssignment.points_possible; var pointsSame = canvasAssignment.PointsPossible == localAssignment.PointsPossible;
var submissionTypesSame = canvasAssignment.SubmissionTypes.SequenceEqual( var submissionTypesSame = canvasAssignment.SubmissionTypes.SequenceEqual(
localAssignment.submission_types.Select(t => t.ToString()) localAssignment.SubmissionTypes.Select(t => t.ToString())
); );
if (!quiet) if (!quiet)
{ {
if (!dueDatesSame) if (!dueDatesSame)
Console.WriteLine( 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) if (!descriptionSame)
{ {
Console.WriteLine(); Console.WriteLine();
Console.WriteLine($"descriptions different for {localAssignment.name}"); Console.WriteLine($"descriptions different for {localAssignment.Name}");
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("Local Description:"); Console.WriteLine("Local Description:");
@@ -144,25 +144,23 @@ public static class CoursePlannerSyncronizationExtensions
Console.WriteLine("Canvas Raw Description: "); Console.WriteLine("Canvas Raw Description: ");
Console.WriteLine(canvasAssignment.Description); Console.WriteLine(canvasAssignment.Description);
Console.WriteLine(); Console.WriteLine();
} }
if (!nameSame) if (!nameSame)
Console.WriteLine( 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) if (!lockDateSame)
Console.WriteLine( 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) if (!pointsSame)
Console.WriteLine( 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) if (!submissionTypesSame)
Console.WriteLine( 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); var modules = await Task.WhenAll(moduleTasks);
return localCourse with { Modules = modules }; 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 module with
{ {
Assignments = module.Assignments Assignments = module.Assignments
.OrderBy(a => a.due_at) .OrderBy(a => a.DueAt)
.DistinctBy(a => a.id) .DistinctBy(a => a.Id)
.Select(a => a.validateSubmissionTypes()) .Select(a => a.validateSubmissionTypes())
} }
); );
@@ -86,13 +86,13 @@ public static class CoursePlannerExtensions
) )
{ {
var assignmentIdInCanvas = var assignmentIdInCanvas =
canvasAssignments.FirstOrDefault(ca => ca.Id == assignment.canvasId) != null; canvasAssignments.FirstOrDefault(ca => ca.Id == assignment.CanvasId) != null;
if (!assignmentIdInCanvas) if (!assignmentIdInCanvas)
{ {
Console.WriteLine( 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; return assignment;
} }
@@ -100,12 +100,12 @@ public static class CoursePlannerExtensions
public static LocalAssignment validateSubmissionTypes(this LocalAssignment assignment) public static LocalAssignment validateSubmissionTypes(this LocalAssignment assignment)
{ {
var containsDiscussion = var containsDiscussion =
assignment.submission_types.FirstOrDefault(t => t == SubmissionType.discussion_topic) != null; assignment.SubmissionTypes.FirstOrDefault(t => t == SubmissionType.DISCUSSION_TOPIC) != null;
if (containsDiscussion) if (containsDiscussion)
return assignment with return assignment with
{ {
submission_types = new string[] { SubmissionType.discussion_topic } SubmissionTypes = new string[] { SubmissionType.DISCUSSION_TOPIC }
}; };
return assignment; return assignment;
} }

View File

@@ -10,53 +10,53 @@ public record RubricItem
public static class SubmissionType public static class SubmissionType
{ {
public static readonly string online_text_entry = "online_text_entry"; public static readonly string ONLINE_TEXT_ENTRY = "online_text_entry";
public static readonly string online_upload = "online_upload"; public static readonly string ONLINE_UPLOAD = "online_upload";
public static readonly string online_quiz = "online_quiz"; public static readonly string ONLINE_QUIZ = "online_quiz";
public static readonly string on_paper = "on_paper"; public static readonly string ON_PAPER = "on_paper";
public static readonly string discussion_topic = "discussion_topic"; public static readonly string DISCUSSION_TOPIC = "discussion_topic";
public static readonly string external_tool = "external_tool"; public static readonly string EXTERNAL_TOOL = "external_tool";
public static readonly string online_url = "online_url"; public static readonly string ONLINE_URL = "online_url";
public static readonly string media_recording = "media_recording"; public static readonly string MEDIA_RECORDING = "media_recording";
public static readonly string student_annotation = "student_annotation"; public static readonly string STUDENT_ANNOTATION = "student_annotation";
public static readonly string none = "none"; public static readonly string NONE = "none";
public static readonly IEnumerable<string> AllTypes = new string[] public static readonly IEnumerable<string> AllTypes = new string[]
{ {
SubmissionType.online_text_entry, SubmissionType.ONLINE_TEXT_ENTRY,
SubmissionType.online_upload, SubmissionType.ONLINE_UPLOAD,
SubmissionType.online_quiz, SubmissionType.ONLINE_QUIZ,
SubmissionType.on_paper, SubmissionType.ON_PAPER,
SubmissionType.discussion_topic, SubmissionType.DISCUSSION_TOPIC,
SubmissionType.external_tool, SubmissionType.EXTERNAL_TOOL,
SubmissionType.online_url, SubmissionType.ONLINE_URL,
SubmissionType.media_recording, SubmissionType.MEDIA_RECORDING,
SubmissionType.student_annotation, SubmissionType.STUDENT_ANNOTATION,
SubmissionType.none, SubmissionType.NONE,
}; };
} }
public record LocalAssignment public record LocalAssignment
{ {
public string id { get; init; } = ""; public string Id { get; init; } = "";
public ulong? canvasId { get; init; } = null; public ulong? CanvasId { get; init; } = null;
public string name { get; init; } = ""; public string Name { get; init; } = "";
public string description { get; init; } = ""; public string Description { get; init; } = "";
public bool use_template { get; init; } = false; public bool UseTemplate { get; init; } = false;
public string? template_id { get; init; } = string.Empty; public string? TemplateId { get; init; } = string.Empty;
public Dictionary<string, string> template_variables { get; init; } = public Dictionary<string, string> TemplateVariables { get; init; } =
new Dictionary<string, string>(); new Dictionary<string, string>();
public bool lock_at_due_date { get; init; } public bool LockAtDueDate { get; init; }
public IEnumerable<RubricItem> rubric { get; init; } = new RubricItem[] { }; public IEnumerable<RubricItem> Rubric { get; init; } = new RubricItem[] { };
public DateTime? lock_at { get; init; } public DateTime? LockAt { get; init; }
public DateTime due_at { get; init; } public DateTime DueAt { get; init; }
public int points_possible { get; init; } public int PointsPossible { get; init; }
public IEnumerable<string> submission_types { get; init; } = new string[] { }; public IEnumerable<string> SubmissionTypes { get; init; } = new string[] { };
public string GetRubricHtml() public string GetRubricHtml()
{ {
var output = "<h1>Rubric</h1><pre><code class=\"language-json\">[\n"; 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}}}" item => $" {{\"label\": \"{item.Label}\", \"points\": {item.Points}}}"
); );
output += string.Join(",\n", lineStrings); output += string.Join(",\n", lineStrings);
@@ -66,26 +66,26 @@ public record LocalAssignment
public string GetDescriptionHtml(IEnumerable<AssignmentTemplate>? templates) 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"); throw new Exception("cannot get description for assignment if templates not provided");
var rubricHtml = GetRubricHtml(); 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) 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); 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); html = html.Replace($"%7B%7B{entry.Key}%7D%7D", entry.Value);
} }
return html + "<hr>" + rubricHtml; 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; } = public IEnumerable<LocalAssignment> Assignments { get; init; } =
Enumerable.Empty<LocalAssignment>(); Enumerable.Empty<LocalAssignment>();
public IEnumerable<LocalQuiz> Quizzes { get; init; } = Enumerable.Empty<LocalQuiz>();
public ulong? CanvasId { get; set; } = null; 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 string htmlDescription
) )
{ {
System.Console.WriteLine($"creating assignment: {localAssignment.name}"); System.Console.WriteLine($"creating assignment: {localAssignment.Name}");
var url = $"courses/{courseId}/assignments"; var url = $"courses/{courseId}/assignments";
var request = new RestRequest(url); var request = new RestRequest(url);
var body = new CanvasAssignmentCreationRequest() var body = new CanvasAssignmentCreationRequest()
{ {
name = localAssignment.name, name = localAssignment.Name,
submission_types = localAssignment.submission_types.Select(t => t.ToString()), submission_types = localAssignment.SubmissionTypes.Select(t => t.ToString()),
description = htmlDescription, description = htmlDescription,
due_at = localAssignment.due_at, due_at = localAssignment.DueAt,
lock_at = localAssignment.lock_at, lock_at = localAssignment.LockAt,
points_possible = localAssignment.points_possible points_possible = localAssignment.PointsPossible
}; };
request.AddHeader("Content-Type", "application/json"); request.AddHeader("Content-Type", "application/json");
var bodyObj = new { assignment = body }; var bodyObj = new { assignment = body };
@@ -52,10 +52,7 @@ public class CanvasAssignmentService
if (canvasAssignment == null) if (canvasAssignment == null)
throw new Exception("created canvas assignment was null"); throw new Exception("created canvas assignment was null");
var updatedLocalAssignment = localAssignment with var updatedLocalAssignment = localAssignment with { CanvasId = canvasAssignment.Id };
{
canvasId = canvasAssignment.Id
};
await CreateRubric(courseId, updatedLocalAssignment); await CreateRubric(courseId, updatedLocalAssignment);
@@ -64,17 +61,17 @@ public class CanvasAssignmentService
public async Task Update(ulong courseId, LocalAssignment localAssignment, string htmlDescription) public async Task Update(ulong courseId, LocalAssignment localAssignment, string htmlDescription)
{ {
System.Console.WriteLine($"updating assignment: {localAssignment.name}"); System.Console.WriteLine($"updating assignment: {localAssignment.Name}");
var url = $"courses/{courseId}/assignments/{localAssignment.canvasId}"; var url = $"courses/{courseId}/assignments/{localAssignment.CanvasId}";
var request = new RestRequest(url); var request = new RestRequest(url);
var body = new CanvasAssignmentCreationRequest() var body = new CanvasAssignmentCreationRequest()
{ {
name = localAssignment.name, name = localAssignment.Name,
submission_types = localAssignment.submission_types.Select(t => t.ToString()), submission_types = localAssignment.SubmissionTypes.Select(t => t.ToString()),
description = htmlDescription, description = htmlDescription,
due_at = localAssignment.due_at, due_at = localAssignment.DueAt,
lock_at = localAssignment.lock_at, lock_at = localAssignment.LockAt,
points_possible = localAssignment.points_possible points_possible = localAssignment.PointsPossible
}; };
request.AddHeader("Content-Type", "application/json"); request.AddHeader("Content-Type", "application/json");
var bodyObj = new { assignment = body }; var bodyObj = new { assignment = body };
@@ -86,13 +83,13 @@ public class CanvasAssignmentService
public async Task CreateRubric(ulong courseId, LocalAssignment localAssignment) 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"); throw new Exception("cannot create rubric if no canvas id in assignment");
var criterion = new Dictionary<int, object>(); var criterion = new Dictionary<int, object>();
var i = 0; var i = 0;
foreach (var rubricItem in localAssignment.rubric) foreach (var rubricItem in localAssignment.Rubric)
{ {
var ratings = new Dictionary<int, object> var ratings = new Dictionary<int, object>
{ {
@@ -111,18 +108,18 @@ public class CanvasAssignmentService
// https://canvas.instructure.com/doc/api/rubrics.html#method.rubrics.create // https://canvas.instructure.com/doc/api/rubrics.html#method.rubrics.create
var body = new var body = new
{ {
rubric_association_id = localAssignment.canvasId, rubric_association_id = localAssignment.CanvasId,
rubric = new rubric = new
{ {
title = $"Rubric for Assignment: {localAssignment.name}", title = $"Rubric for Assignment: {localAssignment.Name}",
association_id = localAssignment.canvasId, association_id = localAssignment.CanvasId,
association_type = "Assignment", association_type = "Assignment",
use_for_grading = true, use_for_grading = true,
criteria = criterion, criteria = criterion,
}, },
rubric_association = new rubric_association = new
{ {
association_id = localAssignment.canvasId, association_id = localAssignment.CanvasId,
association_type = "Assignment", association_type = "Assignment",
purpose = "grading", purpose = "grading",
use_for_grading = true, use_for_grading = true,
@@ -141,9 +138,9 @@ public class CanvasAssignmentService
var assignmentPointCorrectionBody = new 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); var pointAdjustmentRequest = new RestRequest(adjustmentUrl);
pointAdjustmentRequest.AddBody(assignmentPointCorrectionBody); pointAdjustmentRequest.AddBody(assignmentPointCorrectionBody);
pointAdjustmentRequest.AddHeader("Content-Type", "application/json"); pointAdjustmentRequest.AddHeader("Content-Type", "application/json");