mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-27 07:58:31 -06:00
changed casing of local assets
This commit is contained in:
@@ -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?
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
42
Management.Web/Shared/Components/QuizForm/QuizForm.razor
Normal file
42
Management.Web/Shared/Components/QuizForm/QuizForm.razor
Normal 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>
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
13
Management/Models/Local/LocalQuiz.cs
Normal file
13
Management/Models/Local/LocalQuiz.cs
Normal 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
|
||||||
|
}
|
||||||
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user