Newer
Older
thu-learn-downloader-optimized / thu_learn_downloader / utils.py
@Qin Li Qin Li on 24 Feb 2023 1 KB fix: migrate to python 3.11
import dataclasses
from datetime import datetime
from typing import Any, Optional

from . import typing as t
from .constants import HOMEWORK_README, SEASONS


def format_semester_id(semester_id: str) -> str:
    years: str = semester_id[:-2]
    season: t.SemesterSeason = SEASONS[int(semester_id[-1:])]
    return f"{years} {season.value}"


def format_doc_filename(title: str, file_type: str) -> str:
    if file_type:
        return f"{title}.{file_type}"
    else:
        return title


def describe_doc_file(course_name: str, filename: str) -> str:
    return f"{course_name} > {filename}"


def describe_work_file(course_name: str, hw_title: str, filename: str) -> str:
    return f"{course_name} > {hw_title} > {filename}"


def from_timestamp(t: Optional[float]) -> Optional[datetime]:
    if not t:
        return None
    return datetime.fromtimestamp(t / 1000.0)


def dataclass_as_dict_shallow(obj: Any) -> dict[str, Any]:
    return dict(
        (field.name, getattr(obj, field.name)) for field in dataclasses.fields(obj)
    )


def remove_attachment_prefix(name: str) -> str:
    prefixes: list[str] = ["attach", "ans", "submit", "comment", "-"]
    while name.startswith(tuple(prefixes)):
        for p in prefixes:
            name = name.removeprefix(p)
    return name


def format_homework_readme(hw: t.Homework) -> str:
    return HOMEWORK_README.format(
        title=hw.title,
        starts=str(hw.starts_time or ""),
        deadline=str(hw.deadline or ""),
        description=hw.description or "",
        ans=hw.answer_content or "",
        submit_time=str(hw.submit_time or ""),
        submit_content=hw.submitted_content or "",
        grader_name=hw.grader_name or "",
        grade_time=str(hw.grade_time or ""),
        grade=hw.grade,
        comment=hw.grade_content,
    )