Files
NJUPT-Suan-API/src/njupt_suan_api/router/enhance/lib.py
MangoFanFanw 247d9f089c v0.1.1 项目结构与构建流程更新
涉及的文件很多,但主要是 PyCharm 自动重构 + 手动微调。

1. 使用 src-layout 结构组织项目,旨在更加规范地管理各个子包,并方便组织代码。
2. 可以使用 uv build 构建项目至 wheel。
3. 可以在 /webui 目录下使用 pnpm run build 来构建 WebUI,构建产物会生成在
/src/njupt_suan_api/static 目录下。同时,uv build 时会一同包含此目录下的 WebUI
构建产物,避免在用户侧执行构建。
4. 使用 typer 实现了命令行入口,代码位于 manage.py;命令行实现了现 main.py 的全部功能。
2026-04-25 21:30:11 +08:00

78 lines
2.3 KiB
Python

from datetime import date, timedelta
from typing import Any, Generator, Literal
from pydantic import BaseModel
from sqlmodel import Session
from njupt_suan_api.api.baselib import config
from .alias import apply_alias
from .model import engine
from .screenshot import generate_img
class ScheduleQueryDto(BaseModel):
username: str | None = None
password: str | None = None
week: int = 0
img: bool = False
class TestDto(BaseModel):
username: str
password: str
scheduleType: Literal["class", "student"] # noqa: N815
class AliasDto(BaseModel):
originalName: str # noqa: N815
aliasName: str | None # noqa: N815
class ReturnDto(BaseModel):
success: bool
message: str | None = None
result: Any | None = None
img_url: str | None = None
def get_session() -> Generator[Session, None, None]:
with Session(engine) as session:
yield session
async def apply_enhance(course_list: list[dict], week: int, img: bool) -> ReturnDto:
"""
在一个方法中集成了 应用别名 和 生成课表图片 功能。此为异步方法,需要 await。
Example:
return await apply_enhance(course_list, week, img)
Returns:
返回应用别名和图片完毕的 ReturnDto。
"""
final_course_list = [course for course in course_list if week in course["weeks"]] if week > 0 else course_list
final_course_list = apply_alias(final_course_list)
# 获取课表图片设置
title_template = config.get("schedule", "schedule_title_template", "芒果酸的课程表")
subtitle_template = config.get("schedule", "schedule_subtitle_template", "")
semester_start_date = date.fromisoformat(config.get("schedule", "semester_start_date", "2026-03-02"))
# 可用变量
week_start_day = semester_start_date + timedelta(weeks=week)
vars_ = {
"week": week,
"week_start_day": week_start_day.isoformat(),
"week_end_day": (week_start_day + timedelta(days=6)).isoformat(),
}
img_url = None
if img:
img_url = f"{config.get('system', 'public_host', 'http://127.0.0.1:8000')}/api/schedule/img/{
await generate_img(final_course_list, title_template.format(**vars_), subtitle_template.format(**vars_))
}"
return ReturnDto(success=True, result=final_course_list, img_url=img_url)