111 lines
3.0 KiB
Python
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,
|
|
)
|