mirror of
https://github.com/alexmickelson/canvasManagement.git
synced 2026-03-26 23:58:31 -06:00
offsetting quizzes
This commit is contained in:
98
nextjs/src/models/local/semesterTransferUtils.ts
Normal file
98
nextjs/src/models/local/semesterTransferUtils.ts
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
import { LocalAssignment } from "./assignment/localAssignment";
|
||||||
|
import { LocalQuiz } from "./quiz/localQuiz";
|
||||||
|
import {
|
||||||
|
dateToMarkdownString,
|
||||||
|
getDateFromString,
|
||||||
|
getDateFromStringOrThrow,
|
||||||
|
getDateOnlyMarkdownString,
|
||||||
|
} from "./timeUtils";
|
||||||
|
|
||||||
|
export const prepAssignmentForNewSemester = (
|
||||||
|
assignment: LocalAssignment,
|
||||||
|
oldSemesterStartDate: string,
|
||||||
|
newSemesterStartDate: string
|
||||||
|
): LocalAssignment => {
|
||||||
|
const descriptionWithoutGithubClassroom = replaceClassroomUrl(
|
||||||
|
assignment.description
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
...assignment,
|
||||||
|
description: descriptionWithoutGithubClassroom,
|
||||||
|
dueAt:
|
||||||
|
newDateOffset(
|
||||||
|
assignment.dueAt,
|
||||||
|
oldSemesterStartDate,
|
||||||
|
newSemesterStartDate
|
||||||
|
) ?? assignment.dueAt,
|
||||||
|
lockAt: newDateOffset(
|
||||||
|
assignment.lockAt,
|
||||||
|
oldSemesterStartDate,
|
||||||
|
newSemesterStartDate
|
||||||
|
),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
export const prepQuizForNewSemester = (
|
||||||
|
quiz: LocalQuiz,
|
||||||
|
oldSemesterStartDate: string,
|
||||||
|
newSemesterStartDate: string
|
||||||
|
): LocalQuiz => {
|
||||||
|
const descriptionWithoutGithubClassroom = replaceClassroomUrl(
|
||||||
|
quiz.description
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
...quiz,
|
||||||
|
description: descriptionWithoutGithubClassroom,
|
||||||
|
dueAt:
|
||||||
|
newDateOffset(
|
||||||
|
quiz.dueAt,
|
||||||
|
oldSemesterStartDate,
|
||||||
|
newSemesterStartDate
|
||||||
|
) ?? quiz.dueAt,
|
||||||
|
lockAt: newDateOffset(
|
||||||
|
quiz.lockAt,
|
||||||
|
oldSemesterStartDate,
|
||||||
|
newSemesterStartDate
|
||||||
|
),
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const replaceClassroomUrl = (value: string) => {
|
||||||
|
const classroomPattern =
|
||||||
|
/https:\/\/classroom\.github\.com\/[a-zA-Z0-9\/._-]+/g;
|
||||||
|
const withoutGithubClassroom = value.replace(
|
||||||
|
classroomPattern,
|
||||||
|
"insert_github_classroom_url"
|
||||||
|
);
|
||||||
|
return withoutGithubClassroom;
|
||||||
|
};
|
||||||
|
|
||||||
|
const newDateOffset = (
|
||||||
|
dateString: string | undefined,
|
||||||
|
oldSemesterStartDate: string,
|
||||||
|
newSemesterStartDate: string
|
||||||
|
) => {
|
||||||
|
if (!dateString) return dateString;
|
||||||
|
const oldStart = getDateFromStringOrThrow(
|
||||||
|
oldSemesterStartDate,
|
||||||
|
"semester start date in new semester offset"
|
||||||
|
);
|
||||||
|
const newStart = getDateFromStringOrThrow(
|
||||||
|
newSemesterStartDate,
|
||||||
|
"new semester start date in new semester offset"
|
||||||
|
);
|
||||||
|
const date = getDateFromStringOrThrow(
|
||||||
|
dateString,
|
||||||
|
"date in new semester offset"
|
||||||
|
);
|
||||||
|
const offset = date.getTime() - oldStart.getTime();
|
||||||
|
|
||||||
|
const newUnixTime = offset + newStart.getTime();
|
||||||
|
|
||||||
|
const newDate = new Date(newUnixTime);
|
||||||
|
|
||||||
|
return dateToMarkdownString(newDate);
|
||||||
|
};
|
||||||
173
nextjs/src/models/local/tests/testSemesterImport.test.ts
Normal file
173
nextjs/src/models/local/tests/testSemesterImport.test.ts
Normal file
@@ -0,0 +1,173 @@
|
|||||||
|
import { describe, it, expect } from "vitest";
|
||||||
|
import { LocalAssignment } from "../assignment/localAssignment";
|
||||||
|
import { prepAssignmentForNewSemester, prepQuizForNewSemester } from "../semesterTransferUtils";
|
||||||
|
import { LocalQuiz } from "../quiz/localQuiz";
|
||||||
|
|
||||||
|
describe("can take an assignment and template it for a new semester", () => {
|
||||||
|
it("can sanitize assignment github classroom repo url", () => {
|
||||||
|
const assignment: LocalAssignment = {
|
||||||
|
name: "test assignment",
|
||||||
|
description: `
|
||||||
|
## test description
|
||||||
|
|
||||||
|
[GitHub Classroom Assignment](https://classroom.github.com/a/y_eOxTfL)
|
||||||
|
|
||||||
|
other stuff below`,
|
||||||
|
dueAt: "08/21/2023 23:59:00",
|
||||||
|
lockAt: "08/21/2023 23:59:00",
|
||||||
|
submissionTypes: [],
|
||||||
|
localAssignmentGroupName: "Final Project",
|
||||||
|
rubric: [],
|
||||||
|
allowedFileUploadExtensions: [],
|
||||||
|
};
|
||||||
|
const oldSemesterStartDate = "08/26/2023 23:59:00";
|
||||||
|
const newSemesterStartDate = "01/08/2024 23:59:00";
|
||||||
|
|
||||||
|
const sanitizedAssignment = prepAssignmentForNewSemester(
|
||||||
|
assignment,
|
||||||
|
oldSemesterStartDate,
|
||||||
|
newSemesterStartDate
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(sanitizedAssignment.description).toEqual(`
|
||||||
|
## test description
|
||||||
|
|
||||||
|
[GitHub Classroom Assignment](insert_github_classroom_url)
|
||||||
|
|
||||||
|
other stuff below`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("can sanitize assignment github classroom repo url 2", () => {
|
||||||
|
const assignment: LocalAssignment = {
|
||||||
|
name: "test assignment",
|
||||||
|
description: `
|
||||||
|
<https://classroom.github.com/a/y_eOxTfL>
|
||||||
|
other stuff below`,
|
||||||
|
dueAt: "08/21/2023 23:59:00",
|
||||||
|
lockAt: "08/21/2023 23:59:00",
|
||||||
|
submissionTypes: [],
|
||||||
|
localAssignmentGroupName: "Final Project",
|
||||||
|
rubric: [],
|
||||||
|
allowedFileUploadExtensions: [],
|
||||||
|
};
|
||||||
|
const oldSemesterStartDate = "08/26/2023 23:59:00";
|
||||||
|
const newSemesterStartDate = "01/08/2024 23:59:00";
|
||||||
|
|
||||||
|
const sanitizedAssignment = prepAssignmentForNewSemester(
|
||||||
|
assignment,
|
||||||
|
oldSemesterStartDate,
|
||||||
|
newSemesterStartDate
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(sanitizedAssignment.description).toEqual(`
|
||||||
|
<insert_github_classroom_url>
|
||||||
|
other stuff below`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("can sanitize assignment github classroom repo url 3", () => {
|
||||||
|
const assignment: LocalAssignment = {
|
||||||
|
name: "test assignment",
|
||||||
|
description: `https://classroom.github.com/a/y_eOxTfL other things`,
|
||||||
|
dueAt: "08/21/2023 23:59:00",
|
||||||
|
lockAt: "08/21/2023 23:59:00",
|
||||||
|
submissionTypes: [],
|
||||||
|
localAssignmentGroupName: "Final Project",
|
||||||
|
rubric: [],
|
||||||
|
allowedFileUploadExtensions: [],
|
||||||
|
};
|
||||||
|
const oldSemesterStartDate = "08/26/2023 23:59:00";
|
||||||
|
const newSemesterStartDate = "01/08/2024 23:59:00";
|
||||||
|
|
||||||
|
const sanitizedAssignment = prepAssignmentForNewSemester(
|
||||||
|
assignment,
|
||||||
|
oldSemesterStartDate,
|
||||||
|
newSemesterStartDate
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(sanitizedAssignment.description).toEqual(
|
||||||
|
`insert_github_classroom_url other things`
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("can offset date based on new semester start", () => {
|
||||||
|
it("assignment with new semester start", () => {
|
||||||
|
const assignment: LocalAssignment = {
|
||||||
|
name: "test assignment",
|
||||||
|
description: `https://classroom.github.com/a/y_eOxTfL other things`,
|
||||||
|
dueAt: "08/29/2023 23:59:00",
|
||||||
|
lockAt: "08/29/2023 23:59:00",
|
||||||
|
submissionTypes: [],
|
||||||
|
localAssignmentGroupName: "Final Project",
|
||||||
|
rubric: [],
|
||||||
|
allowedFileUploadExtensions: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
const oldSemesterStartDate = "08/26/2023 23:59:00";
|
||||||
|
const newSemesterStartDate = "01/08/2024 23:59:00";
|
||||||
|
|
||||||
|
const sanitizedAssignment = prepAssignmentForNewSemester(
|
||||||
|
assignment,
|
||||||
|
oldSemesterStartDate,
|
||||||
|
newSemesterStartDate
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(sanitizedAssignment.dueAt).toEqual("01/11/2024 23:59:00");
|
||||||
|
expect(sanitizedAssignment.lockAt).toEqual("01/11/2024 23:59:00");
|
||||||
|
});
|
||||||
|
it("assignment with new semester start, no lock date", () => {
|
||||||
|
const assignment: LocalAssignment = {
|
||||||
|
name: "test assignment",
|
||||||
|
description: `https://classroom.github.com/a/y_eOxTfL other things`,
|
||||||
|
dueAt: "08/29/2023 23:59:00",
|
||||||
|
lockAt: undefined,
|
||||||
|
submissionTypes: [],
|
||||||
|
localAssignmentGroupName: "Final Project",
|
||||||
|
rubric: [],
|
||||||
|
allowedFileUploadExtensions: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
const oldSemesterStartDate = "08/26/2023 23:59:00";
|
||||||
|
const newSemesterStartDate = "01/08/2024 23:59:00";
|
||||||
|
|
||||||
|
const sanitizedAssignment = prepAssignmentForNewSemester(
|
||||||
|
assignment,
|
||||||
|
oldSemesterStartDate,
|
||||||
|
newSemesterStartDate
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(sanitizedAssignment.dueAt).toEqual("01/11/2024 23:59:00");
|
||||||
|
expect(sanitizedAssignment.lockAt).toEqual(undefined);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("can prep quizzes", () => {
|
||||||
|
it("assignment with new semester start, no lock date", () => {
|
||||||
|
const quiz: LocalQuiz = {
|
||||||
|
name: "Test Quiz",
|
||||||
|
description: `
|
||||||
|
# quiz description
|
||||||
|
`,
|
||||||
|
dueAt: "08/29/2023 23:59:00",
|
||||||
|
lockAt: "08/30/2023 23:59:00",
|
||||||
|
shuffleAnswers: true,
|
||||||
|
oneQuestionAtATime: false,
|
||||||
|
localAssignmentGroupName: "someId",
|
||||||
|
allowedAttempts: -1,
|
||||||
|
showCorrectAnswers: false,
|
||||||
|
questions: [],
|
||||||
|
};
|
||||||
|
|
||||||
|
const oldSemesterStartDate = "08/26/2023 23:59:00";
|
||||||
|
const newSemesterStartDate = "01/08/2024 23:59:00";
|
||||||
|
|
||||||
|
const sanitizedQuiz = prepQuizForNewSemester(
|
||||||
|
quiz,
|
||||||
|
oldSemesterStartDate,
|
||||||
|
newSemesterStartDate
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(sanitizedQuiz.dueAt).toEqual("01/11/2024 23:59:00");
|
||||||
|
expect(sanitizedQuiz.lockAt).toEqual("01/12/2024 23:59:00");
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user