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)