Remove render_to_sx from public API: enforce sx_call for all service code
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m44s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 1m44s
Replace ~250 render_to_sx calls across all services with sync sx_call, converting many async functions to sync where no other awaits remained. Make render_to_sx/render_to_sx_with_env private (_render_to_sx). Add (post-header-ctx) IO primitive and shared post/post-admin defmacros. Convert built-in post/post-admin layouts from Python to register_sx_layout with .sx defcomps. Remove dead post_admin_mobile_nav_sx. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -44,11 +44,11 @@ ALLOWED_CLIENTS = {"blog", "market", "cart", "events", "account"}
|
||||
|
||||
async def _render_social_auth_page(component: str, title: str, **kwargs) -> str:
|
||||
"""Render an auth page with social layout — replaces sx_components helpers."""
|
||||
from shared.sx.helpers import render_to_sx
|
||||
from shared.sx.helpers import sx_call
|
||||
from shared.sx.page import get_template_context
|
||||
from sxc.pages.utils import _social_page
|
||||
ctx = await get_template_context()
|
||||
content = await render_to_sx(component, **{k: v for k, v in kwargs.items() if v})
|
||||
content = sx_call(component, **{k: v for k, v in kwargs.items() if v})
|
||||
return await _social_page(ctx, None, content=content, title=title)
|
||||
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ async def _render_choose_username(*, actor=None, error="", username=""):
|
||||
"""Render choose-username page — replaces sx_components helper."""
|
||||
from shared.browser.app.csrf import generate_csrf_token
|
||||
from shared.config import config
|
||||
from shared.sx.helpers import render_to_sx
|
||||
from shared.sx.helpers import sx_call
|
||||
from shared.sx.parser import SxExpr
|
||||
from shared.sx.page import get_template_context
|
||||
from sxc.pages.utils import _social_page
|
||||
@@ -41,8 +41,8 @@ async def _render_choose_username(*, actor=None, error="", username=""):
|
||||
ap_domain = config().get("ap_domain", "rose-ash.com")
|
||||
check_url = url_for("identity.check_username")
|
||||
|
||||
error_sx = await render_to_sx("auth-error-banner", error=error) if error else ""
|
||||
content = await render_to_sx(
|
||||
error_sx = sx_call("auth-error-banner", error=error) if error else ""
|
||||
content = sx_call(
|
||||
"federation-choose-username",
|
||||
domain=str(escape(ap_domain)),
|
||||
error=SxExpr(error_sx) if error_sx else None,
|
||||
|
||||
@@ -7,7 +7,7 @@ from datetime import datetime
|
||||
from quart import Blueprint, request, g, redirect, url_for, abort, Response
|
||||
|
||||
from shared.services.registry import services
|
||||
from shared.sx.helpers import sx_response, render_to_sx
|
||||
from shared.sx.helpers import sx_response, sx_call
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -47,7 +47,7 @@ def register(url_prefix="/social"):
|
||||
items = await services.federation.get_home_timeline(
|
||||
g.s, actor.id, before=before,
|
||||
)
|
||||
sx_src = await _render_timeline_items(items, "home", actor)
|
||||
sx_src = _render_timeline_items(items, "home", actor)
|
||||
return sx_response(sx_src)
|
||||
|
||||
@bp.get("/public/timeline")
|
||||
@@ -61,7 +61,7 @@ def register(url_prefix="/social"):
|
||||
pass
|
||||
items = await services.federation.get_public_timeline(g.s, before=before)
|
||||
actor = getattr(g, "_social_actor", None)
|
||||
sx_src = await _render_timeline_items(items, "public", actor)
|
||||
sx_src = _render_timeline_items(items, "public", actor)
|
||||
return sx_response(sx_src)
|
||||
|
||||
# -- Compose ---------------------------------------------------------------
|
||||
@@ -117,12 +117,12 @@ def register(url_prefix="/social"):
|
||||
actor_data = _serialize_actor(actor)
|
||||
parts = []
|
||||
for ad in actor_dicts:
|
||||
parts.append(await render_to_sx("federation-actor-card-from-data",
|
||||
parts.append(sx_call("federation-actor-card-from-data",
|
||||
a=ad, actor=actor_data,
|
||||
followed_urls=list(followed_urls), list_type="search"))
|
||||
if len(actors_list) >= 20:
|
||||
next_url = url_for("social.search_page", q=query, page=page + 1)
|
||||
parts.append(await render_to_sx("federation-scroll-sentinel", url=next_url))
|
||||
parts.append(sx_call("federation-scroll-sentinel", url=next_url))
|
||||
sx_src = "(<> " + " ".join(parts) + ")" if parts else ""
|
||||
return sx_response(sx_src)
|
||||
|
||||
@@ -166,7 +166,7 @@ def register(url_prefix="/social"):
|
||||
list_type = "followers" if "/followers" in referer else "following"
|
||||
actor_data = _serialize_actor(actor)
|
||||
ad = _serialize_remote_actor(remote_dto)
|
||||
return sx_response(await render_to_sx("federation-actor-card-from-data",
|
||||
return sx_response(sx_call("federation-actor-card-from-data",
|
||||
a=ad, actor=actor_data,
|
||||
followed_urls=list(followed_urls), list_type=list_type))
|
||||
|
||||
@@ -277,19 +277,19 @@ def register(url_prefix="/social"):
|
||||
boost_cls = "hover:text-green-600"
|
||||
|
||||
reply_url = url_for("social.defpage_compose_form", reply_to=object_id) if object_id else ""
|
||||
reply_sx = await render_to_sx("federation-reply-link", url=reply_url) if reply_url else ""
|
||||
reply_sx = sx_call("federation-reply-link", url=reply_url) if reply_url else ""
|
||||
|
||||
like_form = await render_to_sx("federation-like-form",
|
||||
like_form = sx_call("federation-like-form",
|
||||
action=like_action, target=target, oid=object_id, ainbox=author_inbox,
|
||||
csrf=csrf, cls=f"flex items-center gap-1 {like_cls}",
|
||||
icon=like_icon, count=str(like_count))
|
||||
|
||||
boost_form = await render_to_sx("federation-boost-form",
|
||||
boost_form = sx_call("federation-boost-form",
|
||||
action=boost_action, target=target, oid=object_id, ainbox=author_inbox,
|
||||
csrf=csrf, cls=f"flex items-center gap-1 {boost_cls}",
|
||||
count=str(boost_count))
|
||||
|
||||
return sx_response(await render_to_sx("federation-interaction-buttons",
|
||||
return sx_response(sx_call("federation-interaction-buttons",
|
||||
like=SxExpr(like_form),
|
||||
boost=SxExpr(boost_form),
|
||||
reply=SxExpr(reply_sx) if reply_sx else None))
|
||||
@@ -309,12 +309,12 @@ def register(url_prefix="/social"):
|
||||
actor_data = _serialize_actor(actor)
|
||||
parts = []
|
||||
for ad in actor_dicts:
|
||||
parts.append(await render_to_sx("federation-actor-card-from-data",
|
||||
parts.append(sx_call("federation-actor-card-from-data",
|
||||
a=ad, actor=actor_data,
|
||||
followed_urls=[], list_type="following"))
|
||||
if len(actors_list) >= 20:
|
||||
next_url = url_for("social.following_list_page", page=page + 1)
|
||||
parts.append(await render_to_sx("federation-scroll-sentinel", url=next_url))
|
||||
parts.append(sx_call("federation-scroll-sentinel", url=next_url))
|
||||
sx_src = "(<> " + " ".join(parts) + ")" if parts else ""
|
||||
return sx_response(sx_src)
|
||||
|
||||
@@ -335,12 +335,12 @@ def register(url_prefix="/social"):
|
||||
actor_data = _serialize_actor(actor)
|
||||
parts = []
|
||||
for ad in actor_dicts:
|
||||
parts.append(await render_to_sx("federation-actor-card-from-data",
|
||||
parts.append(sx_call("federation-actor-card-from-data",
|
||||
a=ad, actor=actor_data,
|
||||
followed_urls=list(followed_urls), list_type="followers"))
|
||||
if len(actors_list) >= 20:
|
||||
next_url = url_for("social.followers_list_page", page=page + 1)
|
||||
parts.append(await render_to_sx("federation-scroll-sentinel", url=next_url))
|
||||
parts.append(sx_call("federation-scroll-sentinel", url=next_url))
|
||||
sx_src = "(<> " + " ".join(parts) + ")" if parts else ""
|
||||
return sx_response(sx_src)
|
||||
|
||||
@@ -357,7 +357,7 @@ def register(url_prefix="/social"):
|
||||
items = await services.federation.get_actor_timeline(
|
||||
g.s, id, before=before,
|
||||
)
|
||||
sx_src = await _render_timeline_items(items, "actor", actor, id)
|
||||
sx_src = _render_timeline_items(items, "actor", actor, id)
|
||||
return sx_response(sx_src)
|
||||
|
||||
# -- Notifications ---------------------------------------------------------
|
||||
@@ -385,7 +385,7 @@ def register(url_prefix="/social"):
|
||||
return bp
|
||||
|
||||
|
||||
async def _render_timeline_items(items, timeline_type, actor, actor_id=None):
|
||||
def _render_timeline_items(items, timeline_type, actor, actor_id=None):
|
||||
"""Render timeline pagination items as SX fragment."""
|
||||
from sxc.pages.utils import _serialize_timeline_item, _serialize_actor
|
||||
|
||||
@@ -401,7 +401,7 @@ async def _render_timeline_items(items, timeline_type, actor, actor_id=None):
|
||||
else:
|
||||
next_url = url_for(f"social.{timeline_type}_timeline_page", before=before)
|
||||
|
||||
return await render_to_sx("federation-timeline-items",
|
||||
return sx_call("federation-timeline-items",
|
||||
items=item_dicts,
|
||||
timeline_type=timeline_type,
|
||||
actor=actor_data,
|
||||
|
||||
Reference in New Issue
Block a user