run script handles timezones

This commit is contained in:
2024-09-20 14:45:27 -06:00
parent 32b211c9b2
commit 06b116c24f
4 changed files with 79 additions and 27 deletions

View File

@@ -2,6 +2,7 @@
docker run -it --rm \ docker run -it --rm \
--name canvas-manager-2 \ --name canvas-manager-2 \
-e TZ=America/Denver \
-u 1000:1000 \ -u 1000:1000 \
-p 3000:3000 \ -p 3000:3000 \
-w /app \ -w /app \

View File

@@ -1,5 +1,6 @@
"use client"; "use client";
import { import {
dateToMarkdownString,
getDateFromStringOrThrow, getDateFromStringOrThrow,
getDateOnlyMarkdownString, getDateOnlyMarkdownString,
} from "@/models/local/timeUtils"; } from "@/models/local/timeUtils";
@@ -22,6 +23,7 @@ import { CanvasQuiz } from "@/models/canvas/quizzes/canvasQuizModel";
import { CanvasAssignment } from "@/models/canvas/assignments/canvasAssignment"; import { CanvasAssignment } from "@/models/canvas/assignments/canvasAssignment";
import { CanvasPage } from "@/models/canvas/pages/canvasPageModel"; import { CanvasPage } from "@/models/canvas/pages/canvasPageModel";
import { canvasService } from "@/services/canvas/canvasService"; import { canvasService } from "@/services/canvas/canvasService";
import { ReactNode } from "react";
export default function Day({ day, month }: { day: string; month: number }) { export default function Day({ day, month }: { day: string; month: number }) {
const dayAsDate = getDateFromStringOrThrow( const dayAsDate = getDateFromStringOrThrow(
@@ -57,31 +59,36 @@ export default function Day({ day, month }: { day: string; month: number }) {
<DropTargetStyling draggingClassName="bg-slate-900 shadow-[0_0px_10px_0px] shadow-blue-800/50 "> <DropTargetStyling draggingClassName="bg-slate-900 shadow-[0_0px_10px_0px] shadow-blue-800/50 ">
<DayTitle day={day} dayAsDate={dayAsDate} /> <DayTitle day={day} dayAsDate={dayAsDate} />
<div> <div>
{todaysAssignments.map(({ assignment, moduleName, status }) => ( {todaysAssignments.map(
<DraggableListItem ({ assignment, moduleName, status, message }) => (
key={assignment.name} <DraggableListItem
type={"assignment"} key={assignment.name}
moduleName={moduleName} type={"assignment"}
item={assignment} moduleName={moduleName}
status={status} item={assignment}
/> status={status}
))} message={message}
{todaysQuizzes.map(({ quiz, moduleName, status }) => ( />
)
)}
{todaysQuizzes.map(({ quiz, moduleName, status, message }) => (
<DraggableListItem <DraggableListItem
key={quiz.name} key={quiz.name}
type={"quiz"} type={"quiz"}
moduleName={moduleName} moduleName={moduleName}
item={quiz} item={quiz}
status={status} status={status}
message={message}
/> />
))} ))}
{todaysPages.map(({ page, moduleName, status }) => ( {todaysPages.map(({ page, moduleName, status, message }) => (
<DraggableListItem <DraggableListItem
key={page.name} key={page.name}
type={"page"} type={"page"}
moduleName={moduleName} moduleName={moduleName}
item={page} item={page}
status={status} status={status}
message={message}
/> />
))} ))}
</div> </div>
@@ -115,6 +122,7 @@ function useTodaysItems(day: string) {
moduleName: string; moduleName: string;
assignment: LocalAssignment; assignment: LocalAssignment;
status: "localOnly" | "incomplete" | "published"; status: "localOnly" | "incomplete" | "published";
message: ReactNode;
}[] = todaysModules }[] = todaysModules
? Object.keys(todaysModules).flatMap((moduleName) => ? Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].assignments.map((assignment) => { todaysModules[moduleName].assignments.map((assignment) => {
@@ -124,7 +132,7 @@ function useTodaysItems(day: string) {
return { return {
moduleName, moduleName,
assignment, assignment,
status: getStatus({ ...getStatus({
item: assignment, item: assignment,
canvasItem: canvasAssignment, canvasItem: canvasAssignment,
type: "assignment", type: "assignment",
@@ -138,6 +146,7 @@ function useTodaysItems(day: string) {
moduleName: string; moduleName: string;
quiz: LocalQuiz; quiz: LocalQuiz;
status: "localOnly" | "incomplete" | "published"; status: "localOnly" | "incomplete" | "published";
message: string;
}[] = todaysModules }[] = todaysModules
? Object.keys(todaysModules).flatMap((moduleName) => ? Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].quizzes.map((quiz) => { todaysModules[moduleName].quizzes.map((quiz) => {
@@ -150,6 +159,7 @@ function useTodaysItems(day: string) {
? "published" ? "published"
: "incomplete" : "incomplete"
: "localOnly", : "localOnly",
message: "",
}; };
}) })
) )
@@ -159,6 +169,7 @@ function useTodaysItems(day: string) {
moduleName: string; moduleName: string;
page: LocalCoursePage; page: LocalCoursePage;
status: "localOnly" | "incomplete" | "published"; status: "localOnly" | "incomplete" | "published";
message: string;
}[] = todaysModules }[] = todaysModules
? Object.keys(todaysModules).flatMap((moduleName) => ? Object.keys(todaysModules).flatMap((moduleName) =>
todaysModules[moduleName].pages.map((page) => { todaysModules[moduleName].pages.map((page) => {
@@ -171,6 +182,7 @@ function useTodaysItems(day: string) {
? "published" ? "published"
: "incomplete" : "incomplete"
: "localOnly", : "localOnly",
message: "",
}; };
}) })
) )
@@ -183,11 +195,13 @@ function DraggableListItem({
moduleName, moduleName,
status, status,
item, item,
message,
}: { }: {
type: "assignment" | "page" | "quiz"; type: "assignment" | "page" | "quiz";
status: "localOnly" | "incomplete" | "published"; status: "localOnly" | "incomplete" | "published";
moduleName: string; moduleName: string;
item: IModuleItem; item: IModuleItem;
message: ReactNode;
}) { }) {
const { courseName } = useCourseContext(); const { courseName } = useCourseContext();
const { dragStart } = useDraggingContext(); const { dragStart } = useDraggingContext();
@@ -196,6 +210,7 @@ function DraggableListItem({
href={getModuleItemUrl(courseName, moduleName, type, item.name)} href={getModuleItemUrl(courseName, moduleName, type, item.name)}
shallow={true} shallow={true}
className={ className={
" relative group " +
" border rounded-sm px-1 mx-1 break-words mb-1 " + " border rounded-sm px-1 mx-1 break-words mb-1 " +
" bg-slate-800 " + " bg-slate-800 " +
" block " + " block " +
@@ -216,6 +231,20 @@ function DraggableListItem({
}} }}
> >
{item.name} {item.name}
{status === "incomplete" && (
<div
className={
" absolute opacity-0 transition-all duration-700 " +
" group-hover:block group-hover:opacity-100" +
" bg-gray-800 text-white text-sm " +
" rounded py-1 px-2 bottom-full mb-2 left-1/2 transform -translate-x-1/2 " +
" whitespace-no-wrap min-w-full max-w-96 "
}
role="tooltip"
>
{message}
</div>
)}
</Link> </Link>
); );
} }
@@ -228,31 +257,51 @@ const getStatus = ({
item: LocalQuiz | LocalAssignment | LocalCoursePage; item: LocalQuiz | LocalAssignment | LocalCoursePage;
canvasItem?: CanvasQuiz | CanvasAssignment | CanvasPage; canvasItem?: CanvasQuiz | CanvasAssignment | CanvasPage;
type: "assignment" | "page" | "quiz"; type: "assignment" | "page" | "quiz";
}): "localOnly" | "incomplete" | "published" => { }): {
if (!canvasItem) return "localOnly"; status: "localOnly" | "incomplete" | "published";
message: ReactNode;
} => {
if (!canvasItem) return { status: "localOnly", message: "not in canvas" };
if (!canvasItem.published) return "incomplete"; if (!canvasItem.published)
return { status: "incomplete", message: "not published in canvas" };
if (type === "assignment") { if (type === "assignment") {
const assignment = item as LocalAssignment; const assignment = item as LocalAssignment;
const canvasAssignment = canvasItem as CanvasAssignment; const canvasAssignment = canvasItem as CanvasAssignment;
if (!canvasAssignment.due_at) return "incomplete";
if (assignment.lockAt && !canvasAssignment.lock_at) return "incomplete"; if(canvasAssignment.name === "Javascript 1")
console.log('js 1', canvasAssignment.due_at, canvasAssignment);
if (
getDateFromStringOrThrow( if (!canvasAssignment.due_at)
assignment.dueAt, return { status: "incomplete", message: "due date not in canvas" };
"comparing due dates for day"
).toISOString() !== if (assignment.lockAt && !canvasAssignment.lock_at)
return { status: "incomplete", message: "lock date not in canvas" };
const localDueDate = dateToMarkdownString(
getDateFromStringOrThrow(assignment.dueAt, "comparing due dates for day")
);
const canvasDueDate = dateToMarkdownString(
getDateFromStringOrThrow( getDateFromStringOrThrow(
canvasAssignment.due_at, canvasAssignment.due_at,
"comparing canvas due date for day" "comparing canvas due date for day"
).toISOString() )
) { );
return "incomplete"; if (localDueDate !== canvasDueDate) {
return {
status: "incomplete",
message: (
<div>
due date different
<div>{localDueDate}</div>
<div>{canvasDueDate}</div>
</div>
),
};
} }
} }
return "published"; return { status: "published", message: "" };
}; };

View File

@@ -64,3 +64,5 @@ export async function paginatedRequest<T extends any[]>(request: {
return returnData as T; return returnData as T;
} }

View File

@@ -16,7 +16,7 @@ const getCourseSettings = async (
const courseDirectory = path.join(basePath, courseName); const courseDirectory = path.join(basePath, courseName);
const settingsPath = path.join(courseDirectory, "settings.yml"); const settingsPath = path.join(courseDirectory, "settings.yml");
if (!(await directoryOrFileExists(settingsPath))) { if (!(await directoryOrFileExists(settingsPath))) {
const errorMessage = `Error loading settings for ${courseName}, settings file ${settingsPath}`; const errorMessage = `could not find settings for ${courseName}, settings file ${settingsPath}`;
console.log(errorMessage); console.log(errorMessage);
throw new Error(errorMessage); throw new Error(errorMessage);
} }