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)