From 7b3e04fa7b9cdac8f9649e8b896d50084753f643 Mon Sep 17 00:00:00 2001 From: Cobel Date: Wed, 11 Mar 2026 00:43:29 +0900 Subject: [PATCH] Tutor completed On branch tutor Changes to be committed: modified: core/apps/assignment/models.py modified: core/apps/exam/models.py modified: core/apps/exam/tests/factories.py new file: core/apps/operation/migrations/0002_remove_appeal_insert_insert_and_more.py modified: core/apps/operation/models.py modified: core/apps/studio/tasks.py modified: core/apps/tutor/api/v1/__init__.py modified: core/apps/tutor/api/v1/assignment.py modified: core/apps/tutor/api/v1/exam.py modified: core/apps/tutor/decorator.py new file: core/apps/tutor/migrations/0002_alter_allocation_content_type_and_more.py modified: core/apps/tutor/models.py modified: core/uv.lock modified: web/package-lock.json modified: web/package.json modified: web/public/image/logo/logo.png modified: web/src/api/index.ts modified: web/src/api/sdk.gen.ts modified: web/src/api/types.gen.ts modified: web/src/api/valibot.gen.ts modified: web/src/routeTree.gen.ts modified: web/src/routes/(app)/-shared/AccountButton.tsx modified: web/src/routes/(app)/-shared/Notification.tsx modified: web/src/routes/(app)/assignment/-session/GradingReview.tsx modified: web/src/routes/(app)/dashboard/catalog.tsx modified: web/src/routes/(app)/discussion/-session/GradingReview.tsx modified: web/src/routes/(app)/route.tsx modified: web/src/routes/(auth)/route.tsx modified: web/src/routes/studio/index.tsx modified: web/src/routes/studio/route.tsx new file: web/src/routes/tutor/$app.$id.appeal.tsx new file: web/src/routes/tutor/-tutor/Breadcrumb.tsx renamed: web/src/routes/tutor/-context.tsx -> web/src/routes/tutor/-tutor/context.tsx modified: web/src/routes/tutor/assignment/$id.grading.tsx modified: web/src/routes/tutor/assignment/-assignment/GradingPaper.tsx modified: web/src/routes/tutor/assignment/-assignment/context.ts modified: web/src/routes/tutor/discussion/$id.grading.tsx modified: web/src/routes/tutor/discussion/-discussion/GradingPaper.tsx modified: web/src/routes/tutor/discussion/-discussion/context.ts modified: web/src/routes/tutor/exam/$id.grading.tsx modified: web/src/routes/tutor/exam/-exam/GradingPaper.tsx modified: web/src/routes/tutor/exam/-exam/context.ts modified: web/src/routes/tutor/index.tsx modified: web/src/routes/tutor/route.tsx modified: web/src/shared/NavbarLogo.tsx new file: web/src/shared/RefreshButton.tsx --- core/apps/assignment/models.py | 25 +- core/apps/exam/models.py | 1 + core/apps/exam/tests/factories.py | 3 +- ...02_remove_appeal_insert_insert_and_more.py | 57 +++++ core/apps/operation/models.py | 4 +- core/apps/studio/tasks.py | 3 + core/apps/tutor/api/v1/__init__.py | 39 ++- core/apps/tutor/api/v1/assignment.py | 4 +- core/apps/tutor/api/v1/exam.py | 33 +-- core/apps/tutor/decorator.py | 2 +- ..._alter_allocation_content_type_and_more.py | 25 ++ core/apps/tutor/models.py | 114 ++++++++- core/uv.lock | 122 ++++----- web/package-lock.json | 122 ++++----- web/package.json | 10 +- web/public/image/logo/logo.png | Bin 5951 -> 11840 bytes web/src/api/index.ts | 4 +- web/src/api/sdk.gen.ts | 23 +- web/src/api/types.gen.ts | 138 ++++++++++- web/src/api/valibot.gen.ts | 70 +++++- web/src/routeTree.gen.ts | 21 ++ .../routes/(app)/-shared/AccountButton.tsx | 22 +- web/src/routes/(app)/-shared/Notification.tsx | 7 +- .../assignment/-session/GradingReview.tsx | 2 +- web/src/routes/(app)/dashboard/catalog.tsx | 7 +- .../discussion/-session/GradingReview.tsx | 2 +- web/src/routes/(app)/route.tsx | 5 +- web/src/routes/(auth)/route.tsx | 8 +- web/src/routes/studio/index.tsx | 12 +- web/src/routes/studio/route.tsx | 5 +- web/src/routes/tutor/$app.$id.appeal.tsx | 212 ++++++++++++++++ web/src/routes/tutor/-tutor/Breadcrumb.tsx | 39 +++ .../{-context.tsx => -tutor/context.tsx} | 0 .../routes/tutor/assignment/$id.grading.tsx | 25 +- .../assignment/-assignment/GradingPaper.tsx | 210 ++++++++-------- .../tutor/assignment/-assignment/context.ts | 4 +- .../routes/tutor/discussion/$id.grading.tsx | 25 +- .../discussion/-discussion/GradingPaper.tsx | 231 +++++++++--------- .../tutor/discussion/-discussion/context.ts | 4 +- web/src/routes/tutor/exam/$id.grading.tsx | 25 +- .../routes/tutor/exam/-exam/GradingPaper.tsx | 183 +++++++------- web/src/routes/tutor/exam/-exam/context.ts | 4 +- web/src/routes/tutor/index.tsx | 69 +++--- web/src/routes/tutor/route.tsx | 7 +- web/src/shared/NavbarLogo.tsx | 15 +- web/src/shared/RefreshButton.tsx | 20 ++ 46 files changed, 1363 insertions(+), 600 deletions(-) create mode 100644 core/apps/operation/migrations/0002_remove_appeal_insert_insert_and_more.py create mode 100644 core/apps/tutor/migrations/0002_alter_allocation_content_type_and_more.py create mode 100644 web/src/routes/tutor/$app.$id.appeal.tsx create mode 100644 web/src/routes/tutor/-tutor/Breadcrumb.tsx rename web/src/routes/tutor/{-context.tsx => -tutor/context.tsx} (100%) create mode 100644 web/src/shared/RefreshButton.tsx diff --git a/core/apps/assignment/models.py b/core/apps/assignment/models.py index 2462a08..cb90f94 100644 --- a/core/apps/assignment/models.py +++ b/core/apps/assignment/models.py @@ -151,9 +151,14 @@ def rubric_data(self, data: RubricDataDict): @classmethod async def get_session(cls, *, assignment_id: str, learner_id: str, context: str, access_date: AccessDate): - assignment = await Assignment.objects.select_related("owner", "honor_code", "question_pool").aget( - id=assignment_id + assignment = ( + await Assignment.objects + .select_related("owner", "honor_code", "question_pool") + .prefetch_related("rubric__rubric_criteria__performance_levels") + .aget(id=assignment_id) ) + assignment.rubric_data = await assignment.get_rubric_data() + session = SessionDict( access_date=access_date, grading_date=assignment.get_grading_date(access_date), @@ -178,14 +183,6 @@ async def get_session(cls, *, assignment_id: str, learner_id: str, context: str, ) return session - await aprefetch_related_objects( - [assignment], - Prefetch( - "rubric__rubric_criteria__performance_levels", queryset=PerformanceLevel.objects.order_by("point") - ), - ) - assignment.rubric_data = await assignment.get_rubric_data() - session["attempt"] = attempt if not hasattr(attempt, "submission"): @@ -298,14 +295,6 @@ async def start(cls, *, assignment_id: str, learner_id: str, lock: datetime, con if not await OtpLog.check_otp_verification(user_id=learner_id, consumer=assignment): raise ValueError(ErrorCode.OTP_VERIFICATION_REQUIRED) - await aprefetch_related_objects( - [assignment], - Prefetch( - "rubric__rubric_criteria__performance_levels", queryset=PerformanceLevel.objects.order_by("point") - ), - ) - assignment.rubric_data = await assignment.get_rubric_data() - question = await QuestionPool(id=assignment.question_pool_id).select_question() await aprefetch_related_objects([question], "attachments") diff --git a/core/apps/exam/models.py b/core/apps/exam/models.py index 57b8796..badf8ce 100644 --- a/core/apps/exam/models.py +++ b/core/apps/exam/models.py @@ -418,6 +418,7 @@ class Meta(GradeFieldMixin.Meta, TimeStampedMixin.Meta): attempt_id: int analysis: dict[str, dict[str, int]] grading_date: GradingDate + question_ids: list[int] async def grade(self, earned_existing: dict[str, int | None] | None = None, grader_id: str | None = None): questions = [q async for q in self.attempt.questions.all()] diff --git a/core/apps/exam/tests/factories.py b/core/apps/exam/tests/factories.py index 83b68f7..db2bfa9 100644 --- a/core/apps/exam/tests/factories.py +++ b/core/apps/exam/tests/factories.py @@ -32,8 +32,7 @@ class Meta: @lazy_attribute def composition(self): option = generic.random.choice([(20, 3, 0, 1), (20, 5, 0, 1), (25, 0, 0, 1), (15, 5, 5, 1), (20, 0, 3, 1)]) - composed = {"single_choice": option[0], "text_input": option[1], "number_input": option[2], "essay": option[3]} - return {k: v for k, v in composed.items() if v != 0} + return {"single_choice": option[0], "text_input": option[1], "number_input": option[2], "essay": option[3]} @post_generation def post_generation(self: QuestionPool, create: bool, extracted: object, **kwargs: object): diff --git a/core/apps/operation/migrations/0002_remove_appeal_insert_insert_and_more.py b/core/apps/operation/migrations/0002_remove_appeal_insert_insert_and_more.py new file mode 100644 index 0000000..eb19c75 --- /dev/null +++ b/core/apps/operation/migrations/0002_remove_appeal_insert_insert_and_more.py @@ -0,0 +1,57 @@ +# Generated by Django 6.0.3 on 2026-03-10 12:55 + +import django.db.models.deletion +import pgtrigger.compiler +import pgtrigger.migrations +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('operation', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + pgtrigger.migrations.RemoveTrigger( + model_name='appeal', + name='insert_insert', + ), + pgtrigger.migrations.RemoveTrigger( + model_name='appeal', + name='update_update', + ), + pgtrigger.migrations.RemoveTrigger( + model_name='appeal', + name='delete_delete', + ), + migrations.AddField( + model_name='appeal', + name='reviewer', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Reviewer'), + ), + migrations.AddField( + model_name='appealevent', + name='reviewer', + field=models.ForeignKey(db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', related_query_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Reviewer'), + ), + migrations.AlterField( + model_name='appeal', + name='path', + field=models.CharField(blank=True, db_index=True, default='', max_length=500, verbose_name='Path'), + ), + pgtrigger.migrations.AddTrigger( + model_name='appeal', + trigger=pgtrigger.compiler.Trigger(name='insert_insert', sql=pgtrigger.compiler.UpsertTriggerSql(func='INSERT INTO "operation_appealevent" ("created", "explanation", "id", "learner_id", "modified", "path", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "question_id", "question_type_id", "review", "reviewer_id") VALUES (NEW."created", NEW."explanation", NEW."id", NEW."learner_id", NEW."modified", NEW."path", _pgh_attach_context(), NOW(), \'insert\', NEW."id", NEW."question_id", NEW."question_type_id", NEW."review", NEW."reviewer_id"); RETURN NULL;', hash='a0f2a97c3d500389c6ae51a89ab359fed2f11e25', operation='INSERT', pgid='pgtrigger_insert_insert_c7b97', table='operation_appeal', when='AFTER')), + ), + pgtrigger.migrations.AddTrigger( + model_name='appeal', + trigger=pgtrigger.compiler.Trigger(name='update_update', sql=pgtrigger.compiler.UpsertTriggerSql(condition='WHEN (OLD."explanation" IS DISTINCT FROM (NEW."explanation") OR OLD."id" IS DISTINCT FROM (NEW."id") OR OLD."learner_id" IS DISTINCT FROM (NEW."learner_id") OR OLD."path" IS DISTINCT FROM (NEW."path") OR OLD."question_id" IS DISTINCT FROM (NEW."question_id") OR OLD."question_type_id" IS DISTINCT FROM (NEW."question_type_id") OR OLD."review" IS DISTINCT FROM (NEW."review") OR OLD."reviewer_id" IS DISTINCT FROM (NEW."reviewer_id"))', func='INSERT INTO "operation_appealevent" ("created", "explanation", "id", "learner_id", "modified", "path", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "question_id", "question_type_id", "review", "reviewer_id") VALUES (NEW."created", NEW."explanation", NEW."id", NEW."learner_id", NEW."modified", NEW."path", _pgh_attach_context(), NOW(), \'update\', NEW."id", NEW."question_id", NEW."question_type_id", NEW."review", NEW."reviewer_id"); RETURN NULL;', hash='0f827690772392e91649050a0376729b1b0ad8bb', operation='UPDATE', pgid='pgtrigger_update_update_3fe73', table='operation_appeal', when='AFTER')), + ), + pgtrigger.migrations.AddTrigger( + model_name='appeal', + trigger=pgtrigger.compiler.Trigger(name='delete_delete', sql=pgtrigger.compiler.UpsertTriggerSql(func='INSERT INTO "operation_appealevent" ("created", "explanation", "id", "learner_id", "modified", "path", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "question_id", "question_type_id", "review", "reviewer_id") VALUES (OLD."created", OLD."explanation", OLD."id", OLD."learner_id", OLD."modified", OLD."path", _pgh_attach_context(), NOW(), \'delete\', OLD."id", OLD."question_id", OLD."question_type_id", OLD."review", OLD."reviewer_id"); RETURN NULL;', hash='e9c2459d59c132d165ef47959f8145e3bee0b847', operation='DELETE', pgid='pgtrigger_delete_delete_1853c', table='operation_appeal', when='AFTER')), + ), + ] diff --git a/core/apps/operation/models.py b/core/apps/operation/models.py index c3bcc28..e31e9e1 100644 --- a/core/apps/operation/models.py +++ b/core/apps/operation/models.py @@ -478,7 +478,8 @@ class Appeal(TimeStampedMixin, AttachmentMixin): learner = ForeignKey(User, CASCADE, verbose_name=_("Learner"), related_name="+") explanation = TextField(_("Explanation")) review = TextField(_("Review"), blank=True, default="") - path = CharField(_("Path"), max_length=500, default="", blank=True) + reviewer = ForeignKey(User, CASCADE, verbose_name=_("Reviewer"), null=True, related_name="+") + path = CharField(_("Path"), max_length=500, default="", blank=True, db_index=True) limit_choices_to = {"model__in": ["question"]} question_type = ForeignKey(ContentType, CASCADE, verbose_name=_("Question Type"), limit_choices_to=limit_choices_to) @@ -497,6 +498,7 @@ class Meta(TimeStampedMixin.Meta, AttachmentMixin.Meta): if TYPE_CHECKING: learner_id: str + reviewer_id: str @property def cleaned_explanation(self): diff --git a/core/apps/studio/tasks.py b/core/apps/studio/tasks.py index e69fc10..8d0cf01 100644 --- a/core/apps/studio/tasks.py +++ b/core/apps/studio/tasks.py @@ -7,6 +7,7 @@ from apps.course.models import Engagement as CourseEngagement from apps.discussion.models import Attempt as DiscussionAttempt from apps.exam.models import Attempt as ExamAttempt +from apps.operation.models import Appeal from apps.quiz.models import Attempt as QuizAttempt from apps.survey.models import Submission as SurveySubmission @@ -32,4 +33,6 @@ def cleanup_preview_data(): num, model_num = M.objects.filter(mode="preview", started__lte=threshold).delete() deleted[M._meta.model_name] = num, model_num + Appeal.objects.filter(started__lte=threshold, path__contains="mode=preview").delete() + return deleted diff --git a/core/apps/tutor/api/v1/__init__.py b/core/apps/tutor/api/v1/__init__.py index d0a2974..bd66fdb 100644 --- a/core/apps/tutor/api/v1/__init__.py +++ b/core/apps/tutor/api/v1/__init__.py @@ -2,11 +2,12 @@ from typing import Annotated, Literal from django.conf import settings -from ninja import Router +from ninja import Field, Router from ninja.params import functions from apps.common.schema import ContentTypeSchema, Schema from apps.common.util import HttpRequest, PaginatedResponse +from apps.operation.api.schema import AppealSchema from apps.tutor.api.v1.assignment import router as assignment_router from apps.tutor.api.v1.discussion import router as discussion_router from apps.tutor.api.v1.exam import router as exam_router @@ -16,9 +17,6 @@ router = Router(by_alias=True) -TutoringModel = Literal["exam", "assignment", "discussion"] - - class AllocationSchema(Schema): class TutorContentSchema(Schema): id: str @@ -65,6 +63,39 @@ async def get_allocation_stats(request: HttpRequest): return await Allocation.get_stats(tutor_id=request.auth) +AppealAppLabel = Literal["exam", "assignment", "discussion"] +AppealModel = Literal["exam", "assignment", "discussion"] + + +class GradeAppealSchema(AppealSchema): + grade_id: int + + +@router.get("/{app_label}/{model}/{id}/appeal", response=PaginatedResponse[GradeAppealSchema]) +@tutor_required() +async def get_appeals( + request: HttpRequest, + app_label: AppealAppLabel, + model: AppealModel, + id: str, + page: Annotated[int, functions.Query(1, ge=1)], + size: Annotated[int, functions.Query(settings.DEFAULT_PAGINATION_SIZE, gte=1, le=100)], +): + return await Allocation.get_appeals( + tutor_id=request.auth, app_label=app_label, model=model, content_id=id, page=page, size=size + ) + + +class AppealReviewSchema(Schema): + review: Annotated[str, Field(min_length=1)] + + +@router.post("/appeal/{id}") +@tutor_required() +async def review_appeal(request: HttpRequest, id: int, review: AppealReviewSchema): + await Allocation.review_appeal(tutor_id=request.auth, appeal_id=id, review=review.review, reviewer_id=request.auth) + + router.add_router("", exam_router, tags=["tutor"]) router.add_router("", assignment_router, tags=["tutor"]) router.add_router("", discussion_router, tags=["tutor"]) diff --git a/core/apps/tutor/api/v1/assignment.py b/core/apps/tutor/api/v1/assignment.py index c2b7e03..aa8a35d 100644 --- a/core/apps/tutor/api/v1/assignment.py +++ b/core/apps/tutor/api/v1/assignment.py @@ -52,7 +52,7 @@ def resolve_question(grade: Grade): @staticmethod def resolve_answer(grade: Grade): - return grade.attempt.submission.answer + return grade.attempt.submission.cleaned_answer @router.get("/assignment/{id}/grade/{grade_id}", response=TutorAssignmentGradePaperSchema) @@ -61,7 +61,7 @@ def resolve_answer(grade: Grade): async def get_assignment_grade_paper(request: HttpRequest, id: str, grade_id: int): grade = await aget_object_or_404( Grade.objects.select_related("attempt__submission", "attempt__question", "grader").prefetch_related( - "attempt__question__attachments" + "attempt__question__attachments", "attempt__submission__attachments" ), id=grade_id, attempt__assignment_id=id, diff --git a/core/apps/tutor/api/v1/exam.py b/core/apps/tutor/api/v1/exam.py index e74ec47..4853e41 100644 --- a/core/apps/tutor/api/v1/exam.py +++ b/core/apps/tutor/api/v1/exam.py @@ -2,6 +2,7 @@ from django.shortcuts import aget_object_or_404 from ninja import Router from ninja.pagination import paginate +from ninja.params import functions from apps.account.api.schema import OwnerSchema from apps.common.schema import Schema @@ -48,13 +49,15 @@ class TutorExamQuestionSchema(ExamQuestionSchema): @staticmethod def resolve_answers(grade: Grade): - question_ids = [q.id for q in grade.attempt.questions.all()] - return {k: v for k, v in grade.attempt.submission.answers.items() if int(k) in question_ids} + return {k: v for k, v in grade.attempt.submission.answers.items() if int(k) in grade.question_ids} @staticmethod def resolve_earned_details(grade: Grade): - question_ids = [q.id for q in grade.attempt.questions.all()] - return {k: v for k, v in grade.earned_details.items() if int(k) in question_ids} + return {k: v for k, v in grade.earned_details.items() if int(k) in grade.question_ids} + + @staticmethod + def resolve_feedback(grade: Grade): + return {k: v for k, v in grade.feedback.items() if int(k) in grade.question_ids} @staticmethod def resolve_questions(grade: Grade): @@ -64,7 +67,16 @@ def resolve_questions(grade: Grade): @router.get("/exam/{id}/grade/{grade_id}", response=TutorExamGradePaperSchema) @tutor_required() @allocation_required("exam", "exam") -async def get_exam_grade_paper(request: HttpRequest, id: str, grade_id: int): +async def get_exam_grade_paper( + request: HttpRequest, id: str, grade_id: int, question_id: int | None = functions.Query(None, alias="questionId") +): + if question_id: + q = Q(id=question_id) + else: + q = Q(solution__correct_answers=[]) | Q( + format__in=[Question.ExamQuestionFormatChoices.ESSAY, Question.ExamQuestionFormatChoices.TEXT_INPUT] + ) + grade = await aget_object_or_404( Grade.objects.select_related("attempt__submission", "grader").prefetch_related( Prefetch( @@ -72,15 +84,7 @@ async def get_exam_grade_paper(request: HttpRequest, id: str, grade_id: int): queryset=Question.objects .select_related("solution") .prefetch_related("attachments") - .filter( - Q(solution__correct_answers=[]) - | Q( - format__in=[ - Question.ExamQuestionFormatChoices.ESSAY, - Question.ExamQuestionFormatChoices.TEXT_INPUT, - ] - ) - ) + .filter(q) .order_by("id"), ) ), @@ -89,6 +93,7 @@ async def get_exam_grade_paper(request: HttpRequest, id: str, grade_id: int): attempt__active=True, ) grade.analysis = await Exam().analyze_answers([q.id for q in grade.attempt.questions.all()]) + grade.question_ids = [q.id for q in grade.attempt.questions.all()] return grade diff --git a/core/apps/tutor/decorator.py b/core/apps/tutor/decorator.py index d4ba2df..cbf12a5 100644 --- a/core/apps/tutor/decorator.py +++ b/core/apps/tutor/decorator.py @@ -28,7 +28,7 @@ async def wrapper(request: HttpRequest, *args, **kwargs): content_type = await sync_to_async(ContentType.objects.get_by_natural_key)(app_label, model) allocated = await Allocation.objects.filter( - tutor_id=request.auth, content_type=content_type, content_id=kwargs[id_field] + tutor_id=request.auth, active=True, content_type=content_type, content_id=kwargs[id_field] ).aexists() if not allocated: diff --git a/core/apps/tutor/migrations/0002_alter_allocation_content_type_and_more.py b/core/apps/tutor/migrations/0002_alter_allocation_content_type_and_more.py new file mode 100644 index 0000000..dd6308b --- /dev/null +++ b/core/apps/tutor/migrations/0002_alter_allocation_content_type_and_more.py @@ -0,0 +1,25 @@ +# Generated by Django 6.0.3 on 2026-03-10 12:55 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('tutor', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='allocation', + name='content_type', + field=models.ForeignKey(limit_choices_to={'model__in': ('exam', 'assignment', 'discussion')}, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype', verbose_name='Content type'), + ), + migrations.AlterField( + model_name='allocationevent', + name='content_type', + field=models.ForeignKey(db_constraint=False, limit_choices_to={'model__in': ('exam', 'assignment', 'discussion')}, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', related_query_name='+', to='contenttypes.contenttype', verbose_name='Content type'), + ), + ] diff --git a/core/apps/tutor/models.py b/core/apps/tutor/models.py index 6243b77..ef9b59e 100644 --- a/core/apps/tutor/models.py +++ b/core/apps/tutor/models.py @@ -15,6 +15,7 @@ from apps.assignment.models import Assignment from apps.assignment.models import Attempt as AssignmentAttempt from apps.assignment.models import Grade as AssignmentGrade +from apps.common.error import ErrorCode from apps.common.models import TimeStampedMixin from apps.common.util import offset_paginate from apps.discussion.models import Attempt as DiscussionAttempt @@ -31,6 +32,9 @@ TUTORING_MODELS = {"exam": Exam, "assignment": Assignment, "discussion": Discussion} TUTORING_MODEL_MAP = {(m._meta.app_label.lower(), m._meta.model_name): m for m in TUTORING_MODELS.values()} +ATTEMPT_MODELS = {"exam": ExamAttempt, "assignment": AssignmentAttempt, "discussion": DiscussionAttempt} +GRADING_MODELS = {"exam": ExamGrade, "assignment": AssignmentGrade, "discussion": DiscussionGrade} + @pghistory.track() class Allocation(TimeStampedMixin): @@ -111,6 +115,100 @@ async def get_stats(cls, *, tutor_id: str) -> dict: return {"allocation_count": allocation_count, **grade_stats, **appeal_stats} + @classmethod + async def get_appeals(cls, *, tutor_id: str, app_label: str, model: str, content_id: str, page: int, size: int): + content_type = await sync_to_async(ContentType.objects.get_by_natural_key)(app_label, model) + allocated = await cls.objects.filter( + tutor_id=tutor_id, active=True, content_type=content_type, content_id=content_id + ).aexists() + if not allocated: + raise ValueError(ErrorCode.PERMISSION_DENIED) + + question_type = await sync_to_async(ContentType.objects.get_by_natural_key)(app_label, "question") + + if app_label == "exam": + question_ids = ExamAttempt.objects.filter(exam_id=content_id).values("questions").distinct() + elif app_label == "assignment": + question_ids = AssignmentAttempt.objects.filter(assignment_id=content_id).values("question_id").distinct() + elif app_label == "discussion": + question_ids = DiscussionAttempt.objects.filter(discussion_id=content_id).values("question_id").distinct() + else: + raise ValueError(ErrorCode.UNKNOWN_CONTENT) + + qs = ( + Appeal.objects + .filter(question_type=question_type, question_id__in=question_ids) + .select_related("learner") + .prefetch_related("attachments") + .order_by("-created") + ) + + paginated = await offset_paginate(qs, page=page, size=size) + if not paginated["items"]: + return paginated + + items = paginated["items"] + question_id_list = [a.question_id for a in items] + learner_id_list = [a.learner_id for a in items] + + if app_label == "exam": + grade_qs = ( + ExamGrade.objects + .select_related("attempt") + .prefetch_related("attempt__questions") + .filter( + attempt__questions__id__in=question_id_list, + attempt__learner_id__in=learner_id_list, + attempt__active=True, + ) + ) + grade_map = {(q.id, g.attempt.learner_id): g.id async for g in grade_qs for q in g.attempt.questions.all()} + + elif app_label == "assignment": + grade_qs = AssignmentGrade.objects.select_related("attempt").filter( + attempt__question_id__in=question_id_list, attempt__learner_id__in=learner_id_list, attempt__active=True + ) + grade_map = {(g.attempt.question_id, g.attempt.learner_id): g.id async for g in grade_qs} + + elif app_label == "discussion": + grade_qs = DiscussionGrade.objects.select_related("attempt").filter( + attempt__question_id__in=question_id_list, attempt__learner_id__in=learner_id_list, attempt__active=True + ) + grade_map = {(g.attempt.question_id, g.attempt.learner_id): g.id async for g in grade_qs} + else: + raise ValueError(ErrorCode.UNKNOWN_CONTENT) + + for appeal in items: + appeal.grade_id = grade_map.get((appeal.question_id, appeal.learner_id)) + + return paginated + + @classmethod + async def review_appeal(cls, *, tutor_id: str, appeal_id: int, review: str, reviewer_id: str): + appeal = await Appeal.objects.select_related("question_type").aget(id=appeal_id) + + app_label = appeal.question_type.app_label + if app_label == "exam": + content_id_qs = ExamAttempt.objects.filter(questions__id=appeal.question_id).values("exam_id") + elif app_label == "assignment": + content_id_qs = AssignmentAttempt.objects.filter(question_id=appeal.question_id).values("assignment_id") + elif app_label == "discussion": + content_id_qs = DiscussionAttempt.objects.filter(question_id=appeal.question_id).values("discussion_id") + else: + raise ValueError(ErrorCode.UNKNOWN_CONTENT) + + allocated = await Allocation.objects.filter( + tutor_id=tutor_id, active=True, content_type__app_label=app_label, content_id__in=content_id_qs + ).aexists() + + if not allocated: + raise ValueError(ErrorCode.PERMISSION_DENIED) + + appeal.review = review + appeal.reviewer_id = reviewer_id + + await appeal.asave(update_fields=["review"]) + async def _fetch_allocatable_contents(content_ids_by_type: dict): union_qs = [] @@ -176,18 +274,22 @@ async def _fetch_appeal_counts(content_ids_by_type: dict[tuple[str, str], set[st discussion_ids = list(content_ids_by_type.get(("discussion", "discussion"), set())) sql = f""" - SELECT ea.exam_id AS content_id, op.review + SELECT DISTINCT ON (op.id) ea.exam_id AS content_id, op.review FROM {appeal_table} op JOIN {exam_m2m_table} aq ON aq.question_id = op.question_id JOIN {exam_attempt_table} ea ON ea.id = aq.attempt_id AND ea.active = TRUE WHERE op.question_type_id = %s AND ea.exam_id = ANY(%s) + UNION ALL - SELECT ea.assignment_id AS content_id, op.review + + SELECT DISTINCT ON (op.id) ea.assignment_id AS content_id, op.review FROM {appeal_table} op JOIN {assignment_attempt_table} ea ON ea.question_id = op.question_id AND ea.active = TRUE WHERE op.question_type_id = %s AND ea.assignment_id = ANY(%s) + UNION ALL - SELECT ea.discussion_id AS content_id, op.review + + SELECT DISTINCT ON (op.id) ea.discussion_id AS content_id, op.review FROM {appeal_table} op JOIN {discussion_attempt_table} ea ON ea.question_id = op.question_id AND ea.active = TRUE WHERE op.question_type_id = %s AND ea.discussion_id = ANY(%s) @@ -304,7 +406,7 @@ async def _fetch_appeal_stats(exam_ids: list, assignment_ids: list, discussion_i COUNT(*) AS appeal_count, COUNT(*) FILTER (WHERE review = '') AS appeal_open_count FROM ( - SELECT op.review + SELECT DISTINCT ON (op.id) op.review FROM {appeal_table} op JOIN {exam_m2m_table} aq ON aq.question_id = op.question_id JOIN {exam_attempt_table} ea ON ea.id = aq.attempt_id AND ea.active = TRUE @@ -312,14 +414,14 @@ async def _fetch_appeal_stats(exam_ids: list, assignment_ids: list, discussion_i UNION ALL - SELECT op.review + SELECT DISTINCT ON (op.id) op.review FROM {appeal_table} op JOIN {assignment_attempt_table} aa ON aa.question_id = op.question_id AND aa.active = TRUE WHERE op.question_type_id = %s AND aa.assignment_id = ANY(%s) UNION ALL - SELECT op.review + SELECT DISTINCT ON (op.id) op.review FROM {appeal_table} op JOIN {discussion_attempt_table} da ON da.question_id = op.question_id AND da.active = TRUE WHERE op.question_type_id = %s AND da.discussion_id = ANY(%s) diff --git a/core/uv.lock b/core/uv.lock index ef9791e..aab3fad 100644 --- a/core/uv.lock +++ b/core/uv.lock @@ -140,29 +140,29 @@ wheels = [ [[package]] name = "boto3" -version = "1.42.63" +version = "1.42.64" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore" }, { name = "jmespath" }, { name = "s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/7f/2a/33d5d4b16fd97dfd629421ebed2456392eae1553cc401d9f86010c18065e/boto3-1.42.63.tar.gz", hash = "sha256:cd008cfd0d7ea30f1c5e22daf0998c55b7c6c68cb68eea05110e33fe641173d5", size = 112778, upload-time = "2026-03-06T22:47:55.96Z" } +sdist = { url = "https://files.pythonhosted.org/packages/27/3e/3f5f58100340f6576aa93da0fe46cabd91ea19baa746b80bd1d46498b0db/boto3-1.42.64.tar.gz", hash = "sha256:58d47897a26adbc22f6390d133dab772fb606ba72695291a8c9e20cba1c7fd23", size = 112773, upload-time = "2026-03-09T19:52:00.407Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/19/f1d8d2b24871d3d0ccb2cbd0b0cb64a3396d439384bd9643d2c25c641b84/boto3-1.42.63-py3-none-any.whl", hash = "sha256:d502a89a0acc701692ae020d15981f2a82e9eb3485acc651cfd0cf1a3afe79ee", size = 140554, upload-time = "2026-03-06T22:47:53.463Z" }, + { url = "https://files.pythonhosted.org/packages/4c/87/2f02a6db0828f4579aedef7e34ec15262e4aa402d31f31bdbc64ae8e471b/boto3-1.42.64-py3-none-any.whl", hash = "sha256:2ca6b472937a54ba74af0b4bede582ba98c070408db1061fc26d5c3aa8e6e7e6", size = 140557, upload-time = "2026-03-09T19:51:57.652Z" }, ] [[package]] name = "boto3-stubs" -version = "1.42.63" +version = "1.42.64" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "botocore-stubs" }, { name = "types-s3transfer" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/30/45d21d3df4598b6b37d8de9923603010e490dfc73a130c8ffa806750b1ff/boto3_stubs-1.42.63.tar.gz", hash = "sha256:b64726c86c0b3efbc6ccd4f0510fa5a8279caec46da36a91c037a4b395001e68", size = 101176, upload-time = "2026-03-06T22:50:00.514Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/13/1b2bac461abd9259372b7a3d75882e0488c76c2b86178b5e3746d6af4ac2/boto3_stubs-1.42.64.tar.gz", hash = "sha256:f184e7108b6b6220dd55d082159de0b0630972552eeb951b87cfdac0f0235823", size = 101195, upload-time = "2026-03-09T19:53:18.696Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/c2/933ecf99d0cc1ae1b463086d203b27a29ba05c1d1cdd8a3efb18bc1e8c98/boto3_stubs-1.42.63-py3-none-any.whl", hash = "sha256:132e9c57bfef5ea943745d6cdad16e62d4e82dca64f6ae9ddfba9789fcdc8378", size = 69913, upload-time = "2026-03-06T22:49:49.765Z" }, + { url = "https://files.pythonhosted.org/packages/70/66/9e884e323b670297500dcf90be9561ecc4e2a5498a5a773af0e4d0a14282/boto3_stubs-1.42.64-py3-none-any.whl", hash = "sha256:54e849fc3ae8ad73e049c304a425b3335ee81801bd00f80d9d1e3ae8d6ba5e17", size = 69914, upload-time = "2026-03-09T19:53:12.108Z" }, ] [package.optional-dependencies] @@ -172,16 +172,16 @@ s3 = [ [[package]] name = "botocore" -version = "1.42.63" +version = "1.42.64" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jmespath" }, { name = "python-dateutil" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/af/eb/a1c042f6638ada552399a9977335a6de2668a85bf80bece193c953531236/botocore-1.42.63.tar.gz", hash = "sha256:1fdfc33cff58d21e8622cf620ba2bba3cff324557932aaf935b5374e4610f059", size = 14965362, upload-time = "2026-03-06T22:47:44.158Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/3c/ac4bc939da695d2c648bf28f7b204ab741e4504e81749ccf943403cc07ca/botocore-1.42.64.tar.gz", hash = "sha256:4ee2aece227b9171ace8b749af694a77ab984fceab1639f2626bd0d6fb1aa69d", size = 14967869, upload-time = "2026-03-09T19:51:46.213Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/60/17a2d3b94658bb999c6aee7bba6c76b271905debf0c8c8e6ac63ca8491bc/botocore-1.42.63-py3-none-any.whl", hash = "sha256:83f39d04f2b316bdfc59a3cac2d12238bde7126ac99d9a57d910dbd86d58c528", size = 14639889, upload-time = "2026-03-06T22:47:39.347Z" }, + { url = "https://files.pythonhosted.org/packages/33/0f/a0feb9a93da8f583217432dce71ce1940d6d8aa5884bad340872a504ba3f/botocore-1.42.64-py3-none-any.whl", hash = "sha256:f77c5cb76ed30576ed0bc73b591265d03dddffff02a9208d3ee0c790f43d3cd2", size = 14641339, upload-time = "2026-03-09T19:51:41.244Z" }, ] [[package]] @@ -821,27 +821,27 @@ wheels = [ [[package]] name = "fonttools" -version = "4.61.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ec/ca/cf17b88a8df95691275a3d77dc0a5ad9907f328ae53acbe6795da1b2f5ed/fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69", size = 3565756, upload-time = "2025-12-12T17:31:24.246Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/32/8f/4e7bf82c0cbb738d3c2206c920ca34ca74ef9dabde779030145d28665104/fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd", size = 2846094, upload-time = "2025-12-12T17:30:43.511Z" }, - { url = "https://files.pythonhosted.org/packages/71/09/d44e45d0a4f3a651f23a1e9d42de43bc643cce2971b19e784cc67d823676/fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e", size = 2396589, upload-time = "2025-12-12T17:30:45.681Z" }, - { url = "https://files.pythonhosted.org/packages/89/18/58c64cafcf8eb677a99ef593121f719e6dcbdb7d1c594ae5a10d4997ca8a/fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c", size = 4877892, upload-time = "2025-12-12T17:30:47.709Z" }, - { url = "https://files.pythonhosted.org/packages/8a/ec/9e6b38c7ba1e09eb51db849d5450f4c05b7e78481f662c3b79dbde6f3d04/fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75", size = 4972884, upload-time = "2025-12-12T17:30:49.656Z" }, - { url = "https://files.pythonhosted.org/packages/5e/87/b5339da8e0256734ba0dbbf5b6cdebb1dd79b01dc8c270989b7bcd465541/fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063", size = 4924405, upload-time = "2025-12-12T17:30:51.735Z" }, - { url = "https://files.pythonhosted.org/packages/0b/47/e3409f1e1e69c073a3a6fd8cb886eb18c0bae0ee13db2c8d5e7f8495e8b7/fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2", size = 5035553, upload-time = "2025-12-12T17:30:54.823Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b6/1f6600161b1073a984294c6c031e1a56ebf95b6164249eecf30012bb2e38/fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c", size = 2271915, upload-time = "2025-12-12T17:30:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/52/7b/91e7b01e37cc8eb0e1f770d08305b3655e4f002fc160fb82b3390eabacf5/fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c", size = 2323487, upload-time = "2025-12-12T17:30:59.804Z" }, - { url = "https://files.pythonhosted.org/packages/39/5c/908ad78e46c61c3e3ed70c3b58ff82ab48437faf84ec84f109592cabbd9f/fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa", size = 2929571, upload-time = "2025-12-12T17:31:02.574Z" }, - { url = "https://files.pythonhosted.org/packages/bd/41/975804132c6dea64cdbfbaa59f3518a21c137a10cccf962805b301ac6ab2/fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91", size = 2435317, upload-time = "2025-12-12T17:31:04.974Z" }, - { url = "https://files.pythonhosted.org/packages/b0/5a/aef2a0a8daf1ebaae4cfd83f84186d4a72ee08fd6a8451289fcd03ffa8a4/fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19", size = 4882124, upload-time = "2025-12-12T17:31:07.456Z" }, - { url = "https://files.pythonhosted.org/packages/80/33/d6db3485b645b81cea538c9d1c9219d5805f0877fda18777add4671c5240/fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba", size = 5100391, upload-time = "2025-12-12T17:31:09.732Z" }, - { url = "https://files.pythonhosted.org/packages/6c/d6/675ba631454043c75fcf76f0ca5463eac8eb0666ea1d7badae5fea001155/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7", size = 4978800, upload-time = "2025-12-12T17:31:11.681Z" }, - { url = "https://files.pythonhosted.org/packages/7f/33/d3ec753d547a8d2bdaedd390d4a814e8d5b45a093d558f025c6b990b554c/fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118", size = 5006426, upload-time = "2025-12-12T17:31:13.764Z" }, - { url = "https://files.pythonhosted.org/packages/b4/40/cc11f378b561a67bea850ab50063366a0d1dd3f6d0a30ce0f874b0ad5664/fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5", size = 2335377, upload-time = "2025-12-12T17:31:16.49Z" }, - { url = "https://files.pythonhosted.org/packages/e4/ff/c9a2b66b39f8628531ea58b320d66d951267c98c6a38684daa8f50fb02f8/fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b", size = 2400613, upload-time = "2025-12-12T17:31:18.769Z" }, - { url = "https://files.pythonhosted.org/packages/c7/4e/ce75a57ff3aebf6fc1f4e9d508b8e5810618a33d900ad6c19eb30b290b97/fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371", size = 1148996, upload-time = "2025-12-12T17:31:21.03Z" }, +version = "4.62.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/96/686339e0fda8142b7ebed39af53f4a5694602a729662f42a6209e3be91d0/fonttools-4.62.0.tar.gz", hash = "sha256:0dc477c12b8076b4eb9af2e440421b0433ffa9e1dcb39e0640a6c94665ed1098", size = 3579521, upload-time = "2026-03-09T16:50:06.217Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/64/61f69298aa6e7c363dcf00dd6371a654676900abe27d1effd1a74b43e5d0/fonttools-4.62.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:4fa5a9c716e2f75ef34b5a5c2ca0ee4848d795daa7e6792bf30fd4abf8993449", size = 2864222, upload-time = "2026-03-09T16:49:28.285Z" }, + { url = "https://files.pythonhosted.org/packages/c6/57/6b08756fe4455336b1fe160ab3c11fccc90768ccb6ee03fb0b45851aace4/fonttools-4.62.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:625f5cbeb0b8f4e42343eaeb4bc2786718ddd84760a2f5e55fdd3db049047c00", size = 2410674, upload-time = "2026-03-09T16:49:30.504Z" }, + { url = "https://files.pythonhosted.org/packages/6f/86/db65b63bb1b824b63e602e9be21b18741ddc99bcf5a7850f9181159ae107/fonttools-4.62.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6247e58b96b982709cd569a91a2ba935d406dccf17b6aa615afaed37ac3856aa", size = 4999387, upload-time = "2026-03-09T16:49:32.593Z" }, + { url = "https://files.pythonhosted.org/packages/86/c8/c6669e42d2f4efd60d38a3252cebbb28851f968890efb2b9b15f9d1092b0/fonttools-4.62.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:840632ea9c1eab7b7f01c369e408c0721c287dfd7500ab937398430689852fd1", size = 4912506, upload-time = "2026-03-09T16:49:34.927Z" }, + { url = "https://files.pythonhosted.org/packages/2e/49/0ae552aa098edd0ec548413fbf818f52ceb70535016215094a5ce9bf8f70/fonttools-4.62.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:28a9ea2a7467a816d1bec22658b0cce4443ac60abac3e293bdee78beb74588f3", size = 4951202, upload-time = "2026-03-09T16:49:37.1Z" }, + { url = "https://files.pythonhosted.org/packages/71/65/ae38fc8a4cea6f162d74cf11f58e9aeef1baa7d0e3d1376dabd336c129e5/fonttools-4.62.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5ae611294f768d413949fd12693a8cba0e6332fbc1e07aba60121be35eac68d0", size = 5060758, upload-time = "2026-03-09T16:49:39.464Z" }, + { url = "https://files.pythonhosted.org/packages/db/3d/bb797496f35c60544cd5af71ffa5aad62df14ef7286908d204cb5c5096fe/fonttools-4.62.0-cp314-cp314-win32.whl", hash = "sha256:273acb61f316d07570a80ed5ff0a14a23700eedbec0ad968b949abaa4d3f6bb5", size = 2283496, upload-time = "2026-03-09T16:49:42.448Z" }, + { url = "https://files.pythonhosted.org/packages/2e/9f/91081ffe5881253177c175749cce5841f5ec6e931f5d52f4a817207b7429/fonttools-4.62.0-cp314-cp314-win_amd64.whl", hash = "sha256:a5f974006d14f735c6c878fc4b117ad031dc93638ddcc450ca69f8fd64d5e104", size = 2335426, upload-time = "2026-03-09T16:49:44.228Z" }, + { url = "https://files.pythonhosted.org/packages/f8/65/f47f9b3db1ec156a1f222f1089ba076b2cc9ee1d024a8b0a60c54258517e/fonttools-4.62.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0361a7d41d86937f1f752717c19f719d0fde064d3011038f9f19bdf5fc2f5c95", size = 2947079, upload-time = "2026-03-09T16:49:46.471Z" }, + { url = "https://files.pythonhosted.org/packages/52/73/bc62e5058a0c22cf02b1e0169ef0c3ca6c3247216d719f95bead3c05a991/fonttools-4.62.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4108c12773b3c97aa592311557c405d5b4fc03db2b969ed928fcf68e7b3c887", size = 2448802, upload-time = "2026-03-09T16:49:48.328Z" }, + { url = "https://files.pythonhosted.org/packages/2b/df/bfaa0e845884935355670e6e68f137185ab87295f8bc838db575e4a66064/fonttools-4.62.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b448075f32708e8fb377fe7687f769a5f51a027172c591ba9a58693631b077a8", size = 5137378, upload-time = "2026-03-09T16:49:50.223Z" }, + { url = "https://files.pythonhosted.org/packages/32/32/04f616979a18b48b52e634988b93d847b6346260faf85ecccaf7e2e9057f/fonttools-4.62.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5f1fa8cc9f1a56a3e33ee6b954d6d9235e6b9d11eb7a6c9dfe2c2f829dc24db", size = 4920714, upload-time = "2026-03-09T16:49:53.172Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2e/274e16689c1dfee5c68302cd7c444213cfddd23cf4620374419625037ec6/fonttools-4.62.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f8c8ea812f82db1e884b9cdb663080453e28f0f9a1f5027a5adb59c4cc8d38d1", size = 5016012, upload-time = "2026-03-09T16:49:55.762Z" }, + { url = "https://files.pythonhosted.org/packages/7f/0c/b08117270626e7117ac2f89d732fdd4386ec37d2ab3a944462d29e6f89a1/fonttools-4.62.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:03c6068adfdc67c565d217e92386b1cdd951abd4240d65180cec62fa74ba31b2", size = 5042766, upload-time = "2026-03-09T16:49:57.726Z" }, + { url = "https://files.pythonhosted.org/packages/11/83/a48b73e54efa272ee65315a6331b30a9b3a98733310bc11402606809c50e/fonttools-4.62.0-cp314-cp314t-win32.whl", hash = "sha256:d28d5baacb0017d384df14722a63abe6e0230d8ce642b1615a27d78ffe3bc983", size = 2347785, upload-time = "2026-03-09T16:49:59.698Z" }, + { url = "https://files.pythonhosted.org/packages/f8/27/c67eab6dc3525bdc39586511b1b3d7161e972dacc0f17476dbaf932e708b/fonttools-4.62.0-cp314-cp314t-win_amd64.whl", hash = "sha256:3f9e20c4618f1e04190c802acae6dc337cb6db9fa61e492fd97cd5c5a9ff6d07", size = 2413914, upload-time = "2026-03-09T16:50:02.251Z" }, + { url = "https://files.pythonhosted.org/packages/9c/57/c2487c281dde03abb2dec244fd67059b8d118bd30a653cbf69e94084cb23/fonttools-4.62.0-py3-none-any.whl", hash = "sha256:75064f19a10c50c74b336aa5ebe7b1f89fd0fb5255807bfd4b0c6317098f4af3", size = 1152427, upload-time = "2026-03-09T16:50:04.074Z" }, ] [[package]] @@ -1707,31 +1707,31 @@ wheels = [ [[package]] name = "pypdfium2" -version = "5.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fb/f6/42f5f1b9beb7e036f5532832b9c590fd107c52a78f704302c03bc6793954/pypdfium2-5.5.0.tar.gz", hash = "sha256:3283c61f54c3c546d140da201ef48a51c18b0ad54293091a010029ac13ece23a", size = 270502, upload-time = "2026-02-18T23:22:37.643Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/08/c0/cdddce35108c118cc110c1c2ed16de82d74d7646b9bcf98eae2fa440966b/pypdfium2-5.5.0-py3-none-android_23_arm64_v8a.whl", hash = "sha256:414f0b4aef7413e04df7355043fb752f2efb6f9777e04fd880d302612dacf89f", size = 2760984, upload-time = "2026-02-18T23:21:56.668Z" }, - { url = "https://files.pythonhosted.org/packages/d0/c7/23a6fbd6d23fd8dbe657696acd81fba858639ef221254ce05970152ad1d8/pypdfium2-5.5.0-py3-none-android_23_armeabi_v7a.whl", hash = "sha256:126ff8b131d12f16ce96b3e85b7f413e5073212be06b571f157fe11ad221c274", size = 2303146, upload-time = "2026-02-18T23:21:58.466Z" }, - { url = "https://files.pythonhosted.org/packages/bc/a9/379ec56c4481f39f0e37a7ce42f4844e6ddd7662571922e2b348105960ab/pypdfium2-5.5.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:0770bd3f0be5c68443fc4017e43b1b1fe8f36877481cab70fd29b68b2c362e1b", size = 2815036, upload-time = "2026-02-18T23:22:00.288Z" }, - { url = "https://files.pythonhosted.org/packages/91/a4/b0cc01aaae1fdf1ca4e080cc55bb432f5a2234f33209a602bc498a47850d/pypdfium2-5.5.0-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:5ab41a3b9953d9be44be35c36a2340f1d67c602db98a0d6f70006610871ae43a", size = 2948686, upload-time = "2026-02-18T23:22:02.213Z" }, - { url = "https://files.pythonhosted.org/packages/26/99/25a0c71b551d100b505c618910afec0df402b230e087078c8078f8b1fcff/pypdfium2-5.5.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2492a22c3126a004cee2fa208ea4aa03ede2c7e205d05814934ab18f83d073e9", size = 2977311, upload-time = "2026-02-18T23:22:03.603Z" }, - { url = "https://files.pythonhosted.org/packages/85/64/691e21539566f7a0521295948b5589d2fdfe3df5acab9c29ff410633a839/pypdfium2-5.5.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:83ff93e08b1fadb00040564e2eccc99147fc1a632ba5daff745126b373d78446", size = 2762449, upload-time = "2026-02-18T23:22:05.044Z" }, - { url = "https://files.pythonhosted.org/packages/74/b1/9af288557291e2964bf5ffd460b7ed1090fcb8c54addfd6c7c5deb9ba7c7/pypdfium2-5.5.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7e85de3332bedf8e5f157c248063b4eaf968660e1e490353b6e581d9f96a4c6", size = 3074851, upload-time = "2026-02-18T23:22:07.431Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1e/c61fddbdea5ea1ba478dc7ecc9d68069d17b858e5fed04e4e071811f0858/pypdfium2-5.5.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e258365f34b6e334bb415e44dd9b1ee78a6e525bf854a1e74af67af7ede7555b", size = 3423003, upload-time = "2026-02-18T23:22:09.749Z" }, - { url = "https://files.pythonhosted.org/packages/36/5f/d2eb58c54abba3a6c3bc4c297b3a11348dd4b4deb073f1aa8a872a298278/pypdfium2-5.5.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bec21d833404ca771f02fa5cefb0b73e2148f05cbdb3b5b9989bdd51d9b5cbac", size = 3002104, upload-time = "2026-02-18T23:22:12.035Z" }, - { url = "https://files.pythonhosted.org/packages/1c/33/87423eec4f5d4287d5a1726dbb9f06fb1f1aebc38ff75dcff817c492769d/pypdfium2-5.5.0-py3-none-manylinux_2_27_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1dd6ccbe1b5e2e778e8b021e47f9485b4fd42eaa6c9bdda2631641724e1fcc04", size = 3097209, upload-time = "2026-02-18T23:22:13.809Z" }, - { url = "https://files.pythonhosted.org/packages/97/0a/a3fd71f00838bba7922691107219bee67f50fbda6d12df330ef485a97848/pypdfium2-5.5.0-py3-none-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:da3eada345570cec5e34872d1472d4ac542f0e650ccdb6c2eac08ae1a5f07c82", size = 2965027, upload-time = "2026-02-18T23:22:16.324Z" }, - { url = "https://files.pythonhosted.org/packages/75/4a/2181260bd8a0b1b30ac50b7fd6ee3366e04f3a9f1c29351d882652da7fa7/pypdfium2-5.5.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a087fb4088c7433fd3d78833dbe42cfb66df3d5ac98e3edf66110520fb33c0f0", size = 4131431, upload-time = "2026-02-18T23:22:18.469Z" }, - { url = "https://files.pythonhosted.org/packages/15/bb/3ccf481191346eda11c0c208bd4e46f8de019ae7d9e9c1b660633f0bb3f4/pypdfium2-5.5.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:e6418cdc500ef85a90319f9bc7f1c54fc133460379f509429403225d8a4c157f", size = 3747468, upload-time = "2026-02-18T23:22:20.679Z" }, - { url = "https://files.pythonhosted.org/packages/15/51/17e50ec72cf2235ac18d9cbe907859501c769d3e964818fefac6a3e10727/pypdfium2-5.5.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:8f7b66eedfac26eb2df4b00936e081b0a1c76fb8ee1c12639d85c2e73b0769ef", size = 4337579, upload-time = "2026-02-18T23:22:23.245Z" }, - { url = "https://files.pythonhosted.org/packages/c6/e4/f9bdf06f4d3f1e56eff9d997392a00a4b66cbc9c20f33934c4edc2a7943f/pypdfium2-5.5.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:faea3246591ce2ea6218cd06679071275e3c65f11c3f5c9091eb7fb07610af6a", size = 4376104, upload-time = "2026-02-18T23:22:25.337Z" }, - { url = "https://files.pythonhosted.org/packages/8c/20/06baf1f5d494e035f50fc895fa1da5ed652d03ecc59aeb3aabb0daa5adfc/pypdfium2-5.5.0-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:aba26d404b51a9de3d3e80c867a95c71abf1c79552001ae22707451e59186b3d", size = 3929824, upload-time = "2026-02-18T23:22:26.889Z" }, - { url = "https://files.pythonhosted.org/packages/3a/01/28940e54e6936674e9a05eb58ccce7c54d8e2ac81cd84ec0b76e7d32a010/pypdfium2-5.5.0-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:e0fa8f81679e6e71f26806f4db853571ee6435dc3bde7a46acdd182ef886a5b9", size = 4270200, upload-time = "2026-02-18T23:22:28.668Z" }, - { url = "https://files.pythonhosted.org/packages/cb/d4/1f36c505a3770aad9a88c895a46d61fd4c0535f79548f02c93b97ff89604/pypdfium2-5.5.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:ee22df3376d350eeb64d2002a1071e3a02c0d874c557a3cd8229a8fc572cdaac", size = 4180794, upload-time = "2026-02-18T23:22:30.11Z" }, - { url = "https://files.pythonhosted.org/packages/ac/38/f77e7792b4fba37f0e3d78db52fb7288d41db3c46ed28906fb940bc3e325/pypdfium2-5.5.0-py3-none-win32.whl", hash = "sha256:ec62a00223d1222d2f35c0866dd79cdc24da070738544cdf51b17d332d4a7389", size = 3001772, upload-time = "2026-02-18T23:22:32.367Z" }, - { url = "https://files.pythonhosted.org/packages/3e/c5/0d7ba53148262f78d8eee528a504764f78ae7bebf434a53714294b1fd973/pypdfium2-5.5.0-py3-none-win_amd64.whl", hash = "sha256:15c32fbeebb5198afa785dd03e98906ebb4eded9ef8862e10f833c37b4a18786", size = 3107710, upload-time = "2026-02-18T23:22:33.925Z" }, - { url = "https://files.pythonhosted.org/packages/29/ad/fae449d2ed7b3088c6ab088f53fc6a9e9af26ccc9e0477d4182e373c4dd8/pypdfium2-5.5.0-py3-none-win_arm64.whl", hash = "sha256:f618af0884c16c768539c44933a255039131dbbf39d68eded020da4f14958d73", size = 2938315, upload-time = "2026-02-18T23:22:35.907Z" }, +version = "5.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/01/be763b9081c7eb823196e7d13d9c145bf75ac43f3c1466de81c21c24b381/pypdfium2-5.6.0.tar.gz", hash = "sha256:bcb9368acfe3547054698abbdae68ba0cbd2d3bda8e8ee437e061deef061976d", size = 270714, upload-time = "2026-03-08T01:05:06.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/b1/129ed0177521a93a892f8a6a215dd3260093e30e77ef7035004bb8af7b6c/pypdfium2-5.6.0-py3-none-android_23_arm64_v8a.whl", hash = "sha256:fb7858c9707708555b4a719b5548a6e7f5d26bc82aef55ae4eb085d7a2190b11", size = 3346059, upload-time = "2026-03-08T01:04:21.37Z" }, + { url = "https://files.pythonhosted.org/packages/86/34/cbdece6886012180a7f2c7b2c360c415cf5e1f83f1973d2c9201dae3506a/pypdfium2-5.6.0-py3-none-android_23_armeabi_v7a.whl", hash = "sha256:6a7e1f4597317786f994bfb947eef480e53933f804a990193ab89eef8243f805", size = 2804418, upload-time = "2026-03-08T01:04:23.384Z" }, + { url = "https://files.pythonhosted.org/packages/6e/f6/9f9e190fe0e5a6b86b82f83bd8b5d3490348766062381140ca5cad8e00b1/pypdfium2-5.6.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e468c38997573f0e86f03273c2c1fbdea999de52ba43fee96acaa2f6b2ad35f7", size = 3412541, upload-time = "2026-03-08T01:04:25.45Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8d/e57492cb2228ba56ed57de1ff044c8ac114b46905f8b1445c33299ba0488/pypdfium2-5.6.0-py3-none-macosx_11_0_x86_64.whl", hash = "sha256:ad3abddc5805424f962e383253ccad6a0d1d2ebd86afa9a9e1b9ca659773cd0d", size = 3592320, upload-time = "2026-03-08T01:04:27.509Z" }, + { url = "https://files.pythonhosted.org/packages/f9/8a/8ab82e33e9c551494cbe1526ea250ca8cc4e9e98d6a4fc6b6f8d959aa1d1/pypdfium2-5.6.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b5eb9eae5c45076395454522ca26add72ba8bd1fe473e1e4721aa58521470c", size = 3596450, upload-time = "2026-03-08T01:04:29.183Z" }, + { url = "https://files.pythonhosted.org/packages/f5/b5/602a792282312ccb158cc63849528079d94b0a11efdc61f2a359edfb41e9/pypdfium2-5.6.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:258624da8ef45cdc426e11b33e9d83f9fb723c1c201c6e0f4ab5a85966c6b876", size = 3325442, upload-time = "2026-03-08T01:04:30.886Z" }, + { url = "https://files.pythonhosted.org/packages/81/1f/9e48ec05ed8d19d736c2d1f23c1bd0f20673f02ef846a2576c69e237f15d/pypdfium2-5.6.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9367451c8a00931d6612db0822525a18c06f649d562cd323a719e46ac19c9bb", size = 3727434, upload-time = "2026-03-08T01:04:33.619Z" }, + { url = "https://files.pythonhosted.org/packages/33/90/0efd020928b4edbd65f4f3c2af0c84e20b43a3ada8fa6d04f999a97afe7a/pypdfium2-5.6.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a757869f891eac1cc1372e38a4aa01adac8abc8fe2a8a4e2ebf50595e3bf5937", size = 4139029, upload-time = "2026-03-08T01:04:36.08Z" }, + { url = "https://files.pythonhosted.org/packages/ff/49/a640b288a48dab1752281dd9b72c0679fccea107874e80a65a606b00efa9/pypdfium2-5.6.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:515be355222cc57ae9e62cd5c7c350b8e0c863efc539f80c7d75e2811ba45cb6", size = 3646387, upload-time = "2026-03-08T01:04:38.151Z" }, + { url = "https://files.pythonhosted.org/packages/b0/3b/a344c19c01021eeb5d830c102e4fc9b1602f19c04aa7d11abbe2d188fd8e/pypdfium2-5.6.0-py3-none-manylinux_2_27_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1c4753c7caf7d004211d7f57a21f10d127f5e0e5510a14d24bc073e7220a3ea", size = 3097212, upload-time = "2026-03-08T01:04:40.776Z" }, + { url = "https://files.pythonhosted.org/packages/50/96/e48e13789ace22aeb9b7510904a1b1493ec588196e11bbacc122da330b3d/pypdfium2-5.6.0-py3-none-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c49729090281fdd85775fb8912c10bd19e99178efaa98f145ab06e7ce68554d2", size = 2965026, upload-time = "2026-03-08T01:04:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/cb/06/3100e44d4935f73af8f5d633d3bd40f0d36d606027085a0ef1f0566a6320/pypdfium2-5.6.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:a4a1749a8d4afd62924a8d95cfa4f2e26fc32957ce34ac3b674be6f127ed252e", size = 4131431, upload-time = "2026-03-08T01:04:44.982Z" }, + { url = "https://files.pythonhosted.org/packages/64/ef/d8df63569ce9a66c8496057782eb8af78e0d28667922d62ec958434e3d4b/pypdfium2-5.6.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:36469ebd0fdffb7130ce45ed9c44f8232d91571c89eb851bd1633c64b6f6114f", size = 3747469, upload-time = "2026-03-08T01:04:46.702Z" }, + { url = "https://files.pythonhosted.org/packages/a6/47/fd2c6a67a49fade1acd719fbd11f7c375e7219912923ef2de0ea0ac1544e/pypdfium2-5.6.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:9da900df09be3cf546b637a127a7b6428fb22d705951d731269e25fd3adef457", size = 4337578, upload-time = "2026-03-08T01:04:49.007Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f5/836c83e54b01e09478c4d6bf4912651d6053c932250fcee953f5c72d8e4a/pypdfium2-5.6.0-py3-none-musllinux_1_2_ppc64le.whl", hash = "sha256:45fccd5622233c5ec91a885770ae7dd4004d4320ac05a4ad8fa03a66dea40244", size = 4376104, upload-time = "2026-03-08T01:04:51.04Z" }, + { url = "https://files.pythonhosted.org/packages/6e/7f/b940b6a1664daf8f9bad87c6c99b84effa3611615b8708d10392dc33036c/pypdfium2-5.6.0-py3-none-musllinux_1_2_riscv64.whl", hash = "sha256:282dc030e767cd61bd0299f9d581052b91188e2b87561489057a8e7963e7e0cb", size = 3929824, upload-time = "2026-03-08T01:04:53.544Z" }, + { url = "https://files.pythonhosted.org/packages/88/79/00267d92a6a58c229e364d474f5698efe446e0c7f4f152f58d0138715e99/pypdfium2-5.6.0-py3-none-musllinux_1_2_s390x.whl", hash = "sha256:a1c1dfe950382c76a7bba1ba160ec5e40df8dd26b04a1124ae268fda55bc4cbe", size = 4270201, upload-time = "2026-03-08T01:04:55.81Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ab/b127f38aba41746bdf9ace15ba08411d7ef6ecba1326d529ba414eb1ed50/pypdfium2-5.6.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:43b0341ca6feb6c92e4b7a9eb4813e5466f5f5e8b6baeb14df0a94d5f312c00b", size = 4180793, upload-time = "2026-03-08T01:04:57.961Z" }, + { url = "https://files.pythonhosted.org/packages/0e/8c/a01c8e4302448b614d25a85c08298b0d3e9dfbdac5bd1b2f32c9b02e83d9/pypdfium2-5.6.0-py3-none-win32.whl", hash = "sha256:9dfcd4ff49a2b9260d00e38539ab28190d59e785e83030b30ffaf7a29c42155d", size = 3596753, upload-time = "2026-03-08T01:05:00.566Z" }, + { url = "https://files.pythonhosted.org/packages/9b/5f/2d871adf46761bb002a62686545da6348afe838d19af03df65d1ece786a2/pypdfium2-5.6.0-py3-none-win_amd64.whl", hash = "sha256:c6bc8dd63d0568f4b592f3e03de756afafc0e44aa1fe8878cc4aba1b11ae7374", size = 3716526, upload-time = "2026-03-08T01:05:02.433Z" }, + { url = "https://files.pythonhosted.org/packages/3a/80/0d9b162098597fbe3ac2b269b1682c0c3e8db9ba87679603fdd9b19afaa6/pypdfium2-5.6.0-py3-none-win_arm64.whl", hash = "sha256:5538417b199bdcb3207370c88df61f2ba3dac7a3253f82e1aa2708e6376b6f90", size = 3515049, upload-time = "2026-03-08T01:05:04.587Z" }, ] [[package]] @@ -1909,11 +1909,11 @@ wheels = [ [[package]] name = "setuptools" -version = "82.0.0" +version = "82.0.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/f3/748f4d6f65d1756b9ae577f329c951cda23fb900e4de9f70900ced962085/setuptools-82.0.0.tar.gz", hash = "sha256:22e0a2d69474c6ae4feb01951cb69d515ed23728cf96d05513d36e42b62b37cb", size = 1144893, upload-time = "2026-02-08T15:08:40.206Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/e1/c6/76dc613121b793286a3f91621d7b75a2b493e0390ddca50f11993eadf192/setuptools-82.0.0-py3-none-any.whl", hash = "sha256:70b18734b607bd1da571d097d236cfcfacaf01de45717d59e6e04b96877532e0", size = 1003468, upload-time = "2026-02-08T15:08:38.723Z" }, + { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" }, ] [[package]] @@ -2009,11 +2009,11 @@ wheels = [ [[package]] name = "types-awscrt" -version = "0.31.2" +version = "0.31.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/18/24/5497a611f32cbaf4b9e1af35f56463e8f02e198ec513b68cb59a63f5a446/types_awscrt-0.31.2.tar.gz", hash = "sha256:dc79705acd24094656b8105b8d799d7e273c8eac37c69137df580cd84beb54f6", size = 18190, upload-time = "2026-02-16T02:33:53.135Z" } +sdist = { url = "https://files.pythonhosted.org/packages/76/26/0aa563e229c269c528a3b8c709fc671ac2a5c564732fab0852ac6ee006cf/types_awscrt-0.31.3.tar.gz", hash = "sha256:09d3eaf00231e0f47e101bd9867e430873bc57040050e2a3bd8305cb4fc30865", size = 18178, upload-time = "2026-03-08T02:31:14.569Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/3d/21a2212b5fcef9e8e9f368403885dc567b7d31e50b2ce393efad3cd83572/types_awscrt-0.31.2-py3-none-any.whl", hash = "sha256:3d6a29c1cca894b191be408f4d985a8e3a14d919785652dd3fa4ee558143e4bf", size = 43340, upload-time = "2026-02-16T02:33:52.109Z" }, + { url = "https://files.pythonhosted.org/packages/3e/e5/47a573bbbd0a790f8f9fe452f7188ea72b212d21c9be57d5fc0cbc442075/types_awscrt-0.31.3-py3-none-any.whl", hash = "sha256:e5ce65a00a2ab4f35eacc1e3d700d792338d56e4823ee7b4dbe017f94cfc4458", size = 43340, upload-time = "2026-03-08T02:31:13.38Z" }, ] [[package]] diff --git a/web/package-lock.json b/web/package-lock.json index c964e86..d91798e 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -15,8 +15,8 @@ "@solid-primitives/scroll": "^2.1.5", "@tabler/icons-solidjs": "^3.40.0", "@tailwindcss/vite": "^4.2.1", - "@tanstack/router-plugin": "^1.166.3", - "@tanstack/solid-router": "^1.166.2", + "@tanstack/router-plugin": "^1.166.6", + "@tanstack/solid-router": "^1.166.6", "@tiptap/core": "^3.20.1", "@tiptap/extension-dropcursor": "^3.20.1", "@tiptap/extension-file-handler": "^3.20.1", @@ -34,7 +34,7 @@ "dompurify": "^3.3.2", "fflate": "^0.8.2", "firebase": "^12.10.0", - "i18next": "^25.8.16", + "i18next": "^25.8.17", "i18next-browser-languagedetector": "^8.2.1", "korean-regexp": "^1.0.13", "marked": "^17.0.4", @@ -51,10 +51,10 @@ "@solidjs/testing-library": "^0.8.10", "@tailwindcss/typography": "^0.5.19", "@testing-library/jest-dom": "^6.9.1", - "@types/node": "^25.3.5", + "@types/node": "^25.4.0", "@types/papaparse": "^5.5.2", "daisyui": "^5.5.19", - "i18next-cli": "^1.49.4", + "i18next-cli": "^1.49.6", "jsdom": "^28.1.0", "typescript": "^5.9.3", "vite": "^7.3.1", @@ -370,9 +370,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3946,9 +3946,9 @@ } }, "node_modules/@tanstack/router-core": { - "version": "1.166.2", - "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.166.2.tgz", - "integrity": "sha512-zn3NhENOAX9ToQiX077UV2OH3aJKOvV2ZMNZZxZ3gDG3i3WqL8NfWfEgetEAfMN37/Mnt90PpotYgf7IyuoKqQ==", + "version": "1.166.6", + "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.166.6.tgz", + "integrity": "sha512-SwVPMQxjoY4jwiNgD9u5kDFp/iSaf3wgf1t93xRCC6qDHmv/xLaawhvwEPNIJaPepWuSYRpywpJWH9hGlBqVbw==", "license": "MIT", "dependencies": { "@tanstack/history": "1.161.4", @@ -3968,12 +3968,12 @@ } }, "node_modules/@tanstack/router-generator": { - "version": "1.166.2", - "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.166.2.tgz", - "integrity": "sha512-wbvdyP1PKKQKk4aVlGeK9S5uDy8zodTr3tEZ2gRKNavJLusXbEWqtoo42JxHFFNB6dtguehFMt8PyZPAtkgWwQ==", + "version": "1.166.6", + "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.166.6.tgz", + "integrity": "sha512-D7Z6oLP2IfflXUzOOxIgeCD8v3/SXU//cgBon0pbF13HkKdf9Zlt97kQqcaOkbnruJJ6i5xtUIsoAQbMmj+EsQ==", "license": "MIT", "dependencies": { - "@tanstack/router-core": "1.166.2", + "@tanstack/router-core": "1.166.6", "@tanstack/router-utils": "1.161.4", "@tanstack/virtual-file-routes": "1.161.4", "prettier": "^3.5.0", @@ -3991,9 +3991,9 @@ } }, "node_modules/@tanstack/router-plugin": { - "version": "1.166.3", - "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.166.3.tgz", - "integrity": "sha512-yhnJRohpdKB24Fh7fW5mwgffpOcERZlXdk3i8PjXn+OYgAiG/cpuXXOJpZZ6An68vDW+Z5zBuTynXsDi2ZE4JQ==", + "version": "1.166.6", + "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.166.6.tgz", + "integrity": "sha512-07ZwOMNDlKIoaRtrfP5zO3VfqXNg2Zm7qvqZOBaTbbqgMvaKclW0ylqakweXtDwiNs9GPf/+lH/xyc+CgLGUyg==", "license": "MIT", "dependencies": { "@babel/core": "^7.28.5", @@ -4002,8 +4002,8 @@ "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5", - "@tanstack/router-core": "1.166.2", - "@tanstack/router-generator": "1.166.2", + "@tanstack/router-core": "1.166.6", + "@tanstack/router-generator": "1.166.6", "@tanstack/router-utils": "1.161.4", "@tanstack/virtual-file-routes": "1.161.4", "chokidar": "^3.6.0", @@ -4019,7 +4019,7 @@ }, "peerDependencies": { "@rsbuild/core": ">=1.0.2", - "@tanstack/react-router": "^1.166.3", + "@tanstack/react-router": "^1.166.6", "vite": ">=5.0.0 || >=6.0.0 || >=7.0.0", "vite-plugin-solid": "^2.11.10", "webpack": ">=5.92.0" @@ -4067,16 +4067,16 @@ } }, "node_modules/@tanstack/solid-router": { - "version": "1.166.2", - "resolved": "https://registry.npmjs.org/@tanstack/solid-router/-/solid-router-1.166.2.tgz", - "integrity": "sha512-S0SwU+uiKNdEBdap7D0AWpRaJQyCDQWeXVstY/lfM37Yrp4i1kxmZG5hRmQWVSimD8dDFxJfIVKUWRtwtItwcg==", + "version": "1.166.6", + "resolved": "https://registry.npmjs.org/@tanstack/solid-router/-/solid-router-1.166.6.tgz", + "integrity": "sha512-GOSd/D3qfiXaD4pSw5b+ZwTDxIekWAD1wRkWYHX8UgJ/ZB1lwrvTyIgSSa1UXT+wCREl4yahn1gYPi8Nx+bHkw==", "license": "MIT", "dependencies": { "@solid-devtools/logger": "^0.9.4", "@solid-primitives/refs": "^1.0.8", "@solidjs/meta": "^0.29.4", "@tanstack/history": "1.161.4", - "@tanstack/router-core": "1.166.2", + "@tanstack/router-core": "1.166.6", "@tanstack/solid-store": "^0.9.1", "isbot": "^5.1.22", "tiny-invariant": "^1.3.3", @@ -4770,9 +4770,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "25.3.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.5.tgz", - "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.4.0.tgz", + "integrity": "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==", "license": "MIT", "dependencies": { "undici-types": "~7.18.0" @@ -6518,9 +6518,9 @@ } }, "node_modules/i18next": { - "version": "25.8.16", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.16.tgz", - "integrity": "sha512-/4Xvgm8RiJNcB+sZwplylrFNJ27DVvubGX7y6uXn7hh7aSvbmXVSRIyIGx08fEn05SYwaSYWt753mIpJuPKo+Q==", + "version": "25.8.17", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.8.17.tgz", + "integrity": "sha512-vWtCttyn5bpOK4hWbRAe1ZXkA+Yzcn2OcACT+WJavtfGMcxzkfvXTLMeOU8MUhRmAySKjU4VVuKlo0sSGeBokA==", "funding": [ { "type": "individual", @@ -6538,7 +6538,7 @@ "license": "MIT", "peer": true, "dependencies": { - "@babel/runtime": "^7.28.4" + "@babel/runtime": "^7.28.6" }, "peerDependencies": { "typescript": "^5" @@ -6559,28 +6559,28 @@ } }, "node_modules/i18next-cli": { - "version": "1.49.4", - "resolved": "https://registry.npmjs.org/i18next-cli/-/i18next-cli-1.49.4.tgz", - "integrity": "sha512-ts/5iEO7/j30kzw+G0jpwpZ/0ChaggZt2ASQVJPizIrG8pjGh/StnQULfPPn0dWwOpCmEi9DQYm/WwrCJkoRRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@croct/json5-parser": "0.2.2", - "@swc/core": "1.15.18", - "chokidar": "5.0.0", - "commander": "14.0.3", - "execa": "9.6.1", - "glob": "13.0.6", - "i18next-resources-for-ts": "2.0.0", - "inquirer": "13.3.0", - "jiti": "2.6.1", - "jsonc-parser": "3.3.1", - "magic-string": "0.30.21", - "minimatch": "10.2.4", - "ora": "9.3.0", + "version": "1.49.6", + "resolved": "https://registry.npmjs.org/i18next-cli/-/i18next-cli-1.49.6.tgz", + "integrity": "sha512-RfYapPZ7cL77TYid1AhZjUXYWQBqlNjx7aiYfgsY20hlrAI3DNlCGwEBIYKJ+YdzNICJDbFPaKZLkc/qL4qWTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@croct/json5-parser": "^0.2.2", + "@swc/core": "^1.15.18", + "chokidar": "^5.0.0", + "commander": "^14.0.3", + "execa": "^9.6.1", + "glob": "^13.0.6", + "i18next-resources-for-ts": "^2.0.1", + "inquirer": "^13.3.0", + "jiti": "^2.6.1", + "jsonc-parser": "^3.3.1", + "magic-string": "^0.30.21", + "minimatch": "^10.2.4", + "ora": "^9.3.0", "react": "^19.2.4", - "react-i18next": "^16.5.5", - "yaml": "2.8.2" + "react-i18next": "^16.5.6", + "yaml": "^2.8.2" }, "bin": { "i18next-cli": "dist/esm/cli.js" @@ -6620,14 +6620,14 @@ } }, "node_modules/i18next-resources-for-ts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/i18next-resources-for-ts/-/i18next-resources-for-ts-2.0.0.tgz", - "integrity": "sha512-RvATolbJlxrwpZh2+R7ZcNtg0ewmXFFx6rdu9i2bUEBvn6ThgA82rxDe3rJQa3hFS0SopX0qPaABqVDN3TUVpw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/i18next-resources-for-ts/-/i18next-resources-for-ts-2.0.1.tgz", + "integrity": "sha512-e3nroKWOHI/B4Nl2+N62xeCS8Dd61iSIUej/4ObeOs64JiLosAsHaa3HILg23rgIf+dS1I0IMDEkWPH2s9Oo3Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/runtime": "^7.28.4", - "@swc/core": "^1.15.3", + "@babel/runtime": "^7.28.6", + "@swc/core": "^1.15.18", "chokidar": "^5.0.0", "yaml": "^2.8.2" }, @@ -8269,9 +8269,9 @@ } }, "node_modules/react-i18next": { - "version": "16.5.5", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.5.tgz", - "integrity": "sha512-5Z35e2JMALNR16FK/LDNQoAatQTVuO/4m4uHrIzewOPXIyf75gAHzuNLSWwmj5lRDJxDvXRJDECThkxWSAReng==", + "version": "16.5.6", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-16.5.6.tgz", + "integrity": "sha512-Ua7V2/efA88ido7KyK51fb8Ki8M/sRfW8LR/rZ/9ZKr2luhuTI7kwYZN5agT1rWG7aYm5G0RYE/6JR8KJoCMDw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/web/package.json b/web/package.json index ff4c750..58e01fa 100644 --- a/web/package.json +++ b/web/package.json @@ -24,8 +24,8 @@ "@solid-primitives/scroll": "^2.1.5", "@tabler/icons-solidjs": "^3.40.0", "@tailwindcss/vite": "^4.2.1", - "@tanstack/router-plugin": "^1.166.3", - "@tanstack/solid-router": "^1.166.2", + "@tanstack/router-plugin": "^1.166.6", + "@tanstack/solid-router": "^1.166.6", "@tiptap/core": "^3.20.1", "@tiptap/extension-dropcursor": "^3.20.1", "@tiptap/extension-file-handler": "^3.20.1", @@ -43,7 +43,7 @@ "dompurify": "^3.3.2", "fflate": "^0.8.2", "firebase": "^12.10.0", - "i18next": "^25.8.16", + "i18next": "^25.8.17", "i18next-browser-languagedetector": "^8.2.1", "korean-regexp": "^1.0.13", "marked": "^17.0.4", @@ -60,10 +60,10 @@ "@solidjs/testing-library": "^0.8.10", "@tailwindcss/typography": "^0.5.19", "@testing-library/jest-dom": "^6.9.1", - "@types/node": "^25.3.5", + "@types/node": "^25.4.0", "@types/papaparse": "^5.5.2", "daisyui": "^5.5.19", - "i18next-cli": "^1.49.4", + "i18next-cli": "^1.49.6", "jsdom": "^28.1.0", "typescript": "^5.9.3", "vite": "^7.3.1", diff --git a/web/public/image/logo/logo.png b/web/public/image/logo/logo.png index d8cb1ce8b552836099ff509abe458c8f6e2dbfc4..03d4810383cc3094dddcec8c83f067722dbde6e2 100644 GIT binary patch delta 11463 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 G#Qy-7;7QH^ diff --git a/web/src/api/index.ts b/web/src/api/index.ts index ff9fcb9..a30108c 100644 --- a/web/src/api/index.ts +++ b/web/src/api/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts -export { accountV1Activate, accountV1ApplyEmailChange, accountV1ApplyPasswordChange, accountV1CompleteOtpSetup, accountV1GetMe, accountV1Join, accountV1Login, accountV1Logout, accountV1RequestActivation, accountV1RequestEmailChange, accountV1RequestPasswordChange, accountV1ResetOtp, accountV1SetupOtp, accountV1UpdateMe, accountV1UploadAvatar, accountV1VerifyOtp, assignmentV1DeactivateAttempt, assignmentV1GetSession, assignmentV1StartAttempt, assignmentV1SubmitAttempt, assistantV1ChatMessage, assistantV1DeleteChat, assistantV1GetChatMessages, assistantV1GetChats, assistantV1SaveAssistantNote, assistantV1UpdateChatMessage, competencyV1DeleteCompetencyGoal, competencyV1GetCertificateAwards, competencyV1GetCertificates, competencyV1GetClassificationSkillsData, competencyV1GetClassificationTree, competencyV1GetCompetencyGoals, competencyV1SaveCompetencyGoal, contentV1DeleteMediaWatch, contentV1GetMedia, contentV1GetMediaNote, contentV1GetMediaWatch, contentV1GetSubtitles, contentV1GetWatchMedias, contentV1SaveMediaNote, contentV1Search, contentV1SearchSuggestion, contentV1UpdateMediaWatch, courseV1GetDetail, courseV1GetSession, courseV1RequestCertificate, courseV1StartEngagement, discussionV1CreatePost, discussionV1DeactivateAttempt, discussionV1DeletePost, discussionV1GetOwnPosts, discussionV1GetPosts, discussionV1GetSession, discussionV1StartAttempt, discussionV1UpdatePost, examV1DeactivateAttempt, examV1GetSession, examV1GetTimestamp, examV1SaveAnswers, examV1StartAttempt, examV1SubmitAttempt, learningV1EnrollCatalogItem, learningV1GetCatalogItems, learningV1GetCatalogs, learningV1GetEnrolled, learningV1GetRecords, learningV1GetReport, learningV1Unenroll, minimaApiHealth, operationV1AgreePolicies, operationV1CreateAppeal, operationV1CreateInquiry, operationV1CreateThread, operationV1DeleteComment, operationV1DeleteDevice, operationV1EffectivePolicies, operationV1GetAnnouncements, operationV1GetComments, operationV1GetDevices, operationV1GetInquiries, operationV1GetThread, operationV1GetThreadComments, operationV1GetUnreadMessages, operationV1ReadAnnouncement, operationV1ReadMessage, operationV1RegisterDevice, operationV1SaveComment, operationV1ToggleDeviceActive, operationV1UpdateInquiry, type Options, partnerV1MemberInfos, quizV1DeactivateAttempt, quizV1GetSession, quizV1StartAttempt, quizV1SubmitAttempt, ssoV1Authorize, ssoV1Callback, ssoV1DeleteAccount, ssoV1GetAccounts, ssoV1Link, studioV1AssessmentSuggestions, studioV1Content, studioV1ContentSuggestions, studioV1CreateMediaQuiz, studioV1DeleteAssignment, studioV1DeleteAssignmentQuesion, studioV1DeleteCourse, studioV1DeleteDiscussion, studioV1DeleteDiscussionQuesion, studioV1DeleteExam, studioV1DeleteExamQuesion, studioV1DeleteMedia, studioV1DeleteMediaSubtitle, studioV1DeleteQuiz, studioV1DeleteQuizQuesion, studioV1DeleteSurvey, studioV1DeleteSurveyQuesion, studioV1GetAssignment, studioV1GetAssignmentQuestions, studioV1GetAssignmentRubric, studioV1GetCourse, studioV1GetDiscussion, studioV1GetDiscussionQuestions, studioV1GetExam, studioV1GetExamQuestions, studioV1GetMedia, studioV1GetQuiz, studioV1GetQuizQuestions, studioV1GetSurvey, studioV1GetSurveyQuestions, studioV1InlineSuggestions, studioV1RemoveCourseAssessment, studioV1RemoveCourseCategory, studioV1RemoveCourseCertificate, studioV1RemoveCourseInstructor, studioV1RemoveCourseLesson, studioV1RemoveCourseRelation, studioV1RemoveCourseSurvey, studioV1SaveAssignment, studioV1SaveAssignmentQuestions, studioV1SaveAssignmentRubric, studioV1SaveCourse, studioV1SaveCourseAssessments, studioV1SaveCourseCategories, studioV1SaveCourseCertificates, studioV1SaveCourseInstructors, studioV1SaveCourseLessons, studioV1SaveCourseRelations, studioV1SaveCourseSurveys, studioV1SaveDiscussion, studioV1SaveDiscussionQuestions, studioV1SaveExam, studioV1SaveExamQuestions, studioV1SaveMedia, studioV1SaveMediaSubtitle, studioV1SaveQuiz, studioV1SaveQuizQuestions, studioV1SaveSurvey, studioV1SaveSurveyQuestions, surveyV1GetAnonymousSurvey, surveyV1GetSurvey, surveyV1Results, surveyV1ResultsAnonymous, surveyV1Submit, surveyV1SubmitAnonymous, tutorV1CompleteAssignmentGrade, tutorV1CompleteDiscussionGrade, tutorV1CompleteExamGrade, tutorV1GetAllocation, tutorV1GetAllocationStats, tutorV1GetAssignmentGradePaper, tutorV1GetAssignmentGrades, tutorV1GetAssignmentRubric, tutorV1GetDiscussionGradePaper, tutorV1GetDiscussionGrades, tutorV1GetExamGradePaper, tutorV1GetExamGrades } from './sdk.gen'; -export type { AccessDateSchema, AccountActivatedSchema, AccountActivateSchema, AccountV1ActivateData, AccountV1ActivateResponse, AccountV1ActivateResponses, AccountV1ApplyEmailChangeData, AccountV1ApplyEmailChangeResponses, AccountV1ApplyPasswordChangeData, AccountV1ApplyPasswordChangeResponses, AccountV1CompleteOtpSetupData, AccountV1CompleteOtpSetupResponse, AccountV1CompleteOtpSetupResponses, AccountV1GetMeData, AccountV1GetMeResponse, AccountV1GetMeResponses, AccountV1JoinData, AccountV1JoinResponses, AccountV1LoginData, AccountV1LoginResponse, AccountV1LoginResponses, AccountV1LogoutData, AccountV1LogoutResponses, AccountV1RequestActivationData, AccountV1RequestActivationResponses, AccountV1RequestEmailChangeData, AccountV1RequestEmailChangeResponses, AccountV1RequestPasswordChangeData, AccountV1RequestPasswordChangeResponses, AccountV1ResetOtpData, AccountV1ResetOtpResponses, AccountV1SetupOtpData, AccountV1SetupOtpResponse, AccountV1SetupOtpResponses, AccountV1UpdateMeData, AccountV1UpdateMeResponse, AccountV1UpdateMeResponses, AccountV1UploadAvatarData, AccountV1UploadAvatarResponse, AccountV1UploadAvatarResponses, AccountV1VerifyOtpData, AccountV1VerifyOtpResponses, AllocationSchema, AllocationStatsSchema, AnnounceSchema, AppealCreateSchema, AppealSchema, ApplyEmailChangeSchema, ApplyPasswordChangeSchema, AssessmentSaveSpec, AssessmentSpec, AssessmentSuggestionSpec, AssignmentAttemptSchema, AssignmentGradeSchema, AssignmentQuestionSaveSpec, AssignmentQuestionSchema, AssignmentQuestionSpec, AssignmentQuestionsSaveSpec, AssignmentQuestionsSpec, AssignmentSaveSpec, AssignmentSchema, AssignmentSessionSchema, AssignmentSpec, AssignmentSubmissionSchema, AssignmentSubmitSchema, AssignmentV1DeactivateAttemptData, AssignmentV1DeactivateAttemptResponses, AssignmentV1GetSessionData, AssignmentV1GetSessionResponse, AssignmentV1GetSessionResponses, AssignmentV1StartAttemptData, AssignmentV1StartAttemptResponse, AssignmentV1StartAttemptResponses, AssignmentV1SubmitAttemptData, AssignmentV1SubmitAttemptResponse, AssignmentV1SubmitAttemptResponses, AssistantNoteSaveSchema, AssistantV1ChatMessageData, AssistantV1ChatMessageResponses, AssistantV1DeleteChatData, AssistantV1DeleteChatResponses, AssistantV1GetChatMessagesData, AssistantV1GetChatMessagesResponse, AssistantV1GetChatMessagesResponses, AssistantV1GetChatsData, AssistantV1GetChatsResponse, AssistantV1GetChatsResponses, AssistantV1SaveAssistantNoteData, AssistantV1SaveAssistantNoteResponses, AssistantV1UpdateChatMessageData, AssistantV1UpdateChatMessageResponses, AuthorizeResponseSchema, AuthorizeSchema, CatalogContentSchema, CatalogItemEnrollSchema, CatalogItemSchema, CatalogSchema, CertificateAwardSchema, CertificateEndorsementSchema, CertificateFilterSchema, CertificateSchema, CertificateSkillSchema, ChatListSchema, ChatMessageCreateSchema, ChatMessageSchema, ChatMessageUpdateSchema, ChatSchema, ClassificationSchema, ClassificationTreeNodeSchema, ClientOptions, CohortSchema, CohortStaffSchema, CommentBriefSchema, CommentNestedSchema, CommentSavedSchema, CommentSaveSchema, CommentSchema, CommentThreadSchema, CompetencyFactorySchema, CompetencyGoalSaveSchema, CompetencyGoalSchema, CompetencySkillSchema, CompetencyV1DeleteCompetencyGoalData, CompetencyV1DeleteCompetencyGoalResponses, CompetencyV1GetCertificateAwardsData, CompetencyV1GetCertificateAwardsResponse, CompetencyV1GetCertificateAwardsResponses, CompetencyV1GetCertificatesData, CompetencyV1GetCertificatesResponse, CompetencyV1GetCertificatesResponses, CompetencyV1GetClassificationSkillsDataData, CompetencyV1GetClassificationSkillsDataResponse, CompetencyV1GetClassificationSkillsDataResponses, CompetencyV1GetClassificationTreeData, CompetencyV1GetClassificationTreeResponse, CompetencyV1GetClassificationTreeResponses, CompetencyV1GetCompetencyGoalsData, CompetencyV1GetCompetencyGoalsResponse, CompetencyV1GetCompetencyGoalsResponses, CompetencyV1SaveCompetencyGoalData, CompetencyV1SaveCompetencyGoalResponse, CompetencyV1SaveCompetencyGoalResponses, ContentSuggestionSpec, ContentTypeSchema, ContentV1DeleteMediaWatchData, ContentV1DeleteMediaWatchResponses, ContentV1GetMediaData, ContentV1GetMediaNoteData, ContentV1GetMediaNoteResponse, ContentV1GetMediaNoteResponses, ContentV1GetMediaResponse, ContentV1GetMediaResponses, ContentV1GetMediaWatchData, ContentV1GetMediaWatchResponse, ContentV1GetMediaWatchResponses, ContentV1GetSubtitlesData, ContentV1GetSubtitlesResponse, ContentV1GetSubtitlesResponses, ContentV1GetWatchMediasData, ContentV1GetWatchMediasResponse, ContentV1GetWatchMediasResponses, ContentV1SaveMediaNoteData, ContentV1SaveMediaNoteResponse, ContentV1SaveMediaNoteResponses, ContentV1SearchData, ContentV1SearchResponse, ContentV1SearchResponses, ContentV1SearchSuggestionData, ContentV1SearchSuggestionResponse, ContentV1SearchSuggestionResponses, ContentV1UpdateMediaWatchData, ContentV1UpdateMediaWatchResponses, CourseAssetsSpec, CourseCategorySaveSpec, CourseCategorySchema, CourseCategorySpec, CourseCertificateItemSchema, CourseCertificateRequestSchema, CourseCertificateSaveSpec, CourseCertificateSchema, CourseCertificateSpec, CourseDetailSchema, CourseEngagementSchema, CourseGradebookSchema, CourseInstructorItemSchema, CourseInstructorSaveSpec, CourseInstructorSchema, CourseInstructorSpec, CourseRelationItemSchema, CourseRelationSaveSpec, CourseRelationSchema, CourseRelationSpec, CourseSaveSpec, CourseSchema, CourseSessionSchema, CourseSpec, CourseSurveyItemSchema, CourseSurveySaveSpec, CourseSurveySchema, CourseSurveySpec, CourseV1GetDetailData, CourseV1GetDetailResponse, CourseV1GetDetailResponses, CourseV1GetSessionData, CourseV1GetSessionResponse, CourseV1GetSessionResponses, CourseV1RequestCertificateData, CourseV1RequestCertificateResponse, CourseV1RequestCertificateResponses, CourseV1StartEngagementData, CourseV1StartEngagementResponse, CourseV1StartEngagementResponses, DeviceRegisterSchema, DeviceSchema, DiscussionAttemptSchema, DiscussionEarnedDetailsSaveSchema, DiscussionEarnedDetailsSchema, DiscussionFeedbackSaveSchema, DiscussionFeedbackSchema, DiscussionGradeSchema, DiscussionOwnPostSchema, DiscussionPostCountSchema, DiscussionPostNestedSchema, DiscussionPostSaveSchema, DiscussionPostSchema, DiscussionPostWithCountSchema, DiscussionQuestionSaveSpec, DiscussionQuestionSchema, DiscussionQuestionSpec, DiscussionQuestionsSaveSpec, DiscussionQuestionsSpec, DiscussionSaveSpec, DiscussionSchema, DiscussionSessionSchema, DiscussionSpec, DiscussionV1CreatePostData, DiscussionV1CreatePostResponse, DiscussionV1CreatePostResponses, DiscussionV1DeactivateAttemptData, DiscussionV1DeactivateAttemptResponses, DiscussionV1DeletePostData, DiscussionV1DeletePostResponses, DiscussionV1GetOwnPostsData, DiscussionV1GetOwnPostsResponse, DiscussionV1GetOwnPostsResponses, DiscussionV1GetPostsData, DiscussionV1GetPostsResponse, DiscussionV1GetPostsResponses, DiscussionV1GetSessionData, DiscussionV1GetSessionResponse, DiscussionV1GetSessionResponses, DiscussionV1StartAttemptData, DiscussionV1StartAttemptResponse, DiscussionV1StartAttemptResponses, DiscussionV1UpdatePostData, DiscussionV1UpdatePostResponse, DiscussionV1UpdatePostResponses, EnrollmentContentSchema, EnrollmentSchema, EnrollmentSuccessSchema, ExamAttemptAnswersSchema, ExamAttemptSchema, ExamGradeSchema, ExamQuestionFormatChoices, ExamQuestionPoolSchema, ExamQuestionPoolSpec, ExamQuestionSaveSpec, ExamQuestionSchema, ExamQuestionSolutionSpec, ExamQuestionSpec, ExamQuestionsSaveSpec, ExamQuestionsSpec, ExamSaveSpec, ExamSchema, ExamSessionSchema, ExamSolutionSchema, ExamSpec, ExamSubmissionSchema, ExamV1DeactivateAttemptData, ExamV1DeactivateAttemptResponses, ExamV1GetSessionData, ExamV1GetSessionResponse, ExamV1GetSessionResponses, ExamV1GetTimestampData, ExamV1GetTimestampResponse, ExamV1GetTimestampResponses, ExamV1SaveAnswersData, ExamV1SaveAnswersResponses, ExamV1StartAttemptData, ExamV1StartAttemptResponse, ExamV1StartAttemptResponses, ExamV1SubmitAttemptData, ExamV1SubmitAttemptResponse, ExamV1SubmitAttemptResponses, FactoryDataSchema, FaqItemSchema, FaqSchema, GradingCriterionSchema, GradingDate, GradingDateSchema, GradingPolicySpec, HonorCodeSchema, InlineSuggestionSpec, Input, InquiryCreateSchema, InquiryFilterSchema, InquiryResponseSchema, InquirySavedSchema, InquirySchema, InquiryUpdateSchema, JoinSchema, KindChoices, LearningRecordSchema, LearningReportSchema, LearningSessionStep, LearningV1EnrollCatalogItemData, LearningV1EnrollCatalogItemResponse, LearningV1EnrollCatalogItemResponses, LearningV1GetCatalogItemsData, LearningV1GetCatalogItemsResponse, LearningV1GetCatalogItemsResponses, LearningV1GetCatalogsData, LearningV1GetCatalogsResponse, LearningV1GetCatalogsResponses, LearningV1GetEnrolledData, LearningV1GetEnrolledResponse, LearningV1GetEnrolledResponses, LearningV1GetRecordsData, LearningV1GetRecordsResponse, LearningV1GetRecordsResponses, LearningV1GetReportData, LearningV1GetReportResponse, LearningV1GetReportResponses, LearningV1UnenrollData, LearningV1UnenrollResponses, LessonMediaItemSchema, LessonMediaSchema, LessonSaveSpec, LessonSchema, LessonSpec, LevelChoices, LoginSchema, MatchedLineSchema, MediaFormatChoices, MediaSaveSpec, MediaSchema, MediaSpec, MessageDataSchema, MessageSchema, MinimaApiHealthData, MinimaApiHealthResponses, NoteSaveSchema, NoteSchema, OperationV1AgreePoliciesData, OperationV1AgreePoliciesResponses, OperationV1CreateAppealData, OperationV1CreateAppealResponse, OperationV1CreateAppealResponses, OperationV1CreateInquiryData, OperationV1CreateInquiryResponse, OperationV1CreateInquiryResponses, OperationV1CreateThreadData, OperationV1CreateThreadResponse, OperationV1CreateThreadResponses, OperationV1DeleteCommentData, OperationV1DeleteCommentResponses, OperationV1DeleteDeviceData, OperationV1DeleteDeviceResponses, OperationV1EffectivePoliciesData, OperationV1EffectivePoliciesResponse, OperationV1EffectivePoliciesResponses, OperationV1GetAnnouncementsData, OperationV1GetAnnouncementsResponse, OperationV1GetAnnouncementsResponses, OperationV1GetCommentsData, OperationV1GetCommentsResponse, OperationV1GetCommentsResponses, OperationV1GetDevicesData, OperationV1GetDevicesResponse, OperationV1GetDevicesResponses, OperationV1GetInquiriesData, OperationV1GetInquiriesResponse, OperationV1GetInquiriesResponses, OperationV1GetThreadCommentsData, OperationV1GetThreadCommentsResponse, OperationV1GetThreadCommentsResponses, OperationV1GetThreadData, OperationV1GetThreadResponse, OperationV1GetThreadResponses, OperationV1GetUnreadMessagesData, OperationV1GetUnreadMessagesResponse, OperationV1GetUnreadMessagesResponses, OperationV1ReadAnnouncementData, OperationV1ReadAnnouncementResponses, OperationV1ReadMessageData, OperationV1ReadMessageResponses, OperationV1RegisterDeviceData, OperationV1RegisterDeviceResponse, OperationV1RegisterDeviceResponses, OperationV1SaveCommentData, OperationV1SaveCommentResponse, OperationV1SaveCommentResponses, OperationV1ToggleDeviceActiveData, OperationV1ToggleDeviceActiveResponses, OperationV1UpdateInquiryData, OperationV1UpdateInquiryResponse, OperationV1UpdateInquiryResponses, OtpSetupCompleteSchema, OtpSetupSchema, OtpVerifySchema, OwnerSchema, PagedAnnounceSchema, PagedCertificateAwardSchema, PagedChatMessageSchema, PagedCommentBriefSchema, PagedCommentNestedSchema, PagedDiscussionPostNestedSchema, PagedInquirySchema, PagedMessageSchema, PagedTutorAssignmentGradeSchema, PagedTutorDiscussionGradeSchema, PagedTutorExamGradeSchema, PagedWatchedMediaSchema, PaginatedResponseAllocationSchema, PaginatedResponseCatalogItemSchema, PaginatedResponseEnrollmentSchema, PaginatedResponseSearchedMediaSchema, PaginatedResponseStudioContentSpec, PartnerGroupMemberSchema, PartnerGroupSchema, PartnerSchema, PartnerV1MemberInfosData, PartnerV1MemberInfosResponse, PartnerV1MemberInfosResponses, PerformanceLevelSchema, PolicyVersionAgreementSchema, QuizAttemptAnswersSchema, QuizAttemptSchema, QuizGradeSchema, QuizQuestionPoolSpec, QuizQuestionSaveSpec, QuizQuestionSchema, QuizQuestionSolutionSpec, QuizQuestionSpec, QuizQuestionsSaveSpec, QuizQuestionsSpec, QuizSaveSpec, QuizSchema, QuizSessionSchema, QuizSolutionSchema, QuizSpec, QuizSubmissionSchema, QuizV1DeactivateAttemptData, QuizV1DeactivateAttemptResponses, QuizV1GetSessionData, QuizV1GetSessionResponse, QuizV1GetSessionResponses, QuizV1StartAttemptData, QuizV1StartAttemptResponse, QuizV1StartAttemptResponses, QuizV1SubmitAttemptData, QuizV1SubmitAttemptResponse, QuizV1SubmitAttemptResponses, RequestActivationSchema, RequestEmailChangeSchema, RequestPasswordChangeSchema, RoleChoices, RootModelListAssessmentSaveSpec, RootModelListCourseCategorySaveSpec, RootModelListCourseCertificateSaveSpec, RootModelListCourseInstructorSaveSpec, RootModelListCourseRelationSaveSpec, RootModelListCourseSurveySaveSpec, RootModelListLessonSaveSpec, RootModelListRubricCriterionSpec, RubricCriterionSchema, RubricCriterionSpec, RubricSchema, ScoreStatsSchema, SearchedMediaSchema, SitePolicySchema, SitePolicyVersionSchema, SkillDataSchema, SsoAccountSchema, SsoV1AuthorizeData, SsoV1AuthorizeResponse, SsoV1AuthorizeResponses, SsoV1CallbackData, SsoV1CallbackResponses, SsoV1DeleteAccountData, SsoV1DeleteAccountResponses, SsoV1GetAccountsData, SsoV1GetAccountsResponse, SsoV1GetAccountsResponses, SsoV1LinkData, SsoV1LinkResponse, SsoV1LinkResponses, StudioContentSpec, StudioV1AssessmentSuggestionsData, StudioV1AssessmentSuggestionsResponse, StudioV1AssessmentSuggestionsResponses, StudioV1ContentData, StudioV1ContentResponse, StudioV1ContentResponses, StudioV1ContentSuggestionsData, StudioV1ContentSuggestionsResponse, StudioV1ContentSuggestionsResponses, StudioV1CreateMediaQuizData, StudioV1CreateMediaQuizResponse, StudioV1CreateMediaQuizResponses, StudioV1DeleteAssignmentData, StudioV1DeleteAssignmentQuesionData, StudioV1DeleteAssignmentQuesionResponses, StudioV1DeleteAssignmentResponses, StudioV1DeleteCourseData, StudioV1DeleteCourseResponses, StudioV1DeleteDiscussionData, StudioV1DeleteDiscussionQuesionData, StudioV1DeleteDiscussionQuesionResponses, StudioV1DeleteDiscussionResponses, StudioV1DeleteExamData, StudioV1DeleteExamQuesionData, StudioV1DeleteExamQuesionResponses, StudioV1DeleteExamResponses, StudioV1DeleteMediaData, StudioV1DeleteMediaResponses, StudioV1DeleteMediaSubtitleData, StudioV1DeleteMediaSubtitleResponses, StudioV1DeleteQuizData, StudioV1DeleteQuizQuesionData, StudioV1DeleteQuizQuesionResponses, StudioV1DeleteQuizResponses, StudioV1DeleteSurveyData, StudioV1DeleteSurveyQuesionData, StudioV1DeleteSurveyQuesionResponses, StudioV1DeleteSurveyResponses, StudioV1GetAssignmentData, StudioV1GetAssignmentQuestionsData, StudioV1GetAssignmentQuestionsResponse, StudioV1GetAssignmentQuestionsResponses, StudioV1GetAssignmentResponse, StudioV1GetAssignmentResponses, StudioV1GetAssignmentRubricData, StudioV1GetAssignmentRubricResponse, StudioV1GetAssignmentRubricResponses, StudioV1GetCourseData, StudioV1GetCourseResponse, StudioV1GetCourseResponses, StudioV1GetDiscussionData, StudioV1GetDiscussionQuestionsData, StudioV1GetDiscussionQuestionsResponse, StudioV1GetDiscussionQuestionsResponses, StudioV1GetDiscussionResponse, StudioV1GetDiscussionResponses, StudioV1GetExamData, StudioV1GetExamQuestionsData, StudioV1GetExamQuestionsResponse, StudioV1GetExamQuestionsResponses, StudioV1GetExamResponse, StudioV1GetExamResponses, StudioV1GetMediaData, StudioV1GetMediaResponse, StudioV1GetMediaResponses, StudioV1GetQuizData, StudioV1GetQuizQuestionsData, StudioV1GetQuizQuestionsResponse, StudioV1GetQuizQuestionsResponses, StudioV1GetQuizResponse, StudioV1GetQuizResponses, StudioV1GetSurveyData, StudioV1GetSurveyQuestionsData, StudioV1GetSurveyQuestionsResponse, StudioV1GetSurveyQuestionsResponses, StudioV1GetSurveyResponse, StudioV1GetSurveyResponses, StudioV1InlineSuggestionsData, StudioV1InlineSuggestionsResponse, StudioV1InlineSuggestionsResponses, StudioV1RemoveCourseAssessmentData, StudioV1RemoveCourseAssessmentResponses, StudioV1RemoveCourseCategoryData, StudioV1RemoveCourseCategoryResponses, StudioV1RemoveCourseCertificateData, StudioV1RemoveCourseCertificateResponses, StudioV1RemoveCourseInstructorData, StudioV1RemoveCourseInstructorResponses, StudioV1RemoveCourseLessonData, StudioV1RemoveCourseLessonResponses, StudioV1RemoveCourseRelationData, StudioV1RemoveCourseRelationResponses, StudioV1RemoveCourseSurveyData, StudioV1RemoveCourseSurveyResponses, StudioV1SaveAssignmentData, StudioV1SaveAssignmentQuestionsData, StudioV1SaveAssignmentQuestionsResponse, StudioV1SaveAssignmentQuestionsResponses, StudioV1SaveAssignmentResponse, StudioV1SaveAssignmentResponses, StudioV1SaveAssignmentRubricData, StudioV1SaveAssignmentRubricResponses, StudioV1SaveCourseAssessmentsData, StudioV1SaveCourseAssessmentsResponse, StudioV1SaveCourseAssessmentsResponses, StudioV1SaveCourseCategoriesData, StudioV1SaveCourseCategoriesResponse, StudioV1SaveCourseCategoriesResponses, StudioV1SaveCourseCertificatesData, StudioV1SaveCourseCertificatesResponse, StudioV1SaveCourseCertificatesResponses, StudioV1SaveCourseData, StudioV1SaveCourseInstructorsData, StudioV1SaveCourseInstructorsResponse, StudioV1SaveCourseInstructorsResponses, StudioV1SaveCourseLessonsData, StudioV1SaveCourseLessonsResponse, StudioV1SaveCourseLessonsResponses, StudioV1SaveCourseRelationsData, StudioV1SaveCourseRelationsResponse, StudioV1SaveCourseRelationsResponses, StudioV1SaveCourseResponse, StudioV1SaveCourseResponses, StudioV1SaveCourseSurveysData, StudioV1SaveCourseSurveysResponse, StudioV1SaveCourseSurveysResponses, StudioV1SaveDiscussionData, StudioV1SaveDiscussionQuestionsData, StudioV1SaveDiscussionQuestionsResponse, StudioV1SaveDiscussionQuestionsResponses, StudioV1SaveDiscussionResponse, StudioV1SaveDiscussionResponses, StudioV1SaveExamData, StudioV1SaveExamQuestionsData, StudioV1SaveExamQuestionsResponse, StudioV1SaveExamQuestionsResponses, StudioV1SaveExamResponse, StudioV1SaveExamResponses, StudioV1SaveMediaData, StudioV1SaveMediaResponse, StudioV1SaveMediaResponses, StudioV1SaveMediaSubtitleData, StudioV1SaveMediaSubtitleResponses, StudioV1SaveQuizData, StudioV1SaveQuizQuestionsData, StudioV1SaveQuizQuestionsResponse, StudioV1SaveQuizQuestionsResponses, StudioV1SaveQuizResponse, StudioV1SaveQuizResponses, StudioV1SaveSurveyData, StudioV1SaveSurveyQuestionsData, StudioV1SaveSurveyQuestionsResponse, StudioV1SaveSurveyQuestionsResponses, StudioV1SaveSurveyResponse, StudioV1SaveSurveyResponses, SubtitleSchema, SubtitleSpec, SurveyAnswersSchema, SurveyQuestionFormatChoices, SurveyQuestionSaveSpec, SurveyQuestionSchema, SurveyQuestionSpec, SurveyQuestionsSaveSpec, SurveyQuestionsSpec, SurveySaveSpec, SurveySchema, SurveySpec, SurveyV1GetAnonymousSurveyData, SurveyV1GetAnonymousSurveyResponse, SurveyV1GetAnonymousSurveyResponses, SurveyV1GetSurveyData, SurveyV1GetSurveyResponse, SurveyV1GetSurveyResponses, SurveyV1ResultsAnonymousData, SurveyV1ResultsAnonymousResponse, SurveyV1ResultsAnonymousResponses, SurveyV1ResultsData, SurveyV1ResultsResponse, SurveyV1ResultsResponses, SurveyV1SubmitAnonymousData, SurveyV1SubmitAnonymousResponses, SurveyV1SubmitData, SurveyV1SubmitResponses, ThreadCreateSchema, ThreadSchema, TotpDeviceSchema, TutorAssignmentGradePaperSchema, TutorAssignmentGradeSchema, TutorContentSchema, TutorDiscussionGradePaperSchema, TutorDiscussionGradeSaveSchema, TutorDiscussionGradeSchema, TutorExamGradePaperSchema, TutorExamGradeSchema, TutorExamQuestionSchema, TutorGradeSaveSchema, TutorGraeCompleteSchema, TutorV1CompleteAssignmentGradeData, TutorV1CompleteAssignmentGradeResponse, TutorV1CompleteAssignmentGradeResponses, TutorV1CompleteDiscussionGradeData, TutorV1CompleteDiscussionGradeResponse, TutorV1CompleteDiscussionGradeResponses, TutorV1CompleteExamGradeData, TutorV1CompleteExamGradeResponse, TutorV1CompleteExamGradeResponses, TutorV1GetAllocationData, TutorV1GetAllocationResponse, TutorV1GetAllocationResponses, TutorV1GetAllocationStatsData, TutorV1GetAllocationStatsResponse, TutorV1GetAllocationStatsResponses, TutorV1GetAssignmentGradePaperData, TutorV1GetAssignmentGradePaperResponse, TutorV1GetAssignmentGradePaperResponses, TutorV1GetAssignmentGradesData, TutorV1GetAssignmentGradesResponse, TutorV1GetAssignmentGradesResponses, TutorV1GetAssignmentRubricData, TutorV1GetAssignmentRubricResponse, TutorV1GetAssignmentRubricResponses, TutorV1GetDiscussionGradePaperData, TutorV1GetDiscussionGradePaperResponse, TutorV1GetDiscussionGradePaperResponses, TutorV1GetDiscussionGradesData, TutorV1GetDiscussionGradesResponse, TutorV1GetDiscussionGradesResponses, TutorV1GetExamGradePaperData, TutorV1GetExamGradePaperResponse, TutorV1GetExamGradePaperResponses, TutorV1GetExamGradesData, TutorV1GetExamGradesResponse, TutorV1GetExamGradesResponses, UserSchema, UserUpdateSchema, WatchedMediaSchema, WatchInSchema, WatchOutSchema } from './types.gen'; +export { accountV1Activate, accountV1ApplyEmailChange, accountV1ApplyPasswordChange, accountV1CompleteOtpSetup, accountV1GetMe, accountV1Join, accountV1Login, accountV1Logout, accountV1RequestActivation, accountV1RequestEmailChange, accountV1RequestPasswordChange, accountV1ResetOtp, accountV1SetupOtp, accountV1UpdateMe, accountV1UploadAvatar, accountV1VerifyOtp, assignmentV1DeactivateAttempt, assignmentV1GetSession, assignmentV1StartAttempt, assignmentV1SubmitAttempt, assistantV1ChatMessage, assistantV1DeleteChat, assistantV1GetChatMessages, assistantV1GetChats, assistantV1SaveAssistantNote, assistantV1UpdateChatMessage, competencyV1DeleteCompetencyGoal, competencyV1GetCertificateAwards, competencyV1GetCertificates, competencyV1GetClassificationSkillsData, competencyV1GetClassificationTree, competencyV1GetCompetencyGoals, competencyV1SaveCompetencyGoal, contentV1DeleteMediaWatch, contentV1GetMedia, contentV1GetMediaNote, contentV1GetMediaWatch, contentV1GetSubtitles, contentV1GetWatchMedias, contentV1SaveMediaNote, contentV1Search, contentV1SearchSuggestion, contentV1UpdateMediaWatch, courseV1GetDetail, courseV1GetSession, courseV1RequestCertificate, courseV1StartEngagement, discussionV1CreatePost, discussionV1DeactivateAttempt, discussionV1DeletePost, discussionV1GetOwnPosts, discussionV1GetPosts, discussionV1GetSession, discussionV1StartAttempt, discussionV1UpdatePost, examV1DeactivateAttempt, examV1GetSession, examV1GetTimestamp, examV1SaveAnswers, examV1StartAttempt, examV1SubmitAttempt, learningV1EnrollCatalogItem, learningV1GetCatalogItems, learningV1GetCatalogs, learningV1GetEnrolled, learningV1GetRecords, learningV1GetReport, learningV1Unenroll, minimaApiHealth, operationV1AgreePolicies, operationV1CreateAppeal, operationV1CreateInquiry, operationV1CreateThread, operationV1DeleteComment, operationV1DeleteDevice, operationV1EffectivePolicies, operationV1GetAnnouncements, operationV1GetComments, operationV1GetDevices, operationV1GetInquiries, operationV1GetThread, operationV1GetThreadComments, operationV1GetUnreadMessages, operationV1ReadAnnouncement, operationV1ReadMessage, operationV1RegisterDevice, operationV1SaveComment, operationV1ToggleDeviceActive, operationV1UpdateInquiry, type Options, partnerV1MemberInfos, quizV1DeactivateAttempt, quizV1GetSession, quizV1StartAttempt, quizV1SubmitAttempt, ssoV1Authorize, ssoV1Callback, ssoV1DeleteAccount, ssoV1GetAccounts, ssoV1Link, studioV1AssessmentSuggestions, studioV1Content, studioV1ContentSuggestions, studioV1CreateMediaQuiz, studioV1DeleteAssignment, studioV1DeleteAssignmentQuesion, studioV1DeleteCourse, studioV1DeleteDiscussion, studioV1DeleteDiscussionQuesion, studioV1DeleteExam, studioV1DeleteExamQuesion, studioV1DeleteMedia, studioV1DeleteMediaSubtitle, studioV1DeleteQuiz, studioV1DeleteQuizQuesion, studioV1DeleteSurvey, studioV1DeleteSurveyQuesion, studioV1GetAssignment, studioV1GetAssignmentQuestions, studioV1GetAssignmentRubric, studioV1GetCourse, studioV1GetDiscussion, studioV1GetDiscussionQuestions, studioV1GetExam, studioV1GetExamQuestions, studioV1GetMedia, studioV1GetQuiz, studioV1GetQuizQuestions, studioV1GetSurvey, studioV1GetSurveyQuestions, studioV1InlineSuggestions, studioV1RemoveCourseAssessment, studioV1RemoveCourseCategory, studioV1RemoveCourseCertificate, studioV1RemoveCourseInstructor, studioV1RemoveCourseLesson, studioV1RemoveCourseRelation, studioV1RemoveCourseSurvey, studioV1SaveAssignment, studioV1SaveAssignmentQuestions, studioV1SaveAssignmentRubric, studioV1SaveCourse, studioV1SaveCourseAssessments, studioV1SaveCourseCategories, studioV1SaveCourseCertificates, studioV1SaveCourseInstructors, studioV1SaveCourseLessons, studioV1SaveCourseRelations, studioV1SaveCourseSurveys, studioV1SaveDiscussion, studioV1SaveDiscussionQuestions, studioV1SaveExam, studioV1SaveExamQuestions, studioV1SaveMedia, studioV1SaveMediaSubtitle, studioV1SaveQuiz, studioV1SaveQuizQuestions, studioV1SaveSurvey, studioV1SaveSurveyQuestions, surveyV1GetAnonymousSurvey, surveyV1GetSurvey, surveyV1Results, surveyV1ResultsAnonymous, surveyV1Submit, surveyV1SubmitAnonymous, tutorV1CompleteAssignmentGrade, tutorV1CompleteDiscussionGrade, tutorV1CompleteExamGrade, tutorV1GetAllocation, tutorV1GetAllocationStats, tutorV1GetAppeals, tutorV1GetAssignmentGradePaper, tutorV1GetAssignmentGrades, tutorV1GetAssignmentRubric, tutorV1GetDiscussionGradePaper, tutorV1GetDiscussionGrades, tutorV1GetExamGradePaper, tutorV1GetExamGrades, tutorV1ReviewAppeal } from './sdk.gen'; +export type { AccessDateSchema, AccountActivatedSchema, AccountActivateSchema, AccountV1ActivateData, AccountV1ActivateResponse, AccountV1ActivateResponses, AccountV1ApplyEmailChangeData, AccountV1ApplyEmailChangeResponses, AccountV1ApplyPasswordChangeData, AccountV1ApplyPasswordChangeResponses, AccountV1CompleteOtpSetupData, AccountV1CompleteOtpSetupResponse, AccountV1CompleteOtpSetupResponses, AccountV1GetMeData, AccountV1GetMeResponse, AccountV1GetMeResponses, AccountV1JoinData, AccountV1JoinResponses, AccountV1LoginData, AccountV1LoginResponse, AccountV1LoginResponses, AccountV1LogoutData, AccountV1LogoutResponses, AccountV1RequestActivationData, AccountV1RequestActivationResponses, AccountV1RequestEmailChangeData, AccountV1RequestEmailChangeResponses, AccountV1RequestPasswordChangeData, AccountV1RequestPasswordChangeResponses, AccountV1ResetOtpData, AccountV1ResetOtpResponses, AccountV1SetupOtpData, AccountV1SetupOtpResponse, AccountV1SetupOtpResponses, AccountV1UpdateMeData, AccountV1UpdateMeResponse, AccountV1UpdateMeResponses, AccountV1UploadAvatarData, AccountV1UploadAvatarResponse, AccountV1UploadAvatarResponses, AccountV1VerifyOtpData, AccountV1VerifyOtpResponses, AllocationSchema, AllocationStatsSchema, AnnounceSchema, AppealCreateSchema, AppealReviewSchema, AppealSchema, ApplyEmailChangeSchema, ApplyPasswordChangeSchema, AssessmentSaveSpec, AssessmentSpec, AssessmentSuggestionSpec, AssignmentAttemptSchema, AssignmentGradeSchema, AssignmentQuestionSaveSpec, AssignmentQuestionSchema, AssignmentQuestionSpec, AssignmentQuestionsSaveSpec, AssignmentQuestionsSpec, AssignmentSaveSpec, AssignmentSchema, AssignmentSessionSchema, AssignmentSpec, AssignmentSubmissionSchema, AssignmentSubmitSchema, AssignmentV1DeactivateAttemptData, AssignmentV1DeactivateAttemptResponses, AssignmentV1GetSessionData, AssignmentV1GetSessionResponse, AssignmentV1GetSessionResponses, AssignmentV1StartAttemptData, AssignmentV1StartAttemptResponse, AssignmentV1StartAttemptResponses, AssignmentV1SubmitAttemptData, AssignmentV1SubmitAttemptResponse, AssignmentV1SubmitAttemptResponses, AssistantNoteSaveSchema, AssistantV1ChatMessageData, AssistantV1ChatMessageResponses, AssistantV1DeleteChatData, AssistantV1DeleteChatResponses, AssistantV1GetChatMessagesData, AssistantV1GetChatMessagesResponse, AssistantV1GetChatMessagesResponses, AssistantV1GetChatsData, AssistantV1GetChatsResponse, AssistantV1GetChatsResponses, AssistantV1SaveAssistantNoteData, AssistantV1SaveAssistantNoteResponses, AssistantV1UpdateChatMessageData, AssistantV1UpdateChatMessageResponses, AuthorizeResponseSchema, AuthorizeSchema, CatalogContentSchema, CatalogItemEnrollSchema, CatalogItemSchema, CatalogSchema, CertificateAwardSchema, CertificateEndorsementSchema, CertificateFilterSchema, CertificateSchema, CertificateSkillSchema, ChatListSchema, ChatMessageCreateSchema, ChatMessageSchema, ChatMessageUpdateSchema, ChatSchema, ClassificationSchema, ClassificationTreeNodeSchema, ClientOptions, CohortSchema, CohortStaffSchema, CommentBriefSchema, CommentNestedSchema, CommentSavedSchema, CommentSaveSchema, CommentSchema, CommentThreadSchema, CompetencyFactorySchema, CompetencyGoalSaveSchema, CompetencyGoalSchema, CompetencySkillSchema, CompetencyV1DeleteCompetencyGoalData, CompetencyV1DeleteCompetencyGoalResponses, CompetencyV1GetCertificateAwardsData, CompetencyV1GetCertificateAwardsResponse, CompetencyV1GetCertificateAwardsResponses, CompetencyV1GetCertificatesData, CompetencyV1GetCertificatesResponse, CompetencyV1GetCertificatesResponses, CompetencyV1GetClassificationSkillsDataData, CompetencyV1GetClassificationSkillsDataResponse, CompetencyV1GetClassificationSkillsDataResponses, CompetencyV1GetClassificationTreeData, CompetencyV1GetClassificationTreeResponse, CompetencyV1GetClassificationTreeResponses, CompetencyV1GetCompetencyGoalsData, CompetencyV1GetCompetencyGoalsResponse, CompetencyV1GetCompetencyGoalsResponses, CompetencyV1SaveCompetencyGoalData, CompetencyV1SaveCompetencyGoalResponse, CompetencyV1SaveCompetencyGoalResponses, ContentSuggestionSpec, ContentTypeSchema, ContentV1DeleteMediaWatchData, ContentV1DeleteMediaWatchResponses, ContentV1GetMediaData, ContentV1GetMediaNoteData, ContentV1GetMediaNoteResponse, ContentV1GetMediaNoteResponses, ContentV1GetMediaResponse, ContentV1GetMediaResponses, ContentV1GetMediaWatchData, ContentV1GetMediaWatchResponse, ContentV1GetMediaWatchResponses, ContentV1GetSubtitlesData, ContentV1GetSubtitlesResponse, ContentV1GetSubtitlesResponses, ContentV1GetWatchMediasData, ContentV1GetWatchMediasResponse, ContentV1GetWatchMediasResponses, ContentV1SaveMediaNoteData, ContentV1SaveMediaNoteResponse, ContentV1SaveMediaNoteResponses, ContentV1SearchData, ContentV1SearchResponse, ContentV1SearchResponses, ContentV1SearchSuggestionData, ContentV1SearchSuggestionResponse, ContentV1SearchSuggestionResponses, ContentV1UpdateMediaWatchData, ContentV1UpdateMediaWatchResponses, CourseAssetsSpec, CourseCategorySaveSpec, CourseCategorySchema, CourseCategorySpec, CourseCertificateItemSchema, CourseCertificateRequestSchema, CourseCertificateSaveSpec, CourseCertificateSchema, CourseCertificateSpec, CourseDetailSchema, CourseEngagementSchema, CourseGradebookSchema, CourseInstructorItemSchema, CourseInstructorSaveSpec, CourseInstructorSchema, CourseInstructorSpec, CourseRelationItemSchema, CourseRelationSaveSpec, CourseRelationSchema, CourseRelationSpec, CourseSaveSpec, CourseSchema, CourseSessionSchema, CourseSpec, CourseSurveyItemSchema, CourseSurveySaveSpec, CourseSurveySchema, CourseSurveySpec, CourseV1GetDetailData, CourseV1GetDetailResponse, CourseV1GetDetailResponses, CourseV1GetSessionData, CourseV1GetSessionResponse, CourseV1GetSessionResponses, CourseV1RequestCertificateData, CourseV1RequestCertificateResponse, CourseV1RequestCertificateResponses, CourseV1StartEngagementData, CourseV1StartEngagementResponse, CourseV1StartEngagementResponses, DeviceRegisterSchema, DeviceSchema, DiscussionAttemptSchema, DiscussionEarnedDetailsSaveSchema, DiscussionEarnedDetailsSchema, DiscussionFeedbackSaveSchema, DiscussionFeedbackSchema, DiscussionGradeSchema, DiscussionOwnPostSchema, DiscussionPostCountSchema, DiscussionPostNestedSchema, DiscussionPostSaveSchema, DiscussionPostSchema, DiscussionPostWithCountSchema, DiscussionQuestionSaveSpec, DiscussionQuestionSchema, DiscussionQuestionSpec, DiscussionQuestionsSaveSpec, DiscussionQuestionsSpec, DiscussionSaveSpec, DiscussionSchema, DiscussionSessionSchema, DiscussionSpec, DiscussionV1CreatePostData, DiscussionV1CreatePostResponse, DiscussionV1CreatePostResponses, DiscussionV1DeactivateAttemptData, DiscussionV1DeactivateAttemptResponses, DiscussionV1DeletePostData, DiscussionV1DeletePostResponses, DiscussionV1GetOwnPostsData, DiscussionV1GetOwnPostsResponse, DiscussionV1GetOwnPostsResponses, DiscussionV1GetPostsData, DiscussionV1GetPostsResponse, DiscussionV1GetPostsResponses, DiscussionV1GetSessionData, DiscussionV1GetSessionResponse, DiscussionV1GetSessionResponses, DiscussionV1StartAttemptData, DiscussionV1StartAttemptResponse, DiscussionV1StartAttemptResponses, DiscussionV1UpdatePostData, DiscussionV1UpdatePostResponse, DiscussionV1UpdatePostResponses, EnrollmentContentSchema, EnrollmentSchema, EnrollmentSuccessSchema, ExamAttemptAnswersSchema, ExamAttemptSchema, ExamGradeSchema, ExamQuestionFormatChoices, ExamQuestionPoolSchema, ExamQuestionPoolSpec, ExamQuestionSaveSpec, ExamQuestionSchema, ExamQuestionSolutionSpec, ExamQuestionSpec, ExamQuestionsSaveSpec, ExamQuestionsSpec, ExamSaveSpec, ExamSchema, ExamSessionSchema, ExamSolutionSchema, ExamSpec, ExamSubmissionSchema, ExamV1DeactivateAttemptData, ExamV1DeactivateAttemptResponses, ExamV1GetSessionData, ExamV1GetSessionResponse, ExamV1GetSessionResponses, ExamV1GetTimestampData, ExamV1GetTimestampResponse, ExamV1GetTimestampResponses, ExamV1SaveAnswersData, ExamV1SaveAnswersResponses, ExamV1StartAttemptData, ExamV1StartAttemptResponse, ExamV1StartAttemptResponses, ExamV1SubmitAttemptData, ExamV1SubmitAttemptResponse, ExamV1SubmitAttemptResponses, FactoryDataSchema, FaqItemSchema, FaqSchema, GradeAppealSchema, GradingCriterionSchema, GradingDate, GradingDateSchema, GradingPolicySpec, HonorCodeSchema, InlineSuggestionSpec, Input, InquiryCreateSchema, InquiryFilterSchema, InquiryResponseSchema, InquirySavedSchema, InquirySchema, InquiryUpdateSchema, JoinSchema, KindChoices, LearningRecordSchema, LearningReportSchema, LearningSessionStep, LearningV1EnrollCatalogItemData, LearningV1EnrollCatalogItemResponse, LearningV1EnrollCatalogItemResponses, LearningV1GetCatalogItemsData, LearningV1GetCatalogItemsResponse, LearningV1GetCatalogItemsResponses, LearningV1GetCatalogsData, LearningV1GetCatalogsResponse, LearningV1GetCatalogsResponses, LearningV1GetEnrolledData, LearningV1GetEnrolledResponse, LearningV1GetEnrolledResponses, LearningV1GetRecordsData, LearningV1GetRecordsResponse, LearningV1GetRecordsResponses, LearningV1GetReportData, LearningV1GetReportResponse, LearningV1GetReportResponses, LearningV1UnenrollData, LearningV1UnenrollResponses, LessonMediaItemSchema, LessonMediaSchema, LessonSaveSpec, LessonSchema, LessonSpec, LevelChoices, LoginSchema, MatchedLineSchema, MediaFormatChoices, MediaSaveSpec, MediaSchema, MediaSpec, MessageDataSchema, MessageSchema, MinimaApiHealthData, MinimaApiHealthResponses, NoteSaveSchema, NoteSchema, OperationV1AgreePoliciesData, OperationV1AgreePoliciesResponses, OperationV1CreateAppealData, OperationV1CreateAppealResponse, OperationV1CreateAppealResponses, OperationV1CreateInquiryData, OperationV1CreateInquiryResponse, OperationV1CreateInquiryResponses, OperationV1CreateThreadData, OperationV1CreateThreadResponse, OperationV1CreateThreadResponses, OperationV1DeleteCommentData, OperationV1DeleteCommentResponses, OperationV1DeleteDeviceData, OperationV1DeleteDeviceResponses, OperationV1EffectivePoliciesData, OperationV1EffectivePoliciesResponse, OperationV1EffectivePoliciesResponses, OperationV1GetAnnouncementsData, OperationV1GetAnnouncementsResponse, OperationV1GetAnnouncementsResponses, OperationV1GetCommentsData, OperationV1GetCommentsResponse, OperationV1GetCommentsResponses, OperationV1GetDevicesData, OperationV1GetDevicesResponse, OperationV1GetDevicesResponses, OperationV1GetInquiriesData, OperationV1GetInquiriesResponse, OperationV1GetInquiriesResponses, OperationV1GetThreadCommentsData, OperationV1GetThreadCommentsResponse, OperationV1GetThreadCommentsResponses, OperationV1GetThreadData, OperationV1GetThreadResponse, OperationV1GetThreadResponses, OperationV1GetUnreadMessagesData, OperationV1GetUnreadMessagesResponse, OperationV1GetUnreadMessagesResponses, OperationV1ReadAnnouncementData, OperationV1ReadAnnouncementResponses, OperationV1ReadMessageData, OperationV1ReadMessageResponses, OperationV1RegisterDeviceData, OperationV1RegisterDeviceResponse, OperationV1RegisterDeviceResponses, OperationV1SaveCommentData, OperationV1SaveCommentResponse, OperationV1SaveCommentResponses, OperationV1ToggleDeviceActiveData, OperationV1ToggleDeviceActiveResponses, OperationV1UpdateInquiryData, OperationV1UpdateInquiryResponse, OperationV1UpdateInquiryResponses, OtpSetupCompleteSchema, OtpSetupSchema, OtpVerifySchema, OwnerSchema, PagedAnnounceSchema, PagedCertificateAwardSchema, PagedChatMessageSchema, PagedCommentBriefSchema, PagedCommentNestedSchema, PagedDiscussionPostNestedSchema, PagedInquirySchema, PagedMessageSchema, PagedTutorAssignmentGradeSchema, PagedTutorDiscussionGradeSchema, PagedTutorExamGradeSchema, PagedWatchedMediaSchema, PaginatedResponseAllocationSchema, PaginatedResponseCatalogItemSchema, PaginatedResponseEnrollmentSchema, PaginatedResponseGradeAppealSchema, PaginatedResponseSearchedMediaSchema, PaginatedResponseStudioContentSpec, PartnerGroupMemberSchema, PartnerGroupSchema, PartnerSchema, PartnerV1MemberInfosData, PartnerV1MemberInfosResponse, PartnerV1MemberInfosResponses, PerformanceLevelSchema, PolicyVersionAgreementSchema, QuizAttemptAnswersSchema, QuizAttemptSchema, QuizGradeSchema, QuizQuestionPoolSpec, QuizQuestionSaveSpec, QuizQuestionSchema, QuizQuestionSolutionSpec, QuizQuestionSpec, QuizQuestionsSaveSpec, QuizQuestionsSpec, QuizSaveSpec, QuizSchema, QuizSessionSchema, QuizSolutionSchema, QuizSpec, QuizSubmissionSchema, QuizV1DeactivateAttemptData, QuizV1DeactivateAttemptResponses, QuizV1GetSessionData, QuizV1GetSessionResponse, QuizV1GetSessionResponses, QuizV1StartAttemptData, QuizV1StartAttemptResponse, QuizV1StartAttemptResponses, QuizV1SubmitAttemptData, QuizV1SubmitAttemptResponse, QuizV1SubmitAttemptResponses, RequestActivationSchema, RequestEmailChangeSchema, RequestPasswordChangeSchema, RoleChoices, RootModelListAssessmentSaveSpec, RootModelListCourseCategorySaveSpec, RootModelListCourseCertificateSaveSpec, RootModelListCourseInstructorSaveSpec, RootModelListCourseRelationSaveSpec, RootModelListCourseSurveySaveSpec, RootModelListLessonSaveSpec, RootModelListRubricCriterionSpec, RubricCriterionSchema, RubricCriterionSpec, RubricSchema, ScoreStatsSchema, SearchedMediaSchema, SitePolicySchema, SitePolicyVersionSchema, SkillDataSchema, SsoAccountSchema, SsoV1AuthorizeData, SsoV1AuthorizeResponse, SsoV1AuthorizeResponses, SsoV1CallbackData, SsoV1CallbackResponses, SsoV1DeleteAccountData, SsoV1DeleteAccountResponses, SsoV1GetAccountsData, SsoV1GetAccountsResponse, SsoV1GetAccountsResponses, SsoV1LinkData, SsoV1LinkResponse, SsoV1LinkResponses, StudioContentSpec, StudioV1AssessmentSuggestionsData, StudioV1AssessmentSuggestionsResponse, StudioV1AssessmentSuggestionsResponses, StudioV1ContentData, StudioV1ContentResponse, StudioV1ContentResponses, StudioV1ContentSuggestionsData, StudioV1ContentSuggestionsResponse, StudioV1ContentSuggestionsResponses, StudioV1CreateMediaQuizData, StudioV1CreateMediaQuizResponse, StudioV1CreateMediaQuizResponses, StudioV1DeleteAssignmentData, StudioV1DeleteAssignmentQuesionData, StudioV1DeleteAssignmentQuesionResponses, StudioV1DeleteAssignmentResponses, StudioV1DeleteCourseData, StudioV1DeleteCourseResponses, StudioV1DeleteDiscussionData, StudioV1DeleteDiscussionQuesionData, StudioV1DeleteDiscussionQuesionResponses, StudioV1DeleteDiscussionResponses, StudioV1DeleteExamData, StudioV1DeleteExamQuesionData, StudioV1DeleteExamQuesionResponses, StudioV1DeleteExamResponses, StudioV1DeleteMediaData, StudioV1DeleteMediaResponses, StudioV1DeleteMediaSubtitleData, StudioV1DeleteMediaSubtitleResponses, StudioV1DeleteQuizData, StudioV1DeleteQuizQuesionData, StudioV1DeleteQuizQuesionResponses, StudioV1DeleteQuizResponses, StudioV1DeleteSurveyData, StudioV1DeleteSurveyQuesionData, StudioV1DeleteSurveyQuesionResponses, StudioV1DeleteSurveyResponses, StudioV1GetAssignmentData, StudioV1GetAssignmentQuestionsData, StudioV1GetAssignmentQuestionsResponse, StudioV1GetAssignmentQuestionsResponses, StudioV1GetAssignmentResponse, StudioV1GetAssignmentResponses, StudioV1GetAssignmentRubricData, StudioV1GetAssignmentRubricResponse, StudioV1GetAssignmentRubricResponses, StudioV1GetCourseData, StudioV1GetCourseResponse, StudioV1GetCourseResponses, StudioV1GetDiscussionData, StudioV1GetDiscussionQuestionsData, StudioV1GetDiscussionQuestionsResponse, StudioV1GetDiscussionQuestionsResponses, StudioV1GetDiscussionResponse, StudioV1GetDiscussionResponses, StudioV1GetExamData, StudioV1GetExamQuestionsData, StudioV1GetExamQuestionsResponse, StudioV1GetExamQuestionsResponses, StudioV1GetExamResponse, StudioV1GetExamResponses, StudioV1GetMediaData, StudioV1GetMediaResponse, StudioV1GetMediaResponses, StudioV1GetQuizData, StudioV1GetQuizQuestionsData, StudioV1GetQuizQuestionsResponse, StudioV1GetQuizQuestionsResponses, StudioV1GetQuizResponse, StudioV1GetQuizResponses, StudioV1GetSurveyData, StudioV1GetSurveyQuestionsData, StudioV1GetSurveyQuestionsResponse, StudioV1GetSurveyQuestionsResponses, StudioV1GetSurveyResponse, StudioV1GetSurveyResponses, StudioV1InlineSuggestionsData, StudioV1InlineSuggestionsResponse, StudioV1InlineSuggestionsResponses, StudioV1RemoveCourseAssessmentData, StudioV1RemoveCourseAssessmentResponses, StudioV1RemoveCourseCategoryData, StudioV1RemoveCourseCategoryResponses, StudioV1RemoveCourseCertificateData, StudioV1RemoveCourseCertificateResponses, StudioV1RemoveCourseInstructorData, StudioV1RemoveCourseInstructorResponses, StudioV1RemoveCourseLessonData, StudioV1RemoveCourseLessonResponses, StudioV1RemoveCourseRelationData, StudioV1RemoveCourseRelationResponses, StudioV1RemoveCourseSurveyData, StudioV1RemoveCourseSurveyResponses, StudioV1SaveAssignmentData, StudioV1SaveAssignmentQuestionsData, StudioV1SaveAssignmentQuestionsResponse, StudioV1SaveAssignmentQuestionsResponses, StudioV1SaveAssignmentResponse, StudioV1SaveAssignmentResponses, StudioV1SaveAssignmentRubricData, StudioV1SaveAssignmentRubricResponses, StudioV1SaveCourseAssessmentsData, StudioV1SaveCourseAssessmentsResponse, StudioV1SaveCourseAssessmentsResponses, StudioV1SaveCourseCategoriesData, StudioV1SaveCourseCategoriesResponse, StudioV1SaveCourseCategoriesResponses, StudioV1SaveCourseCertificatesData, StudioV1SaveCourseCertificatesResponse, StudioV1SaveCourseCertificatesResponses, StudioV1SaveCourseData, StudioV1SaveCourseInstructorsData, StudioV1SaveCourseInstructorsResponse, StudioV1SaveCourseInstructorsResponses, StudioV1SaveCourseLessonsData, StudioV1SaveCourseLessonsResponse, StudioV1SaveCourseLessonsResponses, StudioV1SaveCourseRelationsData, StudioV1SaveCourseRelationsResponse, StudioV1SaveCourseRelationsResponses, StudioV1SaveCourseResponse, StudioV1SaveCourseResponses, StudioV1SaveCourseSurveysData, StudioV1SaveCourseSurveysResponse, StudioV1SaveCourseSurveysResponses, StudioV1SaveDiscussionData, StudioV1SaveDiscussionQuestionsData, StudioV1SaveDiscussionQuestionsResponse, StudioV1SaveDiscussionQuestionsResponses, StudioV1SaveDiscussionResponse, StudioV1SaveDiscussionResponses, StudioV1SaveExamData, StudioV1SaveExamQuestionsData, StudioV1SaveExamQuestionsResponse, StudioV1SaveExamQuestionsResponses, StudioV1SaveExamResponse, StudioV1SaveExamResponses, StudioV1SaveMediaData, StudioV1SaveMediaResponse, StudioV1SaveMediaResponses, StudioV1SaveMediaSubtitleData, StudioV1SaveMediaSubtitleResponses, StudioV1SaveQuizData, StudioV1SaveQuizQuestionsData, StudioV1SaveQuizQuestionsResponse, StudioV1SaveQuizQuestionsResponses, StudioV1SaveQuizResponse, StudioV1SaveQuizResponses, StudioV1SaveSurveyData, StudioV1SaveSurveyQuestionsData, StudioV1SaveSurveyQuestionsResponse, StudioV1SaveSurveyQuestionsResponses, StudioV1SaveSurveyResponse, StudioV1SaveSurveyResponses, SubtitleSchema, SubtitleSpec, SurveyAnswersSchema, SurveyQuestionFormatChoices, SurveyQuestionSaveSpec, SurveyQuestionSchema, SurveyQuestionSpec, SurveyQuestionsSaveSpec, SurveyQuestionsSpec, SurveySaveSpec, SurveySchema, SurveySpec, SurveyV1GetAnonymousSurveyData, SurveyV1GetAnonymousSurveyResponse, SurveyV1GetAnonymousSurveyResponses, SurveyV1GetSurveyData, SurveyV1GetSurveyResponse, SurveyV1GetSurveyResponses, SurveyV1ResultsAnonymousData, SurveyV1ResultsAnonymousResponse, SurveyV1ResultsAnonymousResponses, SurveyV1ResultsData, SurveyV1ResultsResponse, SurveyV1ResultsResponses, SurveyV1SubmitAnonymousData, SurveyV1SubmitAnonymousResponses, SurveyV1SubmitData, SurveyV1SubmitResponses, ThreadCreateSchema, ThreadSchema, TotpDeviceSchema, TutorAssignmentGradePaperSchema, TutorAssignmentGradeSchema, TutorContentSchema, TutorDiscussionGradePaperSchema, TutorDiscussionGradeSaveSchema, TutorDiscussionGradeSchema, TutorExamGradePaperSchema, TutorExamGradeSchema, TutorExamQuestionSchema, TutorGradeSaveSchema, TutorGraeCompleteSchema, TutorV1CompleteAssignmentGradeData, TutorV1CompleteAssignmentGradeResponse, TutorV1CompleteAssignmentGradeResponses, TutorV1CompleteDiscussionGradeData, TutorV1CompleteDiscussionGradeResponse, TutorV1CompleteDiscussionGradeResponses, TutorV1CompleteExamGradeData, TutorV1CompleteExamGradeResponse, TutorV1CompleteExamGradeResponses, TutorV1GetAllocationData, TutorV1GetAllocationResponse, TutorV1GetAllocationResponses, TutorV1GetAllocationStatsData, TutorV1GetAllocationStatsResponse, TutorV1GetAllocationStatsResponses, TutorV1GetAppealsData, TutorV1GetAppealsResponse, TutorV1GetAppealsResponses, TutorV1GetAssignmentGradePaperData, TutorV1GetAssignmentGradePaperResponse, TutorV1GetAssignmentGradePaperResponses, TutorV1GetAssignmentGradesData, TutorV1GetAssignmentGradesResponse, TutorV1GetAssignmentGradesResponses, TutorV1GetAssignmentRubricData, TutorV1GetAssignmentRubricResponse, TutorV1GetAssignmentRubricResponses, TutorV1GetDiscussionGradePaperData, TutorV1GetDiscussionGradePaperResponse, TutorV1GetDiscussionGradePaperResponses, TutorV1GetDiscussionGradesData, TutorV1GetDiscussionGradesResponse, TutorV1GetDiscussionGradesResponses, TutorV1GetExamGradePaperData, TutorV1GetExamGradePaperResponse, TutorV1GetExamGradePaperResponses, TutorV1GetExamGradesData, TutorV1GetExamGradesResponse, TutorV1GetExamGradesResponses, TutorV1ReviewAppealData, TutorV1ReviewAppealResponses, UserSchema, UserUpdateSchema, WatchedMediaSchema, WatchInSchema, WatchOutSchema } from './types.gen'; diff --git a/web/src/api/sdk.gen.ts b/web/src/api/sdk.gen.ts index a99f6be..3dbc227 100644 --- a/web/src/api/sdk.gen.ts +++ b/web/src/api/sdk.gen.ts @@ -2,7 +2,7 @@ import { type Client, formDataBodySerializer, type Options as Options2, type TDataShape } from './client'; import { client } from './client.gen'; -import type { AccountV1ActivateData, AccountV1ActivateResponses, AccountV1ApplyEmailChangeData, AccountV1ApplyEmailChangeResponses, AccountV1ApplyPasswordChangeData, AccountV1ApplyPasswordChangeResponses, AccountV1CompleteOtpSetupData, AccountV1CompleteOtpSetupResponses, AccountV1GetMeData, AccountV1GetMeResponses, AccountV1JoinData, AccountV1JoinResponses, AccountV1LoginData, AccountV1LoginResponses, AccountV1LogoutData, AccountV1LogoutResponses, AccountV1RequestActivationData, AccountV1RequestActivationResponses, AccountV1RequestEmailChangeData, AccountV1RequestEmailChangeResponses, AccountV1RequestPasswordChangeData, AccountV1RequestPasswordChangeResponses, AccountV1ResetOtpData, AccountV1ResetOtpResponses, AccountV1SetupOtpData, AccountV1SetupOtpResponses, AccountV1UpdateMeData, AccountV1UpdateMeResponses, AccountV1UploadAvatarData, AccountV1UploadAvatarResponses, AccountV1VerifyOtpData, AccountV1VerifyOtpResponses, AssignmentV1DeactivateAttemptData, AssignmentV1DeactivateAttemptResponses, AssignmentV1GetSessionData, AssignmentV1GetSessionResponses, AssignmentV1StartAttemptData, AssignmentV1StartAttemptResponses, AssignmentV1SubmitAttemptData, AssignmentV1SubmitAttemptResponses, AssistantV1ChatMessageData, AssistantV1ChatMessageResponses, AssistantV1DeleteChatData, AssistantV1DeleteChatResponses, AssistantV1GetChatMessagesData, AssistantV1GetChatMessagesResponses, AssistantV1GetChatsData, AssistantV1GetChatsResponses, AssistantV1SaveAssistantNoteData, AssistantV1SaveAssistantNoteResponses, AssistantV1UpdateChatMessageData, AssistantV1UpdateChatMessageResponses, CompetencyV1DeleteCompetencyGoalData, CompetencyV1DeleteCompetencyGoalResponses, CompetencyV1GetCertificateAwardsData, CompetencyV1GetCertificateAwardsResponses, CompetencyV1GetCertificatesData, CompetencyV1GetCertificatesResponses, CompetencyV1GetClassificationSkillsDataData, CompetencyV1GetClassificationSkillsDataResponses, CompetencyV1GetClassificationTreeData, CompetencyV1GetClassificationTreeResponses, CompetencyV1GetCompetencyGoalsData, CompetencyV1GetCompetencyGoalsResponses, CompetencyV1SaveCompetencyGoalData, CompetencyV1SaveCompetencyGoalResponses, ContentV1DeleteMediaWatchData, ContentV1DeleteMediaWatchResponses, ContentV1GetMediaData, ContentV1GetMediaNoteData, ContentV1GetMediaNoteResponses, ContentV1GetMediaResponses, ContentV1GetMediaWatchData, ContentV1GetMediaWatchResponses, ContentV1GetSubtitlesData, ContentV1GetSubtitlesResponses, ContentV1GetWatchMediasData, ContentV1GetWatchMediasResponses, ContentV1SaveMediaNoteData, ContentV1SaveMediaNoteResponses, ContentV1SearchData, ContentV1SearchResponses, ContentV1SearchSuggestionData, ContentV1SearchSuggestionResponses, ContentV1UpdateMediaWatchData, ContentV1UpdateMediaWatchResponses, CourseV1GetDetailData, CourseV1GetDetailResponses, CourseV1GetSessionData, CourseV1GetSessionResponses, CourseV1RequestCertificateData, CourseV1RequestCertificateResponses, CourseV1StartEngagementData, CourseV1StartEngagementResponses, DiscussionV1CreatePostData, DiscussionV1CreatePostResponses, DiscussionV1DeactivateAttemptData, DiscussionV1DeactivateAttemptResponses, DiscussionV1DeletePostData, DiscussionV1DeletePostResponses, DiscussionV1GetOwnPostsData, DiscussionV1GetOwnPostsResponses, DiscussionV1GetPostsData, DiscussionV1GetPostsResponses, DiscussionV1GetSessionData, DiscussionV1GetSessionResponses, DiscussionV1StartAttemptData, DiscussionV1StartAttemptResponses, DiscussionV1UpdatePostData, DiscussionV1UpdatePostResponses, ExamV1DeactivateAttemptData, ExamV1DeactivateAttemptResponses, ExamV1GetSessionData, ExamV1GetSessionResponses, ExamV1GetTimestampData, ExamV1GetTimestampResponses, ExamV1SaveAnswersData, ExamV1SaveAnswersResponses, ExamV1StartAttemptData, ExamV1StartAttemptResponses, ExamV1SubmitAttemptData, ExamV1SubmitAttemptResponses, LearningV1EnrollCatalogItemData, LearningV1EnrollCatalogItemResponses, LearningV1GetCatalogItemsData, LearningV1GetCatalogItemsResponses, LearningV1GetCatalogsData, LearningV1GetCatalogsResponses, LearningV1GetEnrolledData, LearningV1GetEnrolledResponses, LearningV1GetRecordsData, LearningV1GetRecordsResponses, LearningV1GetReportData, LearningV1GetReportResponses, LearningV1UnenrollData, LearningV1UnenrollResponses, MinimaApiHealthData, MinimaApiHealthResponses, OperationV1AgreePoliciesData, OperationV1AgreePoliciesResponses, OperationV1CreateAppealData, OperationV1CreateAppealResponses, OperationV1CreateInquiryData, OperationV1CreateInquiryResponses, OperationV1CreateThreadData, OperationV1CreateThreadResponses, OperationV1DeleteCommentData, OperationV1DeleteCommentResponses, OperationV1DeleteDeviceData, OperationV1DeleteDeviceResponses, OperationV1EffectivePoliciesData, OperationV1EffectivePoliciesResponses, OperationV1GetAnnouncementsData, OperationV1GetAnnouncementsResponses, OperationV1GetCommentsData, OperationV1GetCommentsResponses, OperationV1GetDevicesData, OperationV1GetDevicesResponses, OperationV1GetInquiriesData, OperationV1GetInquiriesResponses, OperationV1GetThreadCommentsData, OperationV1GetThreadCommentsResponses, OperationV1GetThreadData, OperationV1GetThreadResponses, OperationV1GetUnreadMessagesData, OperationV1GetUnreadMessagesResponses, OperationV1ReadAnnouncementData, OperationV1ReadAnnouncementResponses, OperationV1ReadMessageData, OperationV1ReadMessageResponses, OperationV1RegisterDeviceData, OperationV1RegisterDeviceResponses, OperationV1SaveCommentData, OperationV1SaveCommentResponses, OperationV1ToggleDeviceActiveData, OperationV1ToggleDeviceActiveResponses, OperationV1UpdateInquiryData, OperationV1UpdateInquiryResponses, PartnerV1MemberInfosData, PartnerV1MemberInfosResponses, QuizV1DeactivateAttemptData, QuizV1DeactivateAttemptResponses, QuizV1GetSessionData, QuizV1GetSessionResponses, QuizV1StartAttemptData, QuizV1StartAttemptResponses, QuizV1SubmitAttemptData, QuizV1SubmitAttemptResponses, SsoV1AuthorizeData, SsoV1AuthorizeResponses, SsoV1CallbackData, SsoV1CallbackResponses, SsoV1DeleteAccountData, SsoV1DeleteAccountResponses, SsoV1GetAccountsData, SsoV1GetAccountsResponses, SsoV1LinkData, SsoV1LinkResponses, StudioV1AssessmentSuggestionsData, StudioV1AssessmentSuggestionsResponses, StudioV1ContentData, StudioV1ContentResponses, StudioV1ContentSuggestionsData, StudioV1ContentSuggestionsResponses, StudioV1CreateMediaQuizData, StudioV1CreateMediaQuizResponses, StudioV1DeleteAssignmentData, StudioV1DeleteAssignmentQuesionData, StudioV1DeleteAssignmentQuesionResponses, StudioV1DeleteAssignmentResponses, StudioV1DeleteCourseData, StudioV1DeleteCourseResponses, StudioV1DeleteDiscussionData, StudioV1DeleteDiscussionQuesionData, StudioV1DeleteDiscussionQuesionResponses, StudioV1DeleteDiscussionResponses, StudioV1DeleteExamData, StudioV1DeleteExamQuesionData, StudioV1DeleteExamQuesionResponses, StudioV1DeleteExamResponses, StudioV1DeleteMediaData, StudioV1DeleteMediaResponses, StudioV1DeleteMediaSubtitleData, StudioV1DeleteMediaSubtitleResponses, StudioV1DeleteQuizData, StudioV1DeleteQuizQuesionData, StudioV1DeleteQuizQuesionResponses, StudioV1DeleteQuizResponses, StudioV1DeleteSurveyData, StudioV1DeleteSurveyQuesionData, StudioV1DeleteSurveyQuesionResponses, StudioV1DeleteSurveyResponses, StudioV1GetAssignmentData, StudioV1GetAssignmentQuestionsData, StudioV1GetAssignmentQuestionsResponses, StudioV1GetAssignmentResponses, StudioV1GetAssignmentRubricData, StudioV1GetAssignmentRubricResponses, StudioV1GetCourseData, StudioV1GetCourseResponses, StudioV1GetDiscussionData, StudioV1GetDiscussionQuestionsData, StudioV1GetDiscussionQuestionsResponses, StudioV1GetDiscussionResponses, StudioV1GetExamData, StudioV1GetExamQuestionsData, StudioV1GetExamQuestionsResponses, StudioV1GetExamResponses, StudioV1GetMediaData, StudioV1GetMediaResponses, StudioV1GetQuizData, StudioV1GetQuizQuestionsData, StudioV1GetQuizQuestionsResponses, StudioV1GetQuizResponses, StudioV1GetSurveyData, StudioV1GetSurveyQuestionsData, StudioV1GetSurveyQuestionsResponses, StudioV1GetSurveyResponses, StudioV1InlineSuggestionsData, StudioV1InlineSuggestionsResponses, StudioV1RemoveCourseAssessmentData, StudioV1RemoveCourseAssessmentResponses, StudioV1RemoveCourseCategoryData, StudioV1RemoveCourseCategoryResponses, StudioV1RemoveCourseCertificateData, StudioV1RemoveCourseCertificateResponses, StudioV1RemoveCourseInstructorData, StudioV1RemoveCourseInstructorResponses, StudioV1RemoveCourseLessonData, StudioV1RemoveCourseLessonResponses, StudioV1RemoveCourseRelationData, StudioV1RemoveCourseRelationResponses, StudioV1RemoveCourseSurveyData, StudioV1RemoveCourseSurveyResponses, StudioV1SaveAssignmentData, StudioV1SaveAssignmentQuestionsData, StudioV1SaveAssignmentQuestionsResponses, StudioV1SaveAssignmentResponses, StudioV1SaveAssignmentRubricData, StudioV1SaveAssignmentRubricResponses, StudioV1SaveCourseAssessmentsData, StudioV1SaveCourseAssessmentsResponses, StudioV1SaveCourseCategoriesData, StudioV1SaveCourseCategoriesResponses, StudioV1SaveCourseCertificatesData, StudioV1SaveCourseCertificatesResponses, StudioV1SaveCourseData, StudioV1SaveCourseInstructorsData, StudioV1SaveCourseInstructorsResponses, StudioV1SaveCourseLessonsData, StudioV1SaveCourseLessonsResponses, StudioV1SaveCourseRelationsData, StudioV1SaveCourseRelationsResponses, StudioV1SaveCourseResponses, StudioV1SaveCourseSurveysData, StudioV1SaveCourseSurveysResponses, StudioV1SaveDiscussionData, StudioV1SaveDiscussionQuestionsData, StudioV1SaveDiscussionQuestionsResponses, StudioV1SaveDiscussionResponses, StudioV1SaveExamData, StudioV1SaveExamQuestionsData, StudioV1SaveExamQuestionsResponses, StudioV1SaveExamResponses, StudioV1SaveMediaData, StudioV1SaveMediaResponses, StudioV1SaveMediaSubtitleData, StudioV1SaveMediaSubtitleResponses, StudioV1SaveQuizData, StudioV1SaveQuizQuestionsData, StudioV1SaveQuizQuestionsResponses, StudioV1SaveQuizResponses, StudioV1SaveSurveyData, StudioV1SaveSurveyQuestionsData, StudioV1SaveSurveyQuestionsResponses, StudioV1SaveSurveyResponses, SurveyV1GetAnonymousSurveyData, SurveyV1GetAnonymousSurveyResponses, SurveyV1GetSurveyData, SurveyV1GetSurveyResponses, SurveyV1ResultsAnonymousData, SurveyV1ResultsAnonymousResponses, SurveyV1ResultsData, SurveyV1ResultsResponses, SurveyV1SubmitAnonymousData, SurveyV1SubmitAnonymousResponses, SurveyV1SubmitData, SurveyV1SubmitResponses, TutorV1CompleteAssignmentGradeData, TutorV1CompleteAssignmentGradeResponses, TutorV1CompleteDiscussionGradeData, TutorV1CompleteDiscussionGradeResponses, TutorV1CompleteExamGradeData, TutorV1CompleteExamGradeResponses, TutorV1GetAllocationData, TutorV1GetAllocationResponses, TutorV1GetAllocationStatsData, TutorV1GetAllocationStatsResponses, TutorV1GetAssignmentGradePaperData, TutorV1GetAssignmentGradePaperResponses, TutorV1GetAssignmentGradesData, TutorV1GetAssignmentGradesResponses, TutorV1GetAssignmentRubricData, TutorV1GetAssignmentRubricResponses, TutorV1GetDiscussionGradePaperData, TutorV1GetDiscussionGradePaperResponses, TutorV1GetDiscussionGradesData, TutorV1GetDiscussionGradesResponses, TutorV1GetExamGradePaperData, TutorV1GetExamGradePaperResponses, TutorV1GetExamGradesData, TutorV1GetExamGradesResponses } from './types.gen'; +import type { AccountV1ActivateData, AccountV1ActivateResponses, AccountV1ApplyEmailChangeData, AccountV1ApplyEmailChangeResponses, AccountV1ApplyPasswordChangeData, AccountV1ApplyPasswordChangeResponses, AccountV1CompleteOtpSetupData, AccountV1CompleteOtpSetupResponses, AccountV1GetMeData, AccountV1GetMeResponses, AccountV1JoinData, AccountV1JoinResponses, AccountV1LoginData, AccountV1LoginResponses, AccountV1LogoutData, AccountV1LogoutResponses, AccountV1RequestActivationData, AccountV1RequestActivationResponses, AccountV1RequestEmailChangeData, AccountV1RequestEmailChangeResponses, AccountV1RequestPasswordChangeData, AccountV1RequestPasswordChangeResponses, AccountV1ResetOtpData, AccountV1ResetOtpResponses, AccountV1SetupOtpData, AccountV1SetupOtpResponses, AccountV1UpdateMeData, AccountV1UpdateMeResponses, AccountV1UploadAvatarData, AccountV1UploadAvatarResponses, AccountV1VerifyOtpData, AccountV1VerifyOtpResponses, AssignmentV1DeactivateAttemptData, AssignmentV1DeactivateAttemptResponses, AssignmentV1GetSessionData, AssignmentV1GetSessionResponses, AssignmentV1StartAttemptData, AssignmentV1StartAttemptResponses, AssignmentV1SubmitAttemptData, AssignmentV1SubmitAttemptResponses, AssistantV1ChatMessageData, AssistantV1ChatMessageResponses, AssistantV1DeleteChatData, AssistantV1DeleteChatResponses, AssistantV1GetChatMessagesData, AssistantV1GetChatMessagesResponses, AssistantV1GetChatsData, AssistantV1GetChatsResponses, AssistantV1SaveAssistantNoteData, AssistantV1SaveAssistantNoteResponses, AssistantV1UpdateChatMessageData, AssistantV1UpdateChatMessageResponses, CompetencyV1DeleteCompetencyGoalData, CompetencyV1DeleteCompetencyGoalResponses, CompetencyV1GetCertificateAwardsData, CompetencyV1GetCertificateAwardsResponses, CompetencyV1GetCertificatesData, CompetencyV1GetCertificatesResponses, CompetencyV1GetClassificationSkillsDataData, CompetencyV1GetClassificationSkillsDataResponses, CompetencyV1GetClassificationTreeData, CompetencyV1GetClassificationTreeResponses, CompetencyV1GetCompetencyGoalsData, CompetencyV1GetCompetencyGoalsResponses, CompetencyV1SaveCompetencyGoalData, CompetencyV1SaveCompetencyGoalResponses, ContentV1DeleteMediaWatchData, ContentV1DeleteMediaWatchResponses, ContentV1GetMediaData, ContentV1GetMediaNoteData, ContentV1GetMediaNoteResponses, ContentV1GetMediaResponses, ContentV1GetMediaWatchData, ContentV1GetMediaWatchResponses, ContentV1GetSubtitlesData, ContentV1GetSubtitlesResponses, ContentV1GetWatchMediasData, ContentV1GetWatchMediasResponses, ContentV1SaveMediaNoteData, ContentV1SaveMediaNoteResponses, ContentV1SearchData, ContentV1SearchResponses, ContentV1SearchSuggestionData, ContentV1SearchSuggestionResponses, ContentV1UpdateMediaWatchData, ContentV1UpdateMediaWatchResponses, CourseV1GetDetailData, CourseV1GetDetailResponses, CourseV1GetSessionData, CourseV1GetSessionResponses, CourseV1RequestCertificateData, CourseV1RequestCertificateResponses, CourseV1StartEngagementData, CourseV1StartEngagementResponses, DiscussionV1CreatePostData, DiscussionV1CreatePostResponses, DiscussionV1DeactivateAttemptData, DiscussionV1DeactivateAttemptResponses, DiscussionV1DeletePostData, DiscussionV1DeletePostResponses, DiscussionV1GetOwnPostsData, DiscussionV1GetOwnPostsResponses, DiscussionV1GetPostsData, DiscussionV1GetPostsResponses, DiscussionV1GetSessionData, DiscussionV1GetSessionResponses, DiscussionV1StartAttemptData, DiscussionV1StartAttemptResponses, DiscussionV1UpdatePostData, DiscussionV1UpdatePostResponses, ExamV1DeactivateAttemptData, ExamV1DeactivateAttemptResponses, ExamV1GetSessionData, ExamV1GetSessionResponses, ExamV1GetTimestampData, ExamV1GetTimestampResponses, ExamV1SaveAnswersData, ExamV1SaveAnswersResponses, ExamV1StartAttemptData, ExamV1StartAttemptResponses, ExamV1SubmitAttemptData, ExamV1SubmitAttemptResponses, LearningV1EnrollCatalogItemData, LearningV1EnrollCatalogItemResponses, LearningV1GetCatalogItemsData, LearningV1GetCatalogItemsResponses, LearningV1GetCatalogsData, LearningV1GetCatalogsResponses, LearningV1GetEnrolledData, LearningV1GetEnrolledResponses, LearningV1GetRecordsData, LearningV1GetRecordsResponses, LearningV1GetReportData, LearningV1GetReportResponses, LearningV1UnenrollData, LearningV1UnenrollResponses, MinimaApiHealthData, MinimaApiHealthResponses, OperationV1AgreePoliciesData, OperationV1AgreePoliciesResponses, OperationV1CreateAppealData, OperationV1CreateAppealResponses, OperationV1CreateInquiryData, OperationV1CreateInquiryResponses, OperationV1CreateThreadData, OperationV1CreateThreadResponses, OperationV1DeleteCommentData, OperationV1DeleteCommentResponses, OperationV1DeleteDeviceData, OperationV1DeleteDeviceResponses, OperationV1EffectivePoliciesData, OperationV1EffectivePoliciesResponses, OperationV1GetAnnouncementsData, OperationV1GetAnnouncementsResponses, OperationV1GetCommentsData, OperationV1GetCommentsResponses, OperationV1GetDevicesData, OperationV1GetDevicesResponses, OperationV1GetInquiriesData, OperationV1GetInquiriesResponses, OperationV1GetThreadCommentsData, OperationV1GetThreadCommentsResponses, OperationV1GetThreadData, OperationV1GetThreadResponses, OperationV1GetUnreadMessagesData, OperationV1GetUnreadMessagesResponses, OperationV1ReadAnnouncementData, OperationV1ReadAnnouncementResponses, OperationV1ReadMessageData, OperationV1ReadMessageResponses, OperationV1RegisterDeviceData, OperationV1RegisterDeviceResponses, OperationV1SaveCommentData, OperationV1SaveCommentResponses, OperationV1ToggleDeviceActiveData, OperationV1ToggleDeviceActiveResponses, OperationV1UpdateInquiryData, OperationV1UpdateInquiryResponses, PartnerV1MemberInfosData, PartnerV1MemberInfosResponses, QuizV1DeactivateAttemptData, QuizV1DeactivateAttemptResponses, QuizV1GetSessionData, QuizV1GetSessionResponses, QuizV1StartAttemptData, QuizV1StartAttemptResponses, QuizV1SubmitAttemptData, QuizV1SubmitAttemptResponses, SsoV1AuthorizeData, SsoV1AuthorizeResponses, SsoV1CallbackData, SsoV1CallbackResponses, SsoV1DeleteAccountData, SsoV1DeleteAccountResponses, SsoV1GetAccountsData, SsoV1GetAccountsResponses, SsoV1LinkData, SsoV1LinkResponses, StudioV1AssessmentSuggestionsData, StudioV1AssessmentSuggestionsResponses, StudioV1ContentData, StudioV1ContentResponses, StudioV1ContentSuggestionsData, StudioV1ContentSuggestionsResponses, StudioV1CreateMediaQuizData, StudioV1CreateMediaQuizResponses, StudioV1DeleteAssignmentData, StudioV1DeleteAssignmentQuesionData, StudioV1DeleteAssignmentQuesionResponses, StudioV1DeleteAssignmentResponses, StudioV1DeleteCourseData, StudioV1DeleteCourseResponses, StudioV1DeleteDiscussionData, StudioV1DeleteDiscussionQuesionData, StudioV1DeleteDiscussionQuesionResponses, StudioV1DeleteDiscussionResponses, StudioV1DeleteExamData, StudioV1DeleteExamQuesionData, StudioV1DeleteExamQuesionResponses, StudioV1DeleteExamResponses, StudioV1DeleteMediaData, StudioV1DeleteMediaResponses, StudioV1DeleteMediaSubtitleData, StudioV1DeleteMediaSubtitleResponses, StudioV1DeleteQuizData, StudioV1DeleteQuizQuesionData, StudioV1DeleteQuizQuesionResponses, StudioV1DeleteQuizResponses, StudioV1DeleteSurveyData, StudioV1DeleteSurveyQuesionData, StudioV1DeleteSurveyQuesionResponses, StudioV1DeleteSurveyResponses, StudioV1GetAssignmentData, StudioV1GetAssignmentQuestionsData, StudioV1GetAssignmentQuestionsResponses, StudioV1GetAssignmentResponses, StudioV1GetAssignmentRubricData, StudioV1GetAssignmentRubricResponses, StudioV1GetCourseData, StudioV1GetCourseResponses, StudioV1GetDiscussionData, StudioV1GetDiscussionQuestionsData, StudioV1GetDiscussionQuestionsResponses, StudioV1GetDiscussionResponses, StudioV1GetExamData, StudioV1GetExamQuestionsData, StudioV1GetExamQuestionsResponses, StudioV1GetExamResponses, StudioV1GetMediaData, StudioV1GetMediaResponses, StudioV1GetQuizData, StudioV1GetQuizQuestionsData, StudioV1GetQuizQuestionsResponses, StudioV1GetQuizResponses, StudioV1GetSurveyData, StudioV1GetSurveyQuestionsData, StudioV1GetSurveyQuestionsResponses, StudioV1GetSurveyResponses, StudioV1InlineSuggestionsData, StudioV1InlineSuggestionsResponses, StudioV1RemoveCourseAssessmentData, StudioV1RemoveCourseAssessmentResponses, StudioV1RemoveCourseCategoryData, StudioV1RemoveCourseCategoryResponses, StudioV1RemoveCourseCertificateData, StudioV1RemoveCourseCertificateResponses, StudioV1RemoveCourseInstructorData, StudioV1RemoveCourseInstructorResponses, StudioV1RemoveCourseLessonData, StudioV1RemoveCourseLessonResponses, StudioV1RemoveCourseRelationData, StudioV1RemoveCourseRelationResponses, StudioV1RemoveCourseSurveyData, StudioV1RemoveCourseSurveyResponses, StudioV1SaveAssignmentData, StudioV1SaveAssignmentQuestionsData, StudioV1SaveAssignmentQuestionsResponses, StudioV1SaveAssignmentResponses, StudioV1SaveAssignmentRubricData, StudioV1SaveAssignmentRubricResponses, StudioV1SaveCourseAssessmentsData, StudioV1SaveCourseAssessmentsResponses, StudioV1SaveCourseCategoriesData, StudioV1SaveCourseCategoriesResponses, StudioV1SaveCourseCertificatesData, StudioV1SaveCourseCertificatesResponses, StudioV1SaveCourseData, StudioV1SaveCourseInstructorsData, StudioV1SaveCourseInstructorsResponses, StudioV1SaveCourseLessonsData, StudioV1SaveCourseLessonsResponses, StudioV1SaveCourseRelationsData, StudioV1SaveCourseRelationsResponses, StudioV1SaveCourseResponses, StudioV1SaveCourseSurveysData, StudioV1SaveCourseSurveysResponses, StudioV1SaveDiscussionData, StudioV1SaveDiscussionQuestionsData, StudioV1SaveDiscussionQuestionsResponses, StudioV1SaveDiscussionResponses, StudioV1SaveExamData, StudioV1SaveExamQuestionsData, StudioV1SaveExamQuestionsResponses, StudioV1SaveExamResponses, StudioV1SaveMediaData, StudioV1SaveMediaResponses, StudioV1SaveMediaSubtitleData, StudioV1SaveMediaSubtitleResponses, StudioV1SaveQuizData, StudioV1SaveQuizQuestionsData, StudioV1SaveQuizQuestionsResponses, StudioV1SaveQuizResponses, StudioV1SaveSurveyData, StudioV1SaveSurveyQuestionsData, StudioV1SaveSurveyQuestionsResponses, StudioV1SaveSurveyResponses, SurveyV1GetAnonymousSurveyData, SurveyV1GetAnonymousSurveyResponses, SurveyV1GetSurveyData, SurveyV1GetSurveyResponses, SurveyV1ResultsAnonymousData, SurveyV1ResultsAnonymousResponses, SurveyV1ResultsData, SurveyV1ResultsResponses, SurveyV1SubmitAnonymousData, SurveyV1SubmitAnonymousResponses, SurveyV1SubmitData, SurveyV1SubmitResponses, TutorV1CompleteAssignmentGradeData, TutorV1CompleteAssignmentGradeResponses, TutorV1CompleteDiscussionGradeData, TutorV1CompleteDiscussionGradeResponses, TutorV1CompleteExamGradeData, TutorV1CompleteExamGradeResponses, TutorV1GetAllocationData, TutorV1GetAllocationResponses, TutorV1GetAllocationStatsData, TutorV1GetAllocationStatsResponses, TutorV1GetAppealsData, TutorV1GetAppealsResponses, TutorV1GetAssignmentGradePaperData, TutorV1GetAssignmentGradePaperResponses, TutorV1GetAssignmentGradesData, TutorV1GetAssignmentGradesResponses, TutorV1GetAssignmentRubricData, TutorV1GetAssignmentRubricResponses, TutorV1GetDiscussionGradePaperData, TutorV1GetDiscussionGradePaperResponses, TutorV1GetDiscussionGradesData, TutorV1GetDiscussionGradesResponses, TutorV1GetExamGradePaperData, TutorV1GetExamGradePaperResponses, TutorV1GetExamGradesData, TutorV1GetExamGradesResponses, TutorV1ReviewAppealData, TutorV1ReviewAppealResponses } from './types.gen'; export type Options = Options2 & { /** @@ -1594,6 +1594,27 @@ export const tutorV1GetAllocationStats = (o ...options }); +/** + * Get Appeals + */ +export const tutorV1GetAppeals = (options: Options) => (options.client ?? client).get({ + responseType: 'json', + url: '/api/v1/tutor/{app_label}/{model}/{id}/appeal', + ...options +}); + +/** + * Review Appeal + */ +export const tutorV1ReviewAppeal = (options: Options) => (options.client ?? client).post({ + url: '/api/v1/tutor/appeal/{id}', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } +}); + /** * Get Exam Grades */ diff --git a/web/src/api/types.gen.ts b/web/src/api/types.gen.ts index 763d1df..dc81b8b 100644 --- a/web/src/api/types.gen.ts +++ b/web/src/api/types.gen.ts @@ -6646,6 +6646,80 @@ export type AllocationStatsSchema = { appealOpenCount: number; }; +/** + * GradeAppealSchema + */ +export type GradeAppealSchema = { + /** + * Created + */ + created: string; + /** + * Modified + */ + modified: string; + /** + * Id + */ + id: number; + /** + * Questionid + */ + questionId: number; + /** + * Explanation + */ + explanation: string; + /** + * Review + */ + review: string; + /** + * Path + */ + path: string; + /** + * Gradeid + */ + gradeId: number; +}; + +/** + * PaginatedResponse[GradeAppealSchema] + */ +export type PaginatedResponseGradeAppealSchema = { + /** + * Items + */ + items: Array; + /** + * Count + */ + count: number; + /** + * Size + */ + size: number; + /** + * Page + */ + page: number; + /** + * Pages + */ + pages: number; +}; + +/** + * AppealReviewSchema + */ +export type AppealReviewSchema = { + /** + * Review + */ + review: string; +}; + /** * GradingDate */ @@ -10977,6 +11051,63 @@ export type TutorV1GetAllocationStatsResponses = { export type TutorV1GetAllocationStatsResponse = TutorV1GetAllocationStatsResponses[keyof TutorV1GetAllocationStatsResponses]; +export type TutorV1GetAppealsData = { + body?: never; + path: { + /** + * App Label + */ + app_label: 'exam' | 'assignment' | 'discussion'; + /** + * Model + */ + model: 'exam' | 'assignment' | 'discussion'; + /** + * Id + */ + id: string; + }; + query?: { + /** + * Page + */ + page?: number; + /** + * Size + */ + size?: number; + }; + url: '/api/v1/tutor/{app_label}/{model}/{id}/appeal'; +}; + +export type TutorV1GetAppealsResponses = { + /** + * OK + */ + 200: PaginatedResponseGradeAppealSchema; +}; + +export type TutorV1GetAppealsResponse = TutorV1GetAppealsResponses[keyof TutorV1GetAppealsResponses]; + +export type TutorV1ReviewAppealData = { + body: AppealReviewSchema; + path: { + /** + * Id + */ + id: number; + }; + query?: never; + url: '/api/v1/tutor/appeal/{id}'; +}; + +export type TutorV1ReviewAppealResponses = { + /** + * OK + */ + 200: unknown; +}; + export type TutorV1GetExamGradesData = { body?: never; path: { @@ -11019,7 +11150,12 @@ export type TutorV1GetExamGradePaperData = { */ grade_id: number; }; - query?: never; + query?: { + /** + * Questionid + */ + questionId?: number | null; + }; url: '/api/v1/tutor/exam/{id}/grade/{grade_id}'; }; diff --git a/web/src/api/valibot.gen.ts b/web/src/api/valibot.gen.ts index 80ce856..279ce98 100644 --- a/web/src/api/valibot.gen.ts +++ b/web/src/api/valibot.gen.ts @@ -2880,6 +2880,38 @@ export const vAllocationStatsSchema = v.object({ appealOpenCount: v.pipe(v.number(), v.integer()) }); +/** + * GradeAppealSchema + */ +export const vGradeAppealSchema = v.object({ + created: v.pipe(v.string(), v.isoTimestamp()), + modified: v.pipe(v.string(), v.isoTimestamp()), + id: v.pipe(v.number(), v.integer()), + questionId: v.pipe(v.number(), v.integer()), + explanation: v.string(), + review: v.string(), + path: v.string(), + gradeId: v.pipe(v.number(), v.integer()) +}); + +/** + * PaginatedResponse[GradeAppealSchema] + */ +export const vPaginatedResponseGradeAppealSchema = v.object({ + items: v.array(vGradeAppealSchema), + count: v.pipe(v.number(), v.integer()), + size: v.pipe(v.number(), v.integer()), + page: v.pipe(v.number(), v.integer()), + pages: v.pipe(v.number(), v.integer()) +}); + +/** + * AppealReviewSchema + */ +export const vAppealReviewSchema = v.object({ + review: v.pipe(v.string(), v.minLength(1)) +}); + /** * GradingDate */ @@ -5226,6 +5258,40 @@ export const vTutorV1GetAllocationStatsData = v.object({ */ export const vTutorV1GetAllocationStatsResponse = vAllocationStatsSchema; +export const vTutorV1GetAppealsData = v.object({ + body: v.optional(v.never()), + path: v.object({ + app_label: v.picklist([ + 'exam', + 'assignment', + 'discussion' + ]), + model: v.picklist([ + 'exam', + 'assignment', + 'discussion' + ]), + id: v.string() + }), + query: v.optional(v.object({ + page: v.optional(v.pipe(v.number(), v.integer(), v.minValue(1)), 1), + size: v.optional(v.pipe(v.number(), v.integer(), v.maxValue(100)), 24) + })) +}); + +/** + * OK + */ +export const vTutorV1GetAppealsResponse = vPaginatedResponseGradeAppealSchema; + +export const vTutorV1ReviewAppealData = v.object({ + body: vAppealReviewSchema, + path: v.object({ + id: v.pipe(v.number(), v.integer()) + }), + query: v.optional(v.never()) +}); + export const vTutorV1GetExamGradesData = v.object({ body: v.optional(v.never()), path: v.object({ @@ -5248,7 +5314,9 @@ export const vTutorV1GetExamGradePaperData = v.object({ id: v.string(), grade_id: v.pipe(v.number(), v.integer()) }), - query: v.optional(v.never()) + query: v.optional(v.object({ + questionId: v.nullish(v.pipe(v.number(), v.integer())) + })) }); /** diff --git a/web/src/routeTree.gen.ts b/web/src/routeTree.gen.ts index a300025..7d138bd 100644 --- a/web/src/routeTree.gen.ts +++ b/web/src/routeTree.gen.ts @@ -42,6 +42,7 @@ import { Route as appAccountDeviceRouteImport } from './routes/(app)/account/dev import { Route as TutorExamIdGradingRouteImport } from './routes/tutor/exam/$id.grading' import { Route as TutorDiscussionIdGradingRouteImport } from './routes/tutor/discussion/$id.grading' import { Route as TutorAssignmentIdGradingRouteImport } from './routes/tutor/assignment/$id.grading' +import { Route as TutorAppIdAppealRouteImport } from './routes/tutor/$app.$id.appeal' import { Route as appExamIdSessionRouteImport } from './routes/(app)/exam/$id.session' import { Route as appDiscussionIdSessionRouteImport } from './routes/(app)/discussion/$id.session' import { Route as appCourseIdSessionRouteImport } from './routes/(app)/course/$id.session' @@ -213,6 +214,11 @@ const TutorAssignmentIdGradingRoute = path: '/assignment/$id/grading', getParentRoute: () => TutorRouteRoute, } as any) +const TutorAppIdAppealRoute = TutorAppIdAppealRouteImport.update({ + id: '/$app/$id/appeal', + path: '/$app/$id/appeal', + getParentRoute: () => TutorRouteRoute, +} as any) const appExamIdSessionRoute = appExamIdSessionRouteImport.update({ id: '/exam/$id/session', path: '/exam/$id/session', @@ -267,6 +273,7 @@ export interface FileRoutesByFullPath { '/course/$id/session': typeof appCourseIdSessionRoute '/discussion/$id/session': typeof appDiscussionIdSessionRoute '/exam/$id/session': typeof appExamIdSessionRoute + '/tutor/$app/$id/appeal': typeof TutorAppIdAppealRoute '/tutor/assignment/$id/grading': typeof TutorAssignmentIdGradingRoute '/tutor/discussion/$id/grading': typeof TutorDiscussionIdGradingRoute '/tutor/exam/$id/grading': typeof TutorExamIdGradingRoute @@ -301,6 +308,7 @@ export interface FileRoutesByTo { '/course/$id/session': typeof appCourseIdSessionRoute '/discussion/$id/session': typeof appDiscussionIdSessionRoute '/exam/$id/session': typeof appExamIdSessionRoute + '/tutor/$app/$id/appeal': typeof TutorAppIdAppealRoute '/tutor/assignment/$id/grading': typeof TutorAssignmentIdGradingRoute '/tutor/discussion/$id/grading': typeof TutorDiscussionIdGradingRoute '/tutor/exam/$id/grading': typeof TutorExamIdGradingRoute @@ -341,6 +349,7 @@ export interface FileRoutesById { '/(app)/course/$id/session': typeof appCourseIdSessionRoute '/(app)/discussion/$id/session': typeof appDiscussionIdSessionRoute '/(app)/exam/$id/session': typeof appExamIdSessionRoute + '/tutor/$app/$id/appeal': typeof TutorAppIdAppealRoute '/tutor/assignment/$id/grading': typeof TutorAssignmentIdGradingRoute '/tutor/discussion/$id/grading': typeof TutorDiscussionIdGradingRoute '/tutor/exam/$id/grading': typeof TutorExamIdGradingRoute @@ -380,6 +389,7 @@ export interface FileRouteTypes { | '/course/$id/session' | '/discussion/$id/session' | '/exam/$id/session' + | '/tutor/$app/$id/appeal' | '/tutor/assignment/$id/grading' | '/tutor/discussion/$id/grading' | '/tutor/exam/$id/grading' @@ -414,6 +424,7 @@ export interface FileRouteTypes { | '/course/$id/session' | '/discussion/$id/session' | '/exam/$id/session' + | '/tutor/$app/$id/appeal' | '/tutor/assignment/$id/grading' | '/tutor/discussion/$id/grading' | '/tutor/exam/$id/grading' @@ -453,6 +464,7 @@ export interface FileRouteTypes { | '/(app)/course/$id/session' | '/(app)/discussion/$id/session' | '/(app)/exam/$id/session' + | '/tutor/$app/$id/appeal' | '/tutor/assignment/$id/grading' | '/tutor/discussion/$id/grading' | '/tutor/exam/$id/grading' @@ -700,6 +712,13 @@ declare module '@tanstack/solid-router' { preLoaderRoute: typeof TutorAssignmentIdGradingRouteImport parentRoute: typeof TutorRouteRoute } + '/tutor/$app/$id/appeal': { + id: '/tutor/$app/$id/appeal' + path: '/$app/$id/appeal' + fullPath: '/tutor/$app/$id/appeal' + preLoaderRoute: typeof TutorAppIdAppealRouteImport + parentRoute: typeof TutorRouteRoute + } '/(app)/exam/$id/session': { id: '/(app)/exam/$id/session' path: '/exam/$id/session' @@ -836,6 +855,7 @@ const StudioRouteRouteWithChildren = StudioRouteRoute._addFileChildren( interface TutorRouteRouteChildren { TutorIndexRoute: typeof TutorIndexRoute + TutorAppIdAppealRoute: typeof TutorAppIdAppealRoute TutorAssignmentIdGradingRoute: typeof TutorAssignmentIdGradingRoute TutorDiscussionIdGradingRoute: typeof TutorDiscussionIdGradingRoute TutorExamIdGradingRoute: typeof TutorExamIdGradingRoute @@ -843,6 +863,7 @@ interface TutorRouteRouteChildren { const TutorRouteRouteChildren: TutorRouteRouteChildren = { TutorIndexRoute: TutorIndexRoute, + TutorAppIdAppealRoute: TutorAppIdAppealRoute, TutorAssignmentIdGradingRoute: TutorAssignmentIdGradingRoute, TutorDiscussionIdGradingRoute: TutorDiscussionIdGradingRoute, TutorExamIdGradingRoute: TutorExamIdGradingRoute, diff --git a/web/src/routes/(app)/-shared/AccountButton.tsx b/web/src/routes/(app)/-shared/AccountButton.tsx index 7fec2c3..fb9a0e5 100644 --- a/web/src/routes/(app)/-shared/AccountButton.tsx +++ b/web/src/routes/(app)/-shared/AccountButton.tsx @@ -49,29 +49,33 @@ export const AccountButton = () => {

  • - +
  • - + {t('Tutor')} +
  • diff --git a/web/src/routes/(app)/-shared/Notification.tsx b/web/src/routes/(app)/-shared/Notification.tsx index 129a467..ba222d4 100644 --- a/web/src/routes/(app)/-shared/Notification.tsx +++ b/web/src/routes/(app)/-shared/Notification.tsx @@ -1,10 +1,11 @@ -import { IconBell, IconRefresh } from '@tabler/icons-solidjs' +import { IconBell } from '@tabler/icons-solidjs' import { useNavigate } from '@tanstack/solid-router' import { formatDistanceToNow } from 'date-fns' import { createEffect, createSignal, For, onMount, Show } from 'solid-js' import { type MessageSchema, operationV1GetUnreadMessages, operationV1ReadMessage } from '@/api' import { accountStore } from '@/routes/(app)/account/-store' import { NoContent } from '@/shared/NoContent' +import { RefreshButton } from '@/shared/RefreshButton' import { createCachedInfiniteStore } from '@/shared/solid/cached-infinite-store' import { useTranslation } from '@/shared/solid/i18n' import { capitalize } from '@/shared/utils' @@ -97,9 +98,7 @@ export const Notification = () => { >
    {t('Notification')} - +
    diff --git a/web/src/routes/(app)/assignment/-session/GradingReview.tsx b/web/src/routes/(app)/assignment/-session/GradingReview.tsx index b531d41..0ce4054 100644 --- a/web/src/routes/(app)/assignment/-session/GradingReview.tsx +++ b/web/src/routes/(app)/assignment/-session/GradingReview.tsx @@ -90,7 +90,7 @@ export const GradingReview = () => { {row.criterionName} -
    {row.feedback}
    +
    {row.feedback}
    diff --git a/web/src/routes/(app)/dashboard/catalog.tsx b/web/src/routes/(app)/dashboard/catalog.tsx index bf20aec..b9b3050 100644 --- a/web/src/routes/(app)/dashboard/catalog.tsx +++ b/web/src/routes/(app)/dashboard/catalog.tsx @@ -1,4 +1,4 @@ -import { IconHelp, IconRefresh } from '@tabler/icons-solidjs' +import { IconHelp } from '@tabler/icons-solidjs' import { createFileRoute } from '@tanstack/solid-router' import { createSignal, For, Match, Show, Switch } from 'solid-js' import type { SetStoreFunction } from 'solid-js/store' @@ -13,6 +13,7 @@ import { Avatar } from '@/shared/Avatar' import { Dialog } from '@/shared/Diaglog' import { LoadingOverlay } from '@/shared/LoadingOverlay' import { NoContent } from '@/shared/NoContent' +import { RefreshButton } from '@/shared/RefreshButton' import { createCachedInfiniteStore } from '@/shared/solid/cached-infinite-store' import { createCachedStore } from '@/shared/solid/cached-store' import { useTranslation } from '@/shared/solid/i18n' @@ -152,9 +153,7 @@ const ItemList = (props: ItemListProps) => {
    {t('Enrolled content will be displayed Learning tab.')} - +
    diff --git a/web/src/routes/(app)/discussion/-session/GradingReview.tsx b/web/src/routes/(app)/discussion/-session/GradingReview.tsx index 2b05681..329842a 100644 --- a/web/src/routes/(app)/discussion/-session/GradingReview.tsx +++ b/web/src/routes/(app)/discussion/-session/GradingReview.tsx @@ -119,7 +119,7 @@ export const GradingReview = () => { >
    - - + + +
    diff --git a/web/src/routes/(auth)/route.tsx b/web/src/routes/(auth)/route.tsx index 2da9ff0..5cea8f1 100644 --- a/web/src/routes/(auth)/route.tsx +++ b/web/src/routes/(auth)/route.tsx @@ -1,5 +1,6 @@ import { createFileRoute, Outlet, redirect } from '@tanstack/solid-router' import { accountStore } from '@/routes/(app)/account/-store' +import { NavbarLogo } from '@/shared/NavbarLogo' import { ThemeButton } from '@/shared/ThemeButton' export const Route = createFileRoute('/(auth)')({ @@ -16,8 +17,11 @@ export const Route = createFileRoute('/(auth)')({ function RouteComponent() { return (
    - Logo - +
    + + + +
    diff --git a/web/src/routes/studio/index.tsx b/web/src/routes/studio/index.tsx index a274d69..07103cf 100644 --- a/web/src/routes/studio/index.tsx +++ b/web/src/routes/studio/index.tsx @@ -1,10 +1,11 @@ -import { IconPlus, IconRefresh, IconSearch } from '@tabler/icons-solidjs' +import { IconPlus, IconSearch } from '@tabler/icons-solidjs' import { createFileRoute } from '@tanstack/solid-router' import { formatDistanceToNow } from 'date-fns' import { createRoot, createSignal, For, Show } from 'solid-js' import * as v from 'valibot' import { type StudioContentSpec, studioV1Content } from '@/api' import { NoContent } from '@/shared/NoContent' +import { RefreshButton } from '@/shared/RefreshButton' import { createCachedInfiniteStore } from '@/shared/solid/cached-infinite-store' import { useTranslation } from '@/shared/solid/i18n' import { capitalize } from '@/shared/utils' @@ -67,14 +68,7 @@ function RouteComponent() { setSearch(e.target.value)} /> - +