diff --git a/.gitignore b/.gitignore index cea0332..bedab7a 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ bin/ .env *.env storage/ +tmp.json \ No newline at end of file diff --git a/Management.Web/Pages/Index.razor b/Management.Web/Pages/Index.razor index 50c540f..69a572a 100644 --- a/Management.Web/Pages/Index.razor +++ b/Management.Web/Pages/Index.razor @@ -70,13 +70,20 @@ {
+ +
} diff --git a/Management.Web/Program.cs b/Management.Web/Program.cs index f1ffe11..47f19cc 100644 --- a/Management.Web/Program.cs +++ b/Management.Web/Program.cs @@ -21,9 +21,9 @@ builder.Services.AddRazorPages(); builder.Services.AddServerSideBlazor(); builder.Services.AddScoped(); builder.Services.AddScoped(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); var app = builder.Build(); diff --git a/Management.Web/Shared/Course/CourseDetails.razor b/Management.Web/Shared/Course/CourseDetails.razor index 28fa576..fe7f1ca 100644 --- a/Management.Web/Shared/Course/CourseDetails.razor +++ b/Management.Web/Shared/Course/CourseDetails.razor @@ -3,6 +3,7 @@ @using Management.Web.Shared.Module @using Management.Web.Shared.Semester +@inject CanvasService canvas @inject CoursePlanner planner @code @@ -11,6 +12,22 @@ { planner.StateHasChanged += reload; } + protected override async Task OnInitializedAsync() + { + if( + planner.CanvasAssignments == null + && planner.LocalCourse != null + && planner.LocalCourse.CanvasId != null + ) + { + var canvasId = planner.LocalCourse.CanvasId ?? throw new Exception("no canvas id found for selected course"); + planner.CanvasAssignments = await canvas.GetAssignments(canvasId); + planner.CanvasModules = await canvas.GetModules(canvasId); + System.Console.WriteLine(JsonSerializer.Serialize(planner.CanvasAssignments)); + } + await base.OnInitializedAsync(); + } + private void reload() { this.InvokeAsync(this.StateHasChanged); @@ -21,8 +38,6 @@ } } - -
@if (planner.LocalCourse != null) diff --git a/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor b/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor index 80655de..bdda72c 100644 --- a/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor +++ b/Management.Web/Shared/Module/Assignment/AssignmentDetails.razor @@ -48,6 +48,7 @@ minute: planner.LocalCourse.DefaultDueTime.Minute, second: 0 ); + var moduleWithUpdatedAssignment = currentModule with { Assignments = currentModule.Assignments.Select(a => @@ -114,6 +115,13 @@ dragContainer.DropCallback = null; } + private bool isSyncedWithCanvas => + planner + .CanvasAssignments? + .FirstOrDefault( + a => a.Id == Assignment.canvasId + ) != null; + }
@Assignment.name -
+ @if(isSyncedWithCanvas) + { +
Synced With Canvas
+ } + else + { +
Not Synced with Canvas
+ } +
diff --git a/Management.Web/Shared/Module/ModuleDetail.razor b/Management.Web/Shared/Module/ModuleDetail.razor index d876033..c6ceab3 100644 --- a/Management.Web/Shared/Module/ModuleDetail.razor +++ b/Management.Web/Shared/Module/ModuleDetail.razor @@ -44,6 +44,12 @@ } dragContainer.DropCallback?.Invoke(null, Module); } + + private bool isSyncedWithCanvas => planner + .CanvasModules? + .FirstOrDefault( + cm => cm.Id == Module.CanvasId + ) != null; }
- -

+

+

