| from __future__ import annotations |
|
|
| from datetime import datetime |
| from pathlib import Path |
| from zoneinfo import ZoneInfo |
|
|
| from fastapi import Request |
| from fastapi.responses import RedirectResponse |
| from fastapi.templating import Jinja2Templates |
|
|
| from app.config import ROOT_DIR, settings |
|
|
|
|
| templates = Jinja2Templates(directory=str(ROOT_DIR / "app" / "templates")) |
| STATIC_DIR = ROOT_DIR / "app" / "static" |
|
|
|
|
| def static_asset_version(asset_name: str) -> int: |
| asset_path = STATIC_DIR / asset_name |
| if not asset_path.exists(): |
| return 1 |
| return int(asset_path.stat().st_mtime) |
|
|
|
|
| templates.env.globals["static_asset_version"] = static_asset_version |
|
|
|
|
| def local_now() -> datetime: |
| return datetime.now(ZoneInfo(settings.timezone)).replace(tzinfo=None) |
|
|
|
|
| def add_flash(request: Request, level: str, message: str) -> None: |
| flashes = request.session.setdefault("_flashes", []) |
| flashes.append({"level": level, "message": message}) |
| request.session["_flashes"] = flashes |
|
|
|
|
| def pop_flashes(request: Request) -> list[dict]: |
| flashes = request.session.pop("_flashes", []) |
| return flashes |
|
|
|
|
| def render(request: Request, template_name: str, context: dict, status_code: int = 200): |
| payload = { |
| "request": request, |
| "flashes": pop_flashes(request), |
| "app_name": settings.app_name, |
| **context, |
| } |
| return templates.TemplateResponse(template_name, payload, status_code=status_code) |
|
|
|
|
| def redirect(url: str, status_code: int = 303) -> RedirectResponse: |
| return RedirectResponse(url=url, status_code=status_code)
|
|
|
|
|
|
|