# retoor 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'') 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, )