Initial commit: PastPaper Master full stack

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Zhao
2026-04-21 12:15:35 +07:00
commit 7a09167261
105 changed files with 24799 additions and 0 deletions

View File

@@ -0,0 +1,121 @@
"""Upload COMP2211 course-library PDFs to Supabase Storage.
Run from the backend directory:
uv run python upload_course_library_pdfs.py
Each entry maps a storage path (inside the `papers` bucket) to the local
source file under pastpaper-scraper/papers/COMP2211/.
"""
from __future__ import annotations
import sys
from pathlib import Path
# ---------------------------------------------------------------------------
# Manifest: (storage_path, local_filename)
# storage_path is relative inside the `papers` bucket.
# local_filename is relative to PAPERS_DIR below.
# ---------------------------------------------------------------------------
MANIFEST: list[tuple[str, str]] = [
(
"course-library/COMP2211/COMP2211-2022-fall-midterm/paper.pdf",
"(COMP2211)[2022](f)midterm~=yjz8dxdd^_27002.pdf",
),
(
"course-library/COMP2211/COMP2211-2022-fall-midterm/answer.pdf",
"(COMP2211)[2022](f)midterm~=yjz8dxdd^_18747.pdf",
),
(
"course-library/COMP2211/COMP2211-2022-spring-midterm/paper.pdf",
"(COMP2211)[2022](s)midterm~=b8bidkgs^_14629.pdf",
),
(
"course-library/COMP2211/COMP2211-2022-spring-midterm/answer.pdf",
"(COMP2211)[2022](s)midterm~=6ma030^_89587.pdf",
),
(
"course-library/COMP2211/COMP2211-2022-spring-final-part-a/paper.pdf",
"(COMP2211)[2022](s)final~=b8bidkgs^_33018.pdf",
),
(
"course-library/COMP2211/COMP2211-2022-spring-final-part-a/answer.pdf",
"(COMP2211)[2022](s)final~=ajou6^_82011.pdf",
),
(
"course-library/COMP2211/COMP2211-2022-spring-final-part-b/paper.pdf",
"(COMP2211)[2022](s)final~=b8bidkgs^_40627.pdf",
),
(
"course-library/COMP2211/COMP2211-2022-spring-final-part-b/answer.pdf",
"(COMP2211)[2022](s)final~=ajou6^_51199.pdf",
),
(
"course-library/COMP2211/COMP2211-2023-spring-midterm/paper.pdf",
"(COMP2211)[2023](s)midterm~=bxbidkmj^_26587.pdf",
),
(
"course-library/COMP2211/COMP2211-2023-spring-midterm/answer.pdf",
"(COMP2211)[2023](s)midterm~clchanbg^_17297.pdf",
),
(
"course-library/COMP2211/COMP2211-2024-spring-midterm/paper.pdf",
"(COMP2211)[2024](s)midterm~=rcidkjgf^_82003.pdf",
),
(
"course-library/COMP2211/COMP2211-2024-spring-midterm/answer.pdf",
"(COMP2211)[2024](s)midterm~=ubrzkjmz^_90406.pdf",
),
(
"course-library/COMP2211/COMP2211-2024-spring-final/paper.pdf",
"(COMP2211)[2024](s)final~=igk5mmg^_90365.pdf",
),
(
"course-library/COMP2211/COMP2211-2024-spring-final/answer.pdf",
"(COMP2211)[2024](s)final~=igk5mmg^_58857.pdf",
),
]
PAPERS_DIR = (
Path(__file__).parent.parent
/ "pastpaper-scraper"
/ "papers"
/ "COMP2211"
)
def main() -> None:
from app.services.supabase_client import get_supabase
sb = get_supabase()
bucket = sb.storage.from_("papers")
ok = 0
skipped = 0
failed = 0
for storage_path, local_name in MANIFEST:
local_file = PAPERS_DIR / local_name
if not local_file.exists():
print(f" MISSING local file: {local_name}")
failed += 1
continue
data = local_file.read_bytes()
try:
bucket.upload(
storage_path,
data,
file_options={"content-type": "application/pdf", "upsert": "true"},
)
print(f" OK {storage_path}")
ok += 1
except Exception as exc:
print(f" ERR {storage_path}: {exc}")
failed += 1
print(f"\nDone: {ok} uploaded, {skipped} skipped, {failed} failed.")
if __name__ == "__main__":
main()