module with { Assignments = module.Assignments.DistinctBy(a => a.id) } ); - - return incomingCourse with { Modules = modulesWithUniqueAssignments }; + + return incomingCourse with + { + Modules = modulesWithUniqueAssignments + }; + } + + public IEnumerable? CanvasAssignments { get; set; } = null; + public IEnumerable? CanvasModules { get; set; } = null; + + public async Task SyncWithCanvas() + { + if ( + LocalCourse == null + || LocalCourse.CanvasId == null + || CanvasAssignments == null + || CanvasModules == null + ) + return; + + var canvasId = + LocalCourse.CanvasId ?? throw new Exception("no course canvas id to sync with canvas"); + await ensureAllModulesCreated(canvasId); + await reloadModules_UpdateLocalModulesWithNewId(canvasId); + + await ensureAllAssignmentsCreated_updateIds(canvasId); + } + + private async Task reloadModules_UpdateLocalModulesWithNewId(ulong canvasId) + { + if (LocalCourse == null) + return; + + CanvasModules = await canvas.GetModules(canvasId); + LocalCourse = LocalCourse with + { + Modules = LocalCourse.Modules.Select(m => + { + var canvasModule = CanvasModules.FirstOrDefault(cm => cm.Name == m.Name); + return canvasModule == null ? m : m with { CanvasId = canvasModule.Id }; + }) + }; + } + + private async Task ensureAllModulesCreated(ulong canvasId) + { + if (LocalCourse == null || CanvasModules == null) + return; + + foreach (var module in LocalCourse.Modules) + { + var canvasModule = CanvasModules.FirstOrDefault(cm => cm.Id == module.CanvasId); + if (canvasModule == null) + { + await canvas.CreateModule(canvasId, module.Name); + } + } + } + + private async Task ensureAllAssignmentsCreated_updateIds(ulong canvasId) + { + if ( + LocalCourse == null + || LocalCourse.CanvasId == null + || CanvasAssignments == null + || CanvasModules == null + ) + return; + + var moduleTasks = LocalCourse.Modules.Select(async m => + { + var assignmentTasks = m.Assignments.Select(ensureAssignmentInCanvas_returnUpdated); + var assignments = await Task.WhenAll(assignmentTasks); + return m with { Assignments = assignments }; + }); + + var modules = await Task.WhenAll(moduleTasks); + LocalCourse = LocalCourse with + { + Modules = modules + }; + } + + private async Task ensureAssignmentInCanvas_returnUpdated( + LocalAssignment localAssignment + ) + { + // var canvasAssignment = await canvas. + return localAssignment; + } + + public void Clear() + { + LocalCourse = null; + CanvasAssignments = null; + CanvasModules = null; } } diff --git a/Management/Models/CanvasModels/Assignments/AssignmentModel.cs b/Management/Models/CanvasModels/Assignments/CanvasAssignment.cs similarity index 92% rename from Management/Models/CanvasModels/Assignments/AssignmentModel.cs rename to Management/Models/CanvasModels/Assignments/CanvasAssignment.cs index 82af5ec..e2d4dbf 100644 --- a/Management/Models/CanvasModels/Assignments/AssignmentModel.cs +++ b/Management/Models/CanvasModels/Assignments/CanvasAssignment.cs @@ -3,7 +3,7 @@ using CanvasModel.Submissions; namespace CanvasModel.Assignments; -public record AssignmentModel +public record CanvasAssignment ( [property: JsonPropertyName("id")] @@ -88,7 +88,7 @@ public record AssignmentModel DateTime? UnlockAt = null, [property: JsonPropertyName("all_dates")] - IEnumerable? AllDates = null, + IEnumerable? AllDates = null, [property: JsonPropertyName("allowed_extensions")] IEnumerable? AllowedExtensions = null, @@ -100,13 +100,13 @@ public record AssignmentModel bool? VeriCiteEnabled = null, [property: JsonPropertyName("turnitin_settings")] - TurnitinSettingsModel? TurnitinSettings = null, + CanvasTurnitinSettings? TurnitinSettings = null, [property: JsonPropertyName("grade_group_students_individually")] bool? GradeGroupStudentsIndividually = null, [property: JsonPropertyName("external_tool_tag_attributes")] - ExternalToolTagAttributesModel? ExternalToolTagAttributes = null, + CanvasExternalToolTagAttributes? ExternalToolTagAttributes = null, [property: JsonPropertyName("peer_review_count")] uint? PeerReviewCount = null, @@ -124,7 +124,7 @@ public record AssignmentModel uint? NeedsGradingCount = null, [property: JsonPropertyName("needs_grading_count_be_section")] - IEnumerable? NeedsGradingCountBySection = null, + IEnumerable? NeedsGradingCountBySection = null, [property: JsonPropertyName("post_to_sis")] bool? PostToSis = null, @@ -148,7 +148,7 @@ public record AssignmentModel ulong? GradingStandardId = null, [property: JsonPropertyName("lock_info")] - LockInfoModel? LockInfo = null, + CanvasLockInfo? LockInfo = null, [property: JsonPropertyName("lock_explanation")] string? LockExplanation = null, @@ -181,13 +181,13 @@ public record AssignmentModel object? RubricSettings = null, [property: JsonPropertyName("rubric")] - IEnumerable? Rubric = null, + IEnumerable? Rubric = null, [property: JsonPropertyName("assignment_visibility")] IEnumerable? AssignmentVisibility = null, [property: JsonPropertyName("overrides")] - IEnumerable? Overrides = null, + IEnumerable? Overrides = null, [property: JsonPropertyName("omit_from_final_grade")] bool? OmitFromFinalGrade = null, diff --git a/Management/Models/CanvasModels/Assignments/AssignmentDateModel.cs b/Management/Models/CanvasModels/Assignments/CanvasAssignmentDate.cs similarity index 92% rename from Management/Models/CanvasModels/Assignments/AssignmentDateModel.cs rename to Management/Models/CanvasModels/Assignments/CanvasAssignmentDate.cs index 8f3eaa4..ddbcb68 100644 --- a/Management/Models/CanvasModels/Assignments/AssignmentDateModel.cs +++ b/Management/Models/CanvasModels/Assignments/CanvasAssignmentDate.cs @@ -1,6 +1,6 @@ namespace CanvasModel.Assignments; -public record AssignmentDateModel +public record CanvasAssignmentDate ( [property: JsonPropertyName("title")] string Title, diff --git a/Management/Models/CanvasModels/Assignments/AssignmentOverrideModel.cs b/Management/Models/CanvasModels/Assignments/CanvasAssignmentOverride.cs similarity index 95% rename from Management/Models/CanvasModels/Assignments/AssignmentOverrideModel.cs rename to Management/Models/CanvasModels/Assignments/CanvasAssignmentOverride.cs index 1cd84f6..536aab4 100644 --- a/Management/Models/CanvasModels/Assignments/AssignmentOverrideModel.cs +++ b/Management/Models/CanvasModels/Assignments/CanvasAssignmentOverride.cs @@ -1,6 +1,6 @@ namespace CanvasModel.Assignments; -public record AssignmentOverrideModel +public record CanvasAssignmentOverride ( [property: JsonPropertyName("id")] diff --git a/Management/Models/CanvasModels/Assignments/ExternalToolTagAttributesModel.cs b/Management/Models/CanvasModels/Assignments/CanvasExternalToolTagAttributes.cs similarity index 83% rename from Management/Models/CanvasModels/Assignments/ExternalToolTagAttributesModel.cs rename to Management/Models/CanvasModels/Assignments/CanvasExternalToolTagAttributes.cs index b90b899..6158d82 100644 --- a/Management/Models/CanvasModels/Assignments/ExternalToolTagAttributesModel.cs +++ b/Management/Models/CanvasModels/Assignments/CanvasExternalToolTagAttributes.cs @@ -1,6 +1,6 @@ namespace CanvasModel.Assignments; -public record ExternalToolTagAttributesModel +public record CanvasExternalToolTagAttributes ( [property: JsonPropertyName("url")] string Url, diff --git a/Management/Models/CanvasModels/Assignments/LockInfoModel.cs b/Management/Models/CanvasModels/Assignments/CanvasLockInfo.cs similarity index 93% rename from Management/Models/CanvasModels/Assignments/LockInfoModel.cs rename to Management/Models/CanvasModels/Assignments/CanvasLockInfo.cs index 76d42a6..08592fc 100644 --- a/Management/Models/CanvasModels/Assignments/LockInfoModel.cs +++ b/Management/Models/CanvasModels/Assignments/CanvasLockInfo.cs @@ -1,6 +1,6 @@ namespace CanvasModel.Assignments; -public record LockInfoModel +public record CanvasLockInfo ( [property: JsonPropertyName("asset_string")] string AssetString, diff --git a/Management/Models/CanvasModels/Assignments/NeedsGradingCountModel.cs b/Management/Models/CanvasModels/Assignments/CanvasNeedsGradingCount.cs similarity index 82% rename from Management/Models/CanvasModels/Assignments/NeedsGradingCountModel.cs rename to Management/Models/CanvasModels/Assignments/CanvasNeedsGradingCount.cs index 76f0f34..3323507 100644 --- a/Management/Models/CanvasModels/Assignments/NeedsGradingCountModel.cs +++ b/Management/Models/CanvasModels/Assignments/CanvasNeedsGradingCount.cs @@ -1,6 +1,6 @@ namespace CanvasModel.Assignments; -public record NeedsGradingCountModel +public record CanvasNeedsGradingCount ( [property: JsonPropertyName("section_id")] string SectionId, diff --git a/Management/Models/CanvasModels/Assignments/RubricCriteriaModel.cs b/Management/Models/CanvasModels/Assignments/CanvasRubricCriteria.cs similarity index 88% rename from Management/Models/CanvasModels/Assignments/RubricCriteriaModel.cs rename to Management/Models/CanvasModels/Assignments/CanvasRubricCriteria.cs index 2fcc3ef..456388e 100644 --- a/Management/Models/CanvasModels/Assignments/RubricCriteriaModel.cs +++ b/Management/Models/CanvasModels/Assignments/CanvasRubricCriteria.cs @@ -1,6 +1,6 @@ namespace CanvasModel.Assignments; -public record RubricCriteriaModel +public record CanvasRubricCriteria ( [property: JsonPropertyName("id")] string Id, @@ -23,7 +23,7 @@ public record RubricCriteriaModel bool? CriterionUseRange = null, [property: JsonPropertyName("ratings")] - IEnumerable? Ratings = null, + IEnumerable? Ratings = null, [property: JsonPropertyName("ignore_for_scoring")] bool? IgnoreForScoring = null diff --git a/Management/Models/CanvasModels/Assignments/RubricRatingModel.cs b/Management/Models/CanvasModels/Assignments/CanvasRubricRating.cs similarity index 89% rename from Management/Models/CanvasModels/Assignments/RubricRatingModel.cs rename to Management/Models/CanvasModels/Assignments/CanvasRubricRating.cs index 5933386..46f9ecc 100644 --- a/Management/Models/CanvasModels/Assignments/RubricRatingModel.cs +++ b/Management/Models/CanvasModels/Assignments/CanvasRubricRating.cs @@ -1,6 +1,6 @@ namespace CanvasModel.Assignments; -public record RubricRatingModel +public record CanvasRubricRating ( [property: JsonPropertyName("points")] double Points, diff --git a/Management/Models/CanvasModels/Assignments/TurnitinSettingsModel.cs b/Management/Models/CanvasModels/Assignments/CanvasTurnitinSettings.cs similarity index 94% rename from Management/Models/CanvasModels/Assignments/TurnitinSettingsModel.cs rename to Management/Models/CanvasModels/Assignments/CanvasTurnitinSettings.cs index 44593bd..e01cdcb 100644 --- a/Management/Models/CanvasModels/Assignments/TurnitinSettingsModel.cs +++ b/Management/Models/CanvasModels/Assignments/CanvasTurnitinSettings.cs @@ -1,6 +1,6 @@ namespace CanvasModel.Assignments; -public record TurnitinSettingsModel +public record CanvasTurnitinSettings ( [property: JsonPropertyName("originality_report_visibility")] string OriginalityReportVisibility, diff --git a/Management/Models/CanvasModels/CourseModule.cs b/Management/Models/CanvasModels/CourseModule.cs deleted file mode 100644 index 4673239..0000000 --- a/Management/Models/CanvasModels/CourseModule.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.ComponentModel.DataAnnotations; - -namespace CanvasModel; - -public record CourseModule( - [property: JsonPropertyName("id")] ulong Id, - [property: JsonPropertyName("name")] string Name - // [property: JsonPropertyName("start_at")] DateTime StartAt, - // [property: JsonPropertyName("end_at")] DateTime EndAt, - // [property: JsonPropertyName("description")] string Description -); diff --git a/Management/Models/CanvasModels/Modules/CanvasModule.cs b/Management/Models/CanvasModels/Modules/CanvasModule.cs new file mode 100644 index 0000000..7eaba1a --- /dev/null +++ b/Management/Models/CanvasModels/Modules/CanvasModule.cs @@ -0,0 +1,23 @@ +namespace CanvasModel.Modules; + +public record CanvasModule( + [property: JsonPropertyName("id")] ulong Id, + [property: JsonPropertyName("workflow_state")] string WorkflowState, + [property: JsonPropertyName("position")] uint Position, + [property: JsonPropertyName("name")] string Name, + [property: JsonPropertyName("unlock_at")] DateTime? UnlockAt, + [property: JsonPropertyName("require_sequential_progress")] bool? RequireSequentialProgress, + [property: JsonPropertyName("prerequisite_module_ids")] IEnumerable? PrerequisiteModuleIds, + [property: JsonPropertyName("items_count")] uint ItemsCount, + [property: JsonPropertyName("items_url")] string ItemsUrl, + // [OptIn] + // [Enigmatic] // can be null if "the module is deemed too large", even if opted-in + [property: JsonPropertyName("items")] + IEnumerable? Items, + [property: JsonPropertyName("state")] string? State, // todo make sure this, + // [OptIn] + [property: JsonPropertyName("completed_at")] + DateTime? CompletedAt, + [property: JsonPropertyName("publish_final_grade")] bool? PublishFinalGrade, + [property: JsonPropertyName("published")] bool? Published +); diff --git a/Management/Models/CanvasModels/Modules/CanvasModuleCompletionRequirements.cs b/Management/Models/CanvasModels/Modules/CanvasModuleCompletionRequirements.cs new file mode 100644 index 0000000..8ede8b2 --- /dev/null +++ b/Management/Models/CanvasModels/Modules/CanvasModuleCompletionRequirements.cs @@ -0,0 +1,7 @@ +namespace CanvasModel.Modules; + +public record CanvasCompletionRequirement( + [property: JsonPropertyName("type")] string Type, + [property: JsonPropertyName("min_score")] double? MinScore, + [property: JsonPropertyName("completed")] bool? Completed +); diff --git a/Management/Models/CanvasModels/Modules/CanvasModuleItem.cs b/Management/Models/CanvasModels/Modules/CanvasModuleItem.cs new file mode 100644 index 0000000..bb2cdda --- /dev/null +++ b/Management/Models/CanvasModels/Modules/CanvasModuleItem.cs @@ -0,0 +1,20 @@ +namespace CanvasModel.Modules; + +public record CanvasModuleItem( + [property: JsonPropertyName("id")] ulong Id, + [property: JsonPropertyName("module_id")] ulong ModuleId, + [property: JsonPropertyName("position")] uint Position, + [property: JsonPropertyName("title")] string Title, + [property: JsonPropertyName("indent")] uint? Indent, + [property: JsonPropertyName("type")] string Type, + [property: JsonPropertyName("content_id")] ulong? ContentId, + [property: JsonPropertyName("html_url")] string HtmlUrl, + [property: JsonPropertyName("url")] string? Url, + [property: JsonPropertyName("page_url")] string? PageUrl, + [property: JsonPropertyName("external_url")] string? ExternalUrl, + [property: JsonPropertyName("new_tab")] bool NewTab, + // [OptIn] + [property: JsonPropertyName("completion_requirement")] + CanvasCompletionRequirement? CompletionRequirement, + [property: JsonPropertyName("published")] bool? Published +); diff --git a/Management/Models/CanvasModels/Submissions/SubmissionModel.cs b/Management/Models/CanvasModels/Submissions/SubmissionModel.cs index 41dd265..0e6ab6e 100644 --- a/Management/Models/CanvasModels/Submissions/SubmissionModel.cs +++ b/Management/Models/CanvasModels/Submissions/SubmissionModel.cs @@ -33,7 +33,7 @@ public record SubmissionModel string LatePolicyStatus, [property: JsonPropertyName("assignment")] - AssignmentModel? Assignment = null, + CanvasAssignment? Assignment = null, [property: JsonPropertyName("course")] CourseModel? Course = null, diff --git a/Management/Models/CanvasModels/Users/ActivityStreamObjectModel.cs b/Management/Models/CanvasModels/Users/ActivityStreamObjectModel.cs index ae0c890..117ae1a 100644 --- a/Management/Models/CanvasModels/Users/ActivityStreamObjectModel.cs +++ b/Management/Models/CanvasModels/Users/ActivityStreamObjectModel.cs @@ -90,7 +90,7 @@ public record ActivityStreamObjectModel ulong? AssignmentId = null, [property: JsonPropertyName("assignment")] - AssignmentModel? Assignment = null, + CanvasAssignment? Assignment = null, [property: JsonPropertyName("course")] CourseModel? Course = null, diff --git a/Management/Models/Local/LocalModules.cs b/Management/Models/Local/LocalModules.cs index 3d859b2..1aceaef 100644 --- a/Management/Models/Local/LocalModules.cs +++ b/Management/Models/Local/LocalModules.cs @@ -5,4 +5,6 @@ public record LocalModule public string Name { get; init; } = string.Empty; public IEnumerable Assignments { get; init; } = Enumerable.Empty(); + + public ulong? CanvasId { get; set; } = null; } diff --git a/Management/Services/CanvasService.cs b/Management/Services/CanvasService.cs index e1baf4a..ac6eb74 100644 --- a/Management/Services/CanvasService.cs +++ b/Management/Services/CanvasService.cs @@ -1,6 +1,8 @@ using CanvasModel; +using CanvasModel.Assignments; using CanvasModel.Courses; using CanvasModel.EnrollmentTerms; +using CanvasModel.Modules; using RestSharp; public interface ICanvasService @@ -13,11 +15,9 @@ public class CanvasService : ICanvasService { private const string BaseUrl = "https://snow.instructure.com/api/v1/"; private readonly IWebRequestor webRequestor; - private string courseid { get; } public CanvasService(IWebRequestor webRequestor) { - courseid = "774898"; this.webRequestor = webRequestor; } @@ -54,11 +54,26 @@ public class CanvasService : ICanvasService return data; } - public async Task> GetModules(ulong courseId) + public async Task> GetAssignments(ulong courseId) + { + var url = $"courses/{courseId}/assignments "; + var request = new RestRequest(url); + var assignmentResponse = await PaginatedRequest>(request); + return assignmentResponse.SelectMany(c => c); + } + + // public async Task CreateAssignment( + + // ) + // { + + // } + + public async Task> GetModules(ulong courseId) { var url = $"courses/{courseId}/modules"; var request = new RestRequest(url); - var modules = await PaginatedRequest>(request); + var modules = await PaginatedRequest>(request); return modules.SelectMany(c => c).ToArray(); } diff --git a/requests/assignment.http b/requests/assignment.http new file mode 100644 index 0000000..999e099 --- /dev/null +++ b/requests/assignment.http @@ -0,0 +1,104 @@ + +### +get https://snow.instructure.com/api/v1/courses +Authorization: Bearer {{$dotenv CANVAS_TOKEN}} + + +### + +GET https://snow.instructure.com/api/v1/courses/705168 +Authorization: Bearer {{$dotenv CANVAS_TOKEN}} + +### +POST https://snow.instructure.com/api/v1/courses/872095/assignments +Authorization: Bearer {{$dotenv CANVAS_TOKEN}} + +{"assignment":{"name:":"New Assignment","description:":"This is a new assignment"}} + +### +POST https://snow.instructure.com/api/v1/courses/705168/assignments +Authorization: Bearer {{$dotenv CANVAS_TOKEN}} + +{ + "assignment": { + "due_at":null, + "points_possible":0, + "assignment_group_id":"1805234", + "post_to_sis":false, + "graders_anonymous_to_graders":false, + "grader_comments_visible_to_graders":true, + "grader_names_visible_to_final_grader":true, + "annotatable_attachment_id":"", + "secure_params":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsdGlfYXNzaWdubWVudF9pZCI6ImIxZWNhNjFjLWJlZWQtNGJjMC1hNTBiLWJkYmNiOTA3MjNiOSIsImx0aV9hc3NpZ25tZW50X2Rlc2NyaXB0aW9uIjpudWxsfQ.jzOL4gSSsNkq7m3S7kl9RbbqsdjK7FzhhepqyHWuTAk", + "lti_context_id":null, + "course_id":"872095", + "name":"test1", + "submission_types":["online_text_entry"], + "has_submitted_submissions":false, + "due_date_required":false, + "max_name_length":255, + "allowed_attempts":"-1", + "in_closed_grading_period":false, + "graded_submissions_exist":false, + "omit_from_final_grade":"0", + "hide_in_gradebook":false, + "turnitin_enabled":"0", + "turnitin_settings": { + "s_paper_check":true, + "originality_report_visibility":"immediate", + "internet_check":true, + "exclude_biblio":true, + "exclude_quoted":true, + "journal_check":true, + "exclude_small_matches_type":null, + "exclude_small_matches_value":0, + "submit_papers_to":true + }, + "is_quiz_assignment":false, + "can_duplicate":true, + "original_course_id":null, + "original_assignment_id":null, + "original_lti_resource_link_id":null, + "original_assignment_name":null, + "original_quiz_id":null, + "workflow_state":"unpublished", + "important_dates":false, + "assignment_overrides":[], + "publishable":true, + "hidden":false, + "unpublishable":true, + "grading_type":"points", + "submission_type":"online", + "only_visible_to_overrides":false, + "description":"", + "grading_standard_id":"", + "allowed_extensions":null, + "vericite_enabled":"0", + "external_tool_tag_attributes": { + "external_data":"", + "custom_params":"", + "line_item":"", + "link_settings": { + "selection_width":"", + "selection_height":"" + }, + "url":"", + "content_type":"", + "content_id":"", + "new_tab":"0" + }, + "similarityDetectionTool":"None", + "configuration_tool_type":"", + "grade_group_students_individually":false, + "group_category_id":null, + "peer_reviews":"0", + "automatic_peer_reviews":"0", + "peer_review_count":0, + "peer_reviews_assign_at":null, + "intra_group_peer_reviews":"0", + "anonymous_peer_reviews":"0", + "notify_of_update":"0", + "lock_at":null, + "unlock_at":null + } +} diff --git a/tmp.json b/tmp.json deleted file mode 100644 index 020f9f7..0000000 --- a/tmp.json +++ /dev/null @@ -1,35 +0,0 @@ -[ - { - "id": 753, - "name": "Summer 2023", - "sis_term_id": null, - "sis_import_id": null, - "start_at": "2023-05-10T06:00:00Z", - "end_at": "2023-07-29T05:59:59Z", - "grading_period_group_id": null, - "workflow_state": "active", - "overrides": null - }, - { - "id": 751, - "name": "Fall 2023", - "sis_term_id": null, - "sis_import_id": null, - "start_at": "2023-08-21T06:00:00Z", - "end_at": "2023-12-15T06:59:59Z", - "grading_period_group_id": null, - "workflow_state": "active", - "overrides": null - }, - { - "id": 773, - "name": "Spring 2024", - "sis_term_id": null, - "sis_import_id": null, - "start_at": "2024-01-02T00:00:00Z", - "end_at": "2024-04-26T00:00:00Z", - "grading_period_group_id": null, - "workflow_state": "active", - "overrides": null - } -]