Import a schedule from an SIO PDF #81

Open
opened 2026-10-03 19:44:45 +00:00 by jalenluorion · 0 comments
Member

Goal
Picking courses one at a time is the main friction for new users. Uploading your SIO schedule PDF fills a schedule in seconds (Figma "Import from SIO").

Current state

  • Schedules: /api/users/create_schedule, add_org_to_schedule, schedules in api/app/api/users.py. The navbar creates a schedule from a name only; the Figma "Create new schedule" modal with Courses and Clubs tabs does not exist yet.
  • Each course is an org named "15-122 Title"; courses.course_number maps to org_id (api/scraper/persistence/supabase_org_course.py). Lecture and recitation are categories under the org.

Scope

  • POST /api/schedule/import_sio: accept a PDF, extract text (e.g. pypdf), and pull out course numbers and sections. Fall back to the OpenRouter model only if the text parse fails. Do not store the PDF.
  • Match against courses.course_number for the chosen semester; return matched and unmatched rows without writing anything.
  • Confirm step: show the matches, let the user untick any, then create a new schedule or add to the current one.
  • Decide how to use the section: today adding a course shows every section. Either filter to the student's section or note it as a follow-up.
  • Build the "Create new schedule" modal (Courses and Clubs tabs, Import from SIO) from the Figma.
  • Tests with a sample SIO PDF that has the personal details removed.

Done when

  • Uploading an SIO PDF creates a schedule with the right courses, and unmatched courses are listed clearly.

Notes
For Spring registration this needs Spring 2027 loaded first (see the Spring 2027 load issue).

**Goal** Picking courses one at a time is the main friction for new users. Uploading your SIO schedule PDF fills a schedule in seconds (Figma "Import from SIO"). **Current state** - Schedules: `/api/users/create_schedule`, `add_org_to_schedule`, `schedules` in `api/app/api/users.py`. The navbar creates a schedule from a name only; the Figma "Create new schedule" modal with Courses and Clubs tabs does not exist yet. - Each course is an org named "15-122 Title"; `courses.course_number` maps to `org_id` (`api/scraper/persistence/supabase_org_course.py`). Lecture and recitation are categories under the org. **Scope** - [ ] `POST /api/schedule/import_sio`: accept a PDF, extract text (e.g. pypdf), and pull out course numbers and sections. Fall back to the OpenRouter model only if the text parse fails. Do not store the PDF. - [ ] Match against `courses.course_number` for the chosen semester; return matched and unmatched rows without writing anything. - [ ] Confirm step: show the matches, let the user untick any, then create a new schedule or add to the current one. - [ ] Decide how to use the section: today adding a course shows every section. Either filter to the student's section or note it as a follow-up. - [ ] Build the "Create new schedule" modal (Courses and Clubs tabs, Import from SIO) from the Figma. - [ ] Tests with a sample SIO PDF that has the personal details removed. **Done when** - [ ] Uploading an SIO PDF creates a schedule with the right courses, and unmatched courses are listed clearly. **Notes** For Spring registration this needs Spring 2027 loaded first (see the Spring 2027 load issue).
jalenluorion added this to the Phase 3 milestone 2026-10-03 19:44:45 +00:00
jalenluorion added this to the CMUCal project 2026-10-03 19:45:09 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
ScottyLabs/cal#81
No description provided.