Molodetz blogrol volgens DPP-template
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
# 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,
|
||||
)
|
||||
Reference in New Issue
Block a user