Files

111 lines
3.0 KiB
Python

# retoor <retoor@molodetz.nl>
import time
from datetime import datetime, timezone
from fastapi.templating import Jinja2Templates
from markupsafe import Markup, escape
from molodetz import config
from molodetz.assets import static_url
from molodetz.avatar import avatar_url as build_avatar_url
from molodetz.constants import MEDIA_KINDS, TOPICS
from molodetz.database import get_setting, parse_iso, unread_count
from molodetz.rendering import content_preview, plain_title, render_content, render_title
from molodetz.utils.auth import avatar_seed, get_current_user, is_admin, is_owner, is_primary_admin
from molodetz.utils.presence import online_uids
templates = Jinja2Templates(directory=str(config.TEMPLATES_DIR))
templates.env.trim_blocks = True
templates.env.lstrip_blocks = True
templates.env.auto_reload = config.TEMPLATE_AUTO_RELOAD
def nav_active(request, *prefixes, exact=False, css_class="active"):
path = request.url.path
for prefix in prefixes:
if exact and path == prefix:
return css_class
if not exact and (path == prefix or path.startswith(prefix.rstrip("/") + "/")):
return css_class
return ""
def format_date(iso):
parsed = parse_iso(iso)
return parsed.strftime("%d/%m/%Y") if parsed else ""
def format_datetime(iso):
parsed = parse_iso(iso)
return parsed.strftime("%d/%m/%Y %H:%M") if parsed else ""
def local_dt(iso, mode="datetime"):
if not iso:
return ""
fallback = format_date(iso) if mode == "date" else format_datetime(iso)
return Markup(f'<time data-dt="{escape(iso)}" data-mode="{escape(mode)}" datetime="{escape(iso)}">{escape(fallback)} UTC</time>')
def dt_ago(iso):
return local_dt(iso, "ago")
def avatar_for(user, size=64):
return build_avatar_url(avatar_seed(user), size)
def response_time(request):
start = getattr(request.state, "request_start", None)
if start is None:
return ""
return f"{(time.perf_counter() - start) * 1000:.1f}ms"
def current_user(request):
return get_current_user(request)
def unread_for(request):
user = get_current_user(request)
return unread_count(user["uid"]) if user else 0
def is_online(uid):
return uid in online_uids()
def setting(key, default=None):
return get_setting(key, default)
def current_year():
return datetime.now(timezone.utc).year
templates.env.globals.update(
static_url=static_url,
nav_active=nav_active,
render_content=render_content,
render_title=render_title,
content_preview=content_preview,
plain_title=plain_title,
local_dt=local_dt,
dt_ago=dt_ago,
format_date=format_date,
avatar_url=avatar_for,
is_admin=is_admin,
is_owner=is_owner,
is_primary_admin=is_primary_admin,
current_user=current_user,
response_time=response_time,
unread_count=unread_for,
is_online=is_online,
setting=setting,
current_year=current_year,
static_version=config.STATIC_VERSION,
app_title=config.APP_TITLE,
TOPICS=TOPICS,
MEDIA_KINDS=MEDIA_KINDS,
)