File size: 1,578 Bytes
ce0719e 4312f62 ce0719e 4312f62 ce0719e 4312f62 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | 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)
|