diff --git a/account/bp/account/routes.py b/account/bp/account/routes.py
index ca0f3bb..9129c3c 100644
--- a/account/bp/account/routes.py
+++ b/account/bp/account/routes.py
@@ -13,7 +13,7 @@ from sqlalchemy import select
from shared.models import UserNewsletter
from shared.infrastructure.fragments import fetch_fragments
-from shared.sx.helpers import sx_response, render_to_sx
+from shared.sx.helpers import sx_response, sx_call
def register(url_prefix="/"):
@@ -66,7 +66,7 @@ def register(url_prefix="/"):
translate = "translate-x-6" if un.subscribed else "translate-x-1"
checked = "true" if un.subscribed else "false"
- return sx_response(await render_to_sx(
+ return sx_response(sx_call(
"account-newsletter-toggle",
id=f"nl-{nid}", url=toggle_url,
hdrs=f'{{"X-CSRFToken": "{csrf}"}}',
diff --git a/account/bp/auth/routes.py b/account/bp/auth/routes.py
index a3cfdea..29f6edb 100644
--- a/account/bp/auth/routes.py
+++ b/account/bp/auth/routes.py
@@ -47,11 +47,11 @@ ACCOUNT_SESSION_KEY = "account_sid"
async def _render_auth_page(component: str, title: str, **kwargs) -> str:
"""Render an auth page with root layout — replaces sx_components helpers."""
- from shared.sx.helpers import render_to_sx, full_page_sx, root_header_sx
+ from shared.sx.helpers import sx_call, full_page_sx, root_header_sx
from shared.sx.page import get_template_context
ctx = await get_template_context()
hdr = await root_header_sx(ctx)
- 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 full_page_sx(ctx, header_rows=hdr, content=content,
meta_html=f"
{title}")
diff --git a/blog/bp/blog/routes.py b/blog/bp/blog/routes.py
index a9a0ed1..4c43513 100644
--- a/blog/bp/blog/routes.py
+++ b/blog/bp/blog/routes.py
@@ -21,7 +21,7 @@ from .services.pages_data import pages_data
from shared.browser.app.redis_cacher import cache_page, invalidate_tag_cache
from shared.browser.app.utils.htmx import is_htmx_request
from shared.browser.app.authz import require_admin
-from shared.sx.helpers import sx_response, render_to_sx
+from shared.sx.helpers import sx_response, sx_call
from shared.utils import host_url
def register(url_prefix, title):
@@ -67,7 +67,7 @@ def register(url_prefix, title):
from shared.sx.helpers import root_header_sx, full_page_sx
from shared.sx.parser import SxExpr
root_hdr = await root_header_sx(tctx)
- blog_hdr = await render_to_sx("menu-row-sx",
+ blog_hdr = sx_call("menu-row-sx",
id="blog-row", level=1,
link_label_content=SxExpr("(div)"),
child_id="blog-header-child")
@@ -132,7 +132,7 @@ def register(url_prefix, title):
from shared.sx.page import get_template_context
from shared.sx.helpers import (
- render_to_sx, root_header_sx, full_page_sx, oob_page_sx,
+ sx_call, root_header_sx, full_page_sx, oob_page_sx,
post_header_sx, oob_header_sx, mobile_menu_sx,
post_mobile_nav_sx, mobile_root_nav_sx,
)
@@ -143,11 +143,11 @@ def register(url_prefix, title):
tctx.update(ctx)
post = ctx.get("post", {})
- content = await render_to_sx("blog-home-main",
+ content = sx_call("blog-home-main",
html_content=post.get("html", ""),
sx_content=SxExpr(post.get("sx_content", "")) if post.get("sx_content") else None)
meta_data = services.blog_page.post_meta_data(post, ctx.get("base_title", ""))
- meta = await render_to_sx("blog-meta", **meta_data)
+ meta = sx_call("blog-meta", **meta_data)
if not is_htmx_request():
root_hdr = await root_header_sx(tctx)
@@ -171,12 +171,12 @@ def register(url_prefix, title):
"""Blog listing — moved from / to /index."""
from shared.services.registry import services
from shared.sx.helpers import (
- render_to_sx, root_header_sx, full_page_sx, oob_page_sx, oob_header_sx,
+ sx_call, root_header_sx, full_page_sx, oob_page_sx, oob_header_sx,
)
from shared.sx.parser import SxExpr
- async def _blog_hdr(ctx, oob=False):
- return await render_to_sx("menu-row-sx",
+ def _blog_hdr(ctx, oob=False):
+ return sx_call("menu-row-sx",
id="blog-row", level=1,
link_label_content=SxExpr("(div)"),
child_id="blog-header-child", oob=oob)
@@ -184,16 +184,16 @@ def register(url_prefix, title):
data = await services.blog_page.index_data(g.s)
# Render content, aside, and filter via .sx defcomps
- content = await render_to_sx("blog-index-main-content", **data)
- aside = await render_to_sx("blog-index-aside-content", **data)
- filter_sx = await render_to_sx("blog-index-filter-content", **data)
+ content = sx_call("blog-index-main-content", **data)
+ aside = sx_call("blog-index-aside-content", **data)
+ filter_sx = sx_call("blog-index-filter-content", **data)
from shared.sx.page import get_template_context
tctx = await get_template_context()
if not is_htmx_request():
root_hdr = await root_header_sx(tctx)
- blog_hdr = await _blog_hdr(tctx)
+ blog_hdr = _blog_hdr(tctx)
header_rows = "(<> " + root_hdr + " " + blog_hdr + ")"
html = await full_page_sx(tctx, header_rows=header_rows,
content=content, aside=aside, filter=filter_sx)
@@ -203,7 +203,7 @@ def register(url_prefix, title):
return sx_response(content)
else:
root_hdr = await root_header_sx(tctx)
- blog_hdr = await _blog_hdr(tctx)
+ blog_hdr = _blog_hdr(tctx)
rows = "(<> " + root_hdr + " " + blog_hdr + ")"
header_oob = await oob_header_sx("root-header-child", "blog-header-child", rows)
sx_src = await oob_page_sx(oobs=header_oob, content=content,
@@ -231,7 +231,7 @@ def register(url_prefix, title):
from shared.sx.page import get_template_context
from sxc.pages.renders import render_editor_panel
tctx = await get_template_context()
- tctx["editor_html"] = await render_editor_panel(save_error="Invalid JSON in editor content.")
+ tctx["editor_html"] = render_editor_panel(save_error="Invalid JSON in editor content.")
html = await _render_new_post_page(tctx)
return await make_response(html, 400)
@@ -240,7 +240,7 @@ def register(url_prefix, title):
from shared.sx.page import get_template_context
from sxc.pages.renders import render_editor_panel
tctx = await get_template_context()
- tctx["editor_html"] = await render_editor_panel(save_error=reason)
+ tctx["editor_html"] = render_editor_panel(save_error=reason)
html = await _render_new_post_page(tctx)
return await make_response(html, 400)
@@ -287,7 +287,7 @@ def register(url_prefix, title):
from shared.sx.page import get_template_context
from sxc.pages.renders import render_editor_panel
tctx = await get_template_context()
- tctx["editor_html"] = await render_editor_panel(save_error="Invalid JSON in editor content.", is_page=True)
+ tctx["editor_html"] = render_editor_panel(save_error="Invalid JSON in editor content.", is_page=True)
tctx["is_page"] = True
html = await _render_new_post_page(tctx)
return await make_response(html, 400)
@@ -297,7 +297,7 @@ def register(url_prefix, title):
from shared.sx.page import get_template_context
from sxc.pages.renders import render_editor_panel
tctx = await get_template_context()
- tctx["editor_html"] = await render_editor_panel(save_error=reason, is_page=True)
+ tctx["editor_html"] = render_editor_panel(save_error=reason, is_page=True)
tctx["is_page"] = True
html = await _render_new_post_page(tctx)
return await make_response(html, 400)
diff --git a/blog/bp/menu_items/routes.py b/blog/bp/menu_items/routes.py
index 1ffb89a..48c3117 100644
--- a/blog/bp/menu_items/routes.py
+++ b/blog/bp/menu_items/routes.py
@@ -13,12 +13,12 @@ from .services.menu_items import (
MenuItemError,
)
from markupsafe import escape
-from shared.sx.helpers import sx_response, render_to_sx
+from shared.sx.helpers import sx_response, sx_call
from shared.sx.parser import SxExpr
from shared.browser.app.csrf import generate_csrf_token
-async def _render_menu_items_list(menu_items):
+def _render_menu_items_list(menu_items):
"""Serialize ORM menu items and render via .sx defcomp."""
csrf = generate_csrf_token()
items = []
@@ -32,8 +32,8 @@ async def _render_menu_items_list(menu_items):
"delete_url": url_for("menu_items.delete_menu_item_route", item_id=item.id),
})
new_url = url_for("menu_items.new_menu_item")
- return await render_to_sx("blog-menu-items-content",
- menu_items=items, new_url=new_url, csrf=csrf)
+ return sx_call("blog-menu-items-content",
+ menu_items=items, new_url=new_url, csrf=csrf)
def _render_menu_item_form(menu_item=None) -> str:
@@ -120,16 +120,16 @@ document.addEventListener('click', function(e) {{
return html
-async def _render_page_search_results(pages, query, page, has_more) -> str:
+def _render_page_search_results(pages, query, page, has_more) -> str:
"""Render page search results."""
if not pages and query:
- return await render_to_sx("page-search-empty", query=query)
+ return sx_call("page-search-empty", query=query)
if not pages:
return ""
items = []
for post in pages:
- items.append(await render_to_sx("page-search-item",
+ items.append(sx_call("page-search-item",
id=post.id, title=post.title,
slug=post.slug,
feature_image=post.feature_image or None))
@@ -137,22 +137,22 @@ async def _render_page_search_results(pages, query, page, has_more) -> str:
sentinel = ""
if has_more:
search_url = url_for("menu_items.search_pages_route")
- sentinel = await render_to_sx("page-search-sentinel",
+ sentinel = sx_call("page-search-sentinel",
url=search_url, query=query,
next_page=page + 1)
items_sx = "(<> " + " ".join(items) + ")"
- return await render_to_sx("page-search-results",
+ return sx_call("page-search-results",
items=SxExpr(items_sx),
sentinel=SxExpr(sentinel) if sentinel else None)
-async def _render_menu_items_nav_oob(menu_items) -> str:
+def _render_menu_items_nav_oob(menu_items) -> str:
"""Render OOB nav update for menu items."""
from quart import request as qrequest
if not menu_items:
- return await render_to_sx("blog-nav-empty", wrapper_id="menu-items-nav-wrapper")
+ return sx_call("blog-nav-empty", wrapper_id="menu-items-nav-wrapper")
first_seg = qrequest.path.strip("/").split("/")[0] if qrequest else ""
@@ -185,23 +185,23 @@ async def _render_menu_items_nav_oob(menu_items) -> str:
href = f"/{item_slug}/"
selected = "true" if item_slug == first_seg else "false"
- img_sx = await render_to_sx("img-or-placeholder", src=fi, alt=label,
+ img_sx = sx_call("img-or-placeholder", src=fi, alt=label,
size_cls="w-8 h-8 rounded-full object-cover flex-shrink-0")
if item_slug != "cart":
- item_parts.append(await render_to_sx("blog-nav-item-link",
+ item_parts.append(sx_call("blog-nav-item-link",
href=href, hx_get=f"/{item_slug}/", selected=selected,
nav_cls=nav_button_cls, img=SxExpr(img_sx), label=label,
))
else:
- item_parts.append(await render_to_sx("blog-nav-item-plain",
+ item_parts.append(sx_call("blog-nav-item-plain",
href=href, selected=selected, nav_cls=nav_button_cls,
img=SxExpr(img_sx), label=label,
))
items_sx = "(<> " + " ".join(item_parts) + ")" if item_parts else ""
- return await render_to_sx("scroll-nav-wrapper",
+ return sx_call("scroll-nav-wrapper",
wrapper_id="menu-items-nav-wrapper", container_id=container_id,
arrow_cls=arrow_cls,
left_hs=f"on click set #{container_id}.scrollLeft to #{container_id}.scrollLeft - 200",
@@ -214,9 +214,9 @@ async def _render_menu_items_nav_oob(menu_items) -> str:
def register():
bp = Blueprint("menu_items", __name__, url_prefix='/settings/menu_items')
- async def get_menu_items_nav_oob_async(menu_items):
+ def get_menu_items_nav_oob_sync(menu_items):
"""Helper to generate OOB update for root nav menu items"""
- return await _render_menu_items_nav_oob(menu_items)
+ return _render_menu_items_nav_oob(menu_items)
@bp.get("/new/")
@require_admin
@@ -245,8 +245,8 @@ def register():
# Get updated list and nav OOB
menu_items = await get_all_menu_items(g.s)
- html = await _render_menu_items_list(menu_items)
- nav_oob = await get_menu_items_nav_oob_async(menu_items)
+ html = _render_menu_items_list(menu_items)
+ nav_oob = get_menu_items_nav_oob_sync(menu_items)
return sx_response(html + nav_oob)
except MenuItemError as e:
@@ -283,8 +283,8 @@ def register():
# Get updated list and nav OOB
menu_items = await get_all_menu_items(g.s)
- html = await _render_menu_items_list(menu_items)
- nav_oob = await get_menu_items_nav_oob_async(menu_items)
+ html = _render_menu_items_list(menu_items)
+ nav_oob = get_menu_items_nav_oob_sync(menu_items)
return sx_response(html + nav_oob)
except MenuItemError as e:
@@ -303,8 +303,8 @@ def register():
# Get updated list and nav OOB
menu_items = await get_all_menu_items(g.s)
- html = await _render_menu_items_list(menu_items)
- nav_oob = await get_menu_items_nav_oob_async(menu_items)
+ html = _render_menu_items_list(menu_items)
+ nav_oob = get_menu_items_nav_oob_sync(menu_items)
return sx_response(html + nav_oob)
@bp.get("/pages/search/")
@@ -318,7 +318,7 @@ def register():
pages, total = await search_pages(g.s, query, page, per_page)
has_more = (page * per_page) < total
- return sx_response(await _render_page_search_results(pages, query, page, has_more))
+ return sx_response(_render_page_search_results(pages, query, page, has_more))
@bp.post("/reorder/")
@require_admin
@@ -342,8 +342,8 @@ def register():
# Get updated list and nav OOB
menu_items = await get_all_menu_items(g.s)
- html = await _render_menu_items_list(menu_items)
- nav_oob = await get_menu_items_nav_oob_async(menu_items)
+ html = _render_menu_items_list(menu_items)
+ nav_oob = get_menu_items_nav_oob_sync(menu_items)
return sx_response(html + nav_oob)
return bp
diff --git a/blog/bp/post/admin/routes.py b/blog/bp/post/admin/routes.py
index 21ad526..9828f48 100644
--- a/blog/bp/post/admin/routes.py
+++ b/blog/bp/post/admin/routes.py
@@ -11,7 +11,7 @@ from quart import (
)
from shared.browser.app.authz import require_admin, require_post_author
from markupsafe import escape
-from shared.sx.helpers import sx_response, render_to_sx
+from shared.sx.helpers import sx_response, sx_call
from shared.sx.parser import SxExpr, serialize as sx_serialize
from shared.utils import host_url
@@ -60,10 +60,10 @@ def _post_to_edit_dict(post) -> dict:
return d
-async def _render_features(features, post, result):
+def _render_features(features, post, result):
"""Render features panel via .sx defcomp."""
slug = post.get("slug", "")
- return await render_to_sx("blog-features-panel-content",
+ return sx_call("blog-features-panel-content",
features_url=host_url(url_for("blog.post.admin.update_features", slug=slug)),
calendar_checked=bool(features.get("calendar")),
market_checked=bool(features.get("market")),
@@ -187,7 +187,7 @@ def _render_calendar_view(
return _raw_html_sx(html)
-async def _render_associated_entries(all_calendars, associated_entry_ids, post_slug: str) -> str:
+def _render_associated_entries(all_calendars, associated_entry_ids, post_slug: str) -> str:
"""Render the associated entries panel."""
from shared.browser.app.csrf import generate_csrf_token
from quart import url_for as qurl
@@ -216,13 +216,13 @@ async def _render_associated_entries(all_calendars, associated_entry_ids, post_s
toggle_url = host_url(qurl("blog.post.admin.toggle_entry", slug=post_slug, entry_id=e_id))
- img_sx = await render_to_sx("blog-entry-image", src=cal_fi, title=cal_title)
+ img_sx = sx_call("blog-entry-image", src=cal_fi, title=cal_title)
date_str = e_start.strftime("%A, %B %d, %Y at %H:%M") if e_start else ""
if e_end:
date_str += f" \u2013 {e_end.strftime('%H:%M')}"
- entry_items.append(await render_to_sx("blog-associated-entry",
+ entry_items.append(sx_call("blog-associated-entry",
confirm_text=f"This will remove {e_name} from this post",
toggle_url=toggle_url,
hx_headers=f'{{"X-CSRFToken": "{csrf}"}}',
@@ -231,16 +231,16 @@ async def _render_associated_entries(all_calendars, associated_entry_ids, post_s
))
if has_entries:
- content_sx = await render_to_sx("blog-associated-entries-content",
+ content_sx = sx_call("blog-associated-entries-content",
items=SxExpr("(<> " + " ".join(entry_items) + ")"),
)
else:
- content_sx = await render_to_sx("blog-associated-entries-empty")
+ content_sx = sx_call("blog-associated-entries-empty")
- return await render_to_sx("blog-associated-entries-panel", content=SxExpr(content_sx))
+ return sx_call("blog-associated-entries-panel", content=SxExpr(content_sx))
-async def _render_nav_entries_oob(associated_entries, calendars, post: dict) -> str:
+def _render_nav_entries_oob(associated_entries, calendars, post: dict) -> str:
"""Render the OOB nav entries swap."""
entries_list = []
if associated_entries and hasattr(associated_entries, "entries"):
@@ -249,7 +249,7 @@ async def _render_nav_entries_oob(associated_entries, calendars, post: dict) ->
has_items = bool(entries_list or calendars)
if not has_items:
- return await render_to_sx("blog-nav-entries-empty")
+ return sx_call("blog-nav-entries-empty")
select_colours = (
"[.hover-capable_&]:hover:bg-yellow-300"
@@ -291,7 +291,7 @@ async def _render_nav_entries_oob(associated_entries, calendars, post: dict) ->
entry_path = f"/{post_slug}/{cal_slug}/"
date_str = ""
- item_parts.append(await render_to_sx("calendar-entry-nav",
+ item_parts.append(sx_call("calendar-entry-nav",
href=entry_path, nav_class=nav_cls, name=e_name, date_str=date_str,
))
@@ -300,13 +300,13 @@ async def _render_nav_entries_oob(associated_entries, calendars, post: dict) ->
cal_slug = getattr(calendar, "slug", "")
cal_path = f"/{post_slug}/{cal_slug}/"
- item_parts.append(await render_to_sx("blog-nav-calendar-item",
+ item_parts.append(sx_call("blog-nav-calendar-item",
href=cal_path, nav_cls=nav_cls, name=cal_name,
))
items_sx = "(<> " + " ".join(item_parts) + ")" if item_parts else ""
- return await render_to_sx("scroll-nav-wrapper",
+ return sx_call("scroll-nav-wrapper",
wrapper_id="entries-calendars-nav-wrapper", container_id="associated-items-container",
arrow_cls="entries-nav-arrow",
left_hs="on click set #associated-items-container.scrollLeft to #associated-items-container.scrollLeft - 200",
@@ -353,7 +353,7 @@ def register():
})
features = result.get("features", {})
- html = await _render_features(features, post, result)
+ html = _render_features(features, post, result)
return sx_response(html)
@bp.put("/admin/sumup/")
@@ -386,7 +386,7 @@ def register():
result = await call_action("blog", "update-page-config", payload=payload)
features = result.get("features", {})
- html = await _render_features(features, post, result)
+ html = _render_features(features, post, result)
return sx_response(html)
@bp.get("/entries/calendar//")
@@ -508,8 +508,8 @@ def register():
# Return the associated entries admin list + OOB update for nav entries
post = g.post_data["post"]
- admin_list = await _render_associated_entries(all_calendars, associated_entry_ids, post["slug"])
- nav_entries_html = await _render_nav_entries_oob(associated_entries, calendars, post)
+ admin_list = _render_associated_entries(all_calendars, associated_entry_ids, post["slug"])
+ nav_entries_html = _render_nav_entries_oob(associated_entries, calendars, post)
return sx_response(admin_list + nav_entries_html)
@@ -686,7 +686,7 @@ def register():
slug = post.get("slug", "")
create_url = host_url(url_for("blog.post.admin.create_market", slug=slug))
- html = await render_to_sx("blog-markets-panel-content",
+ html = sx_call("blog-markets-panel-content",
markets=_serialize_markets(page_markets, slug), create_url=create_url)
return sx_response(html)
@@ -715,7 +715,7 @@ def register():
slug = post.get("slug", "")
create_url = host_url(url_for("blog.post.admin.create_market", slug=slug))
- html = await render_to_sx("blog-markets-panel-content",
+ html = sx_call("blog-markets-panel-content",
markets=_serialize_markets(page_markets, slug), create_url=create_url)
return sx_response(html)
@@ -738,7 +738,7 @@ def register():
slug = post.get("slug", "")
create_url = host_url(url_for("blog.post.admin.create_market", slug=slug))
- html = await render_to_sx("blog-markets-panel-content",
+ html = sx_call("blog-markets-panel-content",
markets=_serialize_markets(page_markets, slug), create_url=create_url)
return sx_response(html)
diff --git a/blog/bp/post/routes.py b/blog/bp/post/routes.py
index e63be1f..c5808af 100644
--- a/blog/bp/post/routes.py
+++ b/blog/bp/post/routes.py
@@ -106,7 +106,7 @@ def register():
async def post_detail(slug: str):
from shared.sx.page import get_template_context
from shared.sx.helpers import (
- render_to_sx, root_header_sx, full_page_sx, oob_page_sx,
+ sx_call, root_header_sx, full_page_sx, oob_page_sx,
post_header_sx, oob_header_sx, mobile_menu_sx,
post_mobile_nav_sx, mobile_root_nav_sx,
)
@@ -124,9 +124,9 @@ def register():
csrf = generate_csrf_token()
svc = services.blog_page
detail_data = svc.post_detail_data(post, user, rights, csrf, blog_url_base)
- content = await render_to_sx("blog-post-detail-content", **detail_data)
+ content = sx_call("blog-post-detail-content", **detail_data)
meta_data = svc.post_meta_data(post, tctx.get("base_title", ""))
- meta = await render_to_sx("blog-meta", **meta_data)
+ meta = sx_call("blog-meta", **meta_data)
if not is_htmx_request():
root_hdr = await root_header_sx(tctx)
@@ -149,24 +149,24 @@ def register():
@clear_cache(tag="post.post_detail", tag_scope="user")
async def like_toggle(slug: str):
from shared.utils import host_url
- from shared.sx.helpers import render_to_sx
+ from shared.sx.helpers import sx_call
from shared.browser.app.csrf import generate_csrf_token
like_url = host_url(url_for('blog.post.like_toggle', slug=slug))
csrf = generate_csrf_token()
- async def _like_btn(liked):
+ def _like_btn(liked):
if liked:
colour, icon, label = "text-red-600", "fa-solid fa-heart", "Unlike this post"
else:
colour, icon, label = "text-stone-300", "fa-regular fa-heart", "Like this post"
- return await render_to_sx("market-like-toggle-button",
+ return sx_call("market-like-toggle-button",
colour=colour, action=like_url,
hx_headers=f'{{"X-CSRFToken": "{csrf}"}}',
label=label, icon_cls=icon)
if not g.user:
- return sx_response(await _like_btn(False), status=403)
+ return sx_response(_like_btn(False), status=403)
post_id = g.post_data["post"]["id"]
user_id = g.user.id
@@ -175,7 +175,7 @@ def register():
"user_id": user_id, "target_type": "post", "target_id": post_id,
})
- return sx_response(await _like_btn(result["liked"]))
+ return sx_response(_like_btn(result["liked"]))
@bp.get("/w//")
async def widget_paginate(slug: str, widget_domain: str):
diff --git a/blog/bp/snippets/routes.py b/blog/bp/snippets/routes.py
index 3b4b45b..b243b1f 100644
--- a/blog/bp/snippets/routes.py
+++ b/blog/bp/snippets/routes.py
@@ -3,7 +3,7 @@ from __future__ import annotations
from quart import Blueprint, request, g, abort
from shared.browser.app.authz import require_login
-from shared.sx.helpers import sx_response, render_to_sx
+from shared.sx.helpers import sx_response, sx_call
from models import Snippet
@@ -14,7 +14,7 @@ async def _render_snippets():
"""Render snippets list via service data + .sx defcomp."""
from shared.services.registry import services
data = await services.blog_page.snippets_data(g.s)
- return await render_to_sx("blog-snippets-content", **data)
+ return sx_call("blog-snippets-content", **data)
def register():
diff --git a/blog/sxc/pages/helpers.py b/blog/sxc/pages/helpers.py
index bc4b900..9e2e2b8 100644
--- a/blog/sxc/pages/helpers.py
+++ b/blog/sxc/pages/helpers.py
@@ -126,22 +126,22 @@ def _register_blog_helpers() -> None:
# --- Editor helpers ---
-async def _h_editor_content(**kw):
+def _h_editor_content(**kw):
from .renders import render_editor_panel
- return await render_editor_panel()
+ return render_editor_panel()
-async def _h_editor_page_content(**kw):
+def _h_editor_page_content(**kw):
from .renders import render_editor_panel
- return await render_editor_panel(is_page=True)
+ return render_editor_panel(is_page=True)
# --- Post admin helpers ---
async def _h_post_admin_content(slug=None, **kw):
await _ensure_post_data(slug)
- from shared.sx.helpers import render_to_sx
- return await render_to_sx("blog-admin-placeholder")
+ from shared.sx.helpers import sx_call
+ return sx_call("blog-admin-placeholder")
async def _h_post_data_content(slug=None, **kw):
@@ -264,32 +264,32 @@ async def _h_post_preview_content(slug=None, **kw):
await _ensure_post_data(slug)
from quart import g
from shared.services.registry import services
- from shared.sx.helpers import render_to_sx
+ from shared.sx.helpers import sx_call
from shared.sx.parser import SxExpr
preview = await services.blog_page.preview_data(g.s)
sections: list[str] = []
if preview.get("sx_pretty"):
- sections.append(await render_to_sx("blog-preview-section",
+ sections.append(sx_call("blog-preview-section",
title="S-Expression Source", content=SxExpr(preview["sx_pretty"])))
if preview.get("json_pretty"):
- sections.append(await render_to_sx("blog-preview-section",
+ sections.append(sx_call("blog-preview-section",
title="Lexical JSON", content=SxExpr(preview["json_pretty"])))
if preview.get("sx_rendered"):
- rendered_sx = await render_to_sx("blog-preview-rendered", html=preview["sx_rendered"])
- sections.append(await render_to_sx("blog-preview-section",
+ rendered_sx = sx_call("blog-preview-rendered", html=preview["sx_rendered"])
+ sections.append(sx_call("blog-preview-section",
title="SX Rendered", content=SxExpr(rendered_sx)))
if preview.get("lex_rendered"):
- rendered_sx = await render_to_sx("blog-preview-rendered", html=preview["lex_rendered"])
- sections.append(await render_to_sx("blog-preview-section",
+ rendered_sx = sx_call("blog-preview-rendered", html=preview["lex_rendered"])
+ sections.append(sx_call("blog-preview-section",
title="Lexical Rendered", content=SxExpr(rendered_sx)))
if not sections:
- return await render_to_sx("blog-preview-empty")
+ return sx_call("blog-preview-empty")
inner = " ".join(sections)
- return await render_to_sx("blog-preview-panel", sections=SxExpr(f"(<> {inner})"))
+ return sx_call("blog-preview-panel", sections=SxExpr(f"(<> {inner})"))
async def _h_post_entries_content(slug=None, **kw):
@@ -315,7 +315,7 @@ async def _h_post_entries_content(slug=None, **kw):
await g.s.refresh(calendar, ["entries", "post"])
# Associated entries list
- assoc_html = await _render_associated_entries(all_calendars, associated_entry_ids, post_slug)
+ assoc_html = _render_associated_entries(all_calendars, associated_entry_ids, post_slug)
# Calendar browser
cal_items: list[str] = []
@@ -505,7 +505,7 @@ async def _h_post_edit_content(slug=None, **kw):
from sqlalchemy.orm import selectinload
from shared.infrastructure.data_client import fetch_data
from shared.browser.app.csrf import generate_csrf_token
- from shared.sx.helpers import render_to_sx
+ from shared.sx.helpers import sx_call
from shared.sx.parser import SxExpr, serialize as sx_serialize
from bp.post.admin.routes import _post_to_edit_dict
@@ -584,9 +584,9 @@ async def _h_post_edit_content(slug=None, **kw):
parts: list[str] = []
if save_error:
- parts.append(await render_to_sx("blog-editor-error", error=save_error))
+ parts.append(sx_call("blog-editor-error", error=save_error))
- parts.append(await render_to_sx("blog-editor-edit-form",
+ parts.append(sx_call("blog-editor-edit-form",
csrf=csrf,
updated_at=str(updated_at),
title_val=title_val,
@@ -603,9 +603,9 @@ async def _h_post_edit_content(slug=None, **kw):
footer_extra=footer_extra_sx,
))
- parts.append(await render_to_sx("blog-editor-publish-js", already_emailed=already_emailed))
- parts.append(await render_to_sx("blog-editor-styles", css_href=editor_css))
- parts.append(await render_to_sx("sx-editor-styles"))
+ parts.append(sx_call("blog-editor-publish-js", already_emailed=already_emailed))
+ parts.append(sx_call("blog-editor-styles", css_href=editor_css))
+ parts.append(sx_call("sx-editor-styles"))
init_js = (
'(function() {'
@@ -705,10 +705,10 @@ async def _h_post_edit_content(slug=None, **kw):
' }, 50); }'
'})();'
)
- parts.append(await render_to_sx("blog-editor-scripts",
+ parts.append(sx_call("blog-editor-scripts",
js_src=editor_js,
sx_editor_js_src=sx_editor_js,
init_js=init_js))
- return await render_to_sx("blog-editor-panel",
+ return sx_call("blog-editor-panel",
parts=SxExpr("(<> " + " ".join(parts) + ")"))
diff --git a/blog/sxc/pages/layouts.py b/blog/sxc/pages/layouts.py
index 36eb7f3..002fbbd 100644
--- a/blog/sxc/pages/layouts.py
+++ b/blog/sxc/pages/layouts.py
@@ -5,19 +5,19 @@ from typing import Any
# ---------------------------------------------------------------------------
-# Header helpers (moved from sx_components — thin render_to_sx wrappers)
+# Header helpers (moved from sx_components — thin sx_call wrappers)
# ---------------------------------------------------------------------------
-async def _settings_header_sx(ctx: dict, *, oob: bool = False) -> str:
- from shared.sx.helpers import render_to_sx
+def _settings_header_sx(ctx: dict, *, oob: bool = False) -> str:
+ from shared.sx.helpers import sx_call
from shared.sx.parser import SxExpr
from quart import url_for as qurl
settings_href = qurl("settings.defpage_settings_home")
- label_sx = await render_to_sx("blog-admin-label")
- nav_sx = await _settings_nav_sx(ctx)
+ label_sx = sx_call("blog-admin-label")
+ nav_sx = _settings_nav_sx(ctx)
- return await render_to_sx("menu-row-sx",
+ return sx_call("menu-row-sx",
id="root-settings-row", level=1,
link_href=settings_href,
link_label_content=SxExpr(label_sx),
@@ -25,20 +25,20 @@ async def _settings_header_sx(ctx: dict, *, oob: bool = False) -> str:
child_id="root-settings-header-child", oob=oob)
-async def _settings_nav_sx(ctx: dict) -> str:
- from shared.sx.helpers import render_to_sx
- return await render_to_sx("blog-settings-nav")
+def _settings_nav_sx(ctx: dict) -> str:
+ from shared.sx.helpers import sx_call
+ return sx_call("blog-settings-nav")
-async def _sub_settings_header_sx(row_id: str, child_id: str, href: str,
- icon: str, label: str, ctx: dict,
- *, oob: bool = False, nav_sx: str = "") -> str:
- from shared.sx.helpers import render_to_sx
+def _sub_settings_header_sx(row_id: str, child_id: str, href: str,
+ icon: str, label: str, ctx: dict,
+ *, oob: bool = False, nav_sx: str = "") -> str:
+ from shared.sx.helpers import sx_call
from shared.sx.parser import SxExpr
- label_sx = await render_to_sx("blog-sub-settings-label",
+ label_sx = sx_call("blog-sub-settings-label",
icon=f"fa fa-{icon}", label=label)
- return await render_to_sx("menu-row-sx",
+ return sx_call("menu-row-sx",
id=row_id, level=2,
link_href=href,
link_label_content=SxExpr(label_sx),
@@ -82,19 +82,19 @@ async def _settings_full(ctx: dict, **kw: Any) -> str:
from shared.sx.helpers import render_to_sx_with_env
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("settings-layout-full", {},
- settings_header=SxExpr(await _settings_header_sx(ctx)))
+ settings_header=SxExpr(_settings_header_sx(ctx)))
async def _settings_oob(ctx: dict, **kw: Any) -> str:
from shared.sx.helpers import render_to_sx_with_env, oob_header_sx
from shared.sx.parser import SxExpr
rows = await render_to_sx_with_env("settings-layout-full", {},
- settings_header=SxExpr(await _settings_header_sx(ctx)))
+ settings_header=SxExpr(_settings_header_sx(ctx)))
return await oob_header_sx("root-header-child", "root-settings-header-child", rows)
-async def _settings_mobile(ctx: dict, **kw: Any) -> str:
- return await _settings_nav_sx(ctx)
+def _settings_mobile(ctx: dict, **kw: Any) -> str:
+ return _settings_nav_sx(ctx)
# --- Sub-settings helpers ---
@@ -105,21 +105,21 @@ async def _sub_settings_full(ctx: dict, row_id: str, child_id: str,
from shared.sx.parser import SxExpr
from quart import url_for as qurl
return await render_to_sx_with_env("sub-settings-layout-full", {},
- settings_header=SxExpr(await _settings_header_sx(ctx)),
- sub_header=SxExpr(await _sub_settings_header_sx(
+ settings_header=SxExpr(_settings_header_sx(ctx)),
+ sub_header=SxExpr(_sub_settings_header_sx(
row_id, child_id, qurl(endpoint), icon, label, ctx)))
async def _sub_settings_oob(ctx: dict, row_id: str, child_id: str,
endpoint: str, icon: str, label: str) -> str:
- from shared.sx.helpers import oob_header_sx, render_to_sx
+ from shared.sx.helpers import oob_header_sx, sx_call
from shared.sx.parser import SxExpr
from quart import url_for as qurl
- settings_hdr_oob = await _settings_header_sx(ctx, oob=True)
- sub_hdr = await _sub_settings_header_sx(
+ settings_hdr_oob = _settings_header_sx(ctx, oob=True)
+ sub_hdr = _sub_settings_header_sx(
row_id, child_id, qurl(endpoint), icon, label, ctx)
sub_oob = await oob_header_sx("root-settings-header-child", child_id, sub_hdr)
- return await render_to_sx("sub-settings-layout-oob",
+ return sx_call("sub-settings-layout-oob",
settings_header_oob=SxExpr(settings_hdr_oob),
sub_header_oob=SxExpr(sub_oob))
@@ -180,8 +180,8 @@ async def _tag_group_edit_full(ctx: dict, **kw: Any) -> str:
from shared.sx.parser import SxExpr
g_id = (request.view_args or {}).get("id")
return await render_to_sx_with_env("sub-settings-layout-full", {},
- settings_header=SxExpr(await _settings_header_sx(ctx)),
- sub_header=SxExpr(await _sub_settings_header_sx(
+ settings_header=SxExpr(_settings_header_sx(ctx)),
+ sub_header=SxExpr(_sub_settings_header_sx(
"tag-groups-row", "tag-groups-header-child",
qurl("defpage_tag_group_edit", id=g_id),
"tags", "Tag Groups", ctx)))
@@ -189,15 +189,15 @@ async def _tag_group_edit_full(ctx: dict, **kw: Any) -> str:
async def _tag_group_edit_oob(ctx: dict, **kw: Any) -> str:
from quart import request, url_for as qurl
- from shared.sx.helpers import oob_header_sx, render_to_sx
+ from shared.sx.helpers import oob_header_sx, sx_call
from shared.sx.parser import SxExpr
g_id = (request.view_args or {}).get("id")
- settings_hdr_oob = await _settings_header_sx(ctx, oob=True)
- sub_hdr = await _sub_settings_header_sx(
+ settings_hdr_oob = _settings_header_sx(ctx, oob=True)
+ sub_hdr = _sub_settings_header_sx(
"tag-groups-row", "tag-groups-header-child",
qurl("defpage_tag_group_edit", id=g_id),
"tags", "Tag Groups", ctx)
sub_oob = await oob_header_sx("root-settings-header-child", "tag-groups-header-child", sub_hdr)
- return await render_to_sx("sub-settings-layout-oob",
+ return sx_call("sub-settings-layout-oob",
settings_header_oob=SxExpr(settings_hdr_oob),
sub_header_oob=SxExpr(sub_oob))
diff --git a/blog/sxc/pages/renders.py b/blog/sxc/pages/renders.py
index fd08d62..3cd1833 100644
--- a/blog/sxc/pages/renders.py
+++ b/blog/sxc/pages/renders.py
@@ -2,12 +2,12 @@
from __future__ import annotations
-async def render_editor_panel(save_error: str | None = None, is_page: bool = False) -> str:
+def render_editor_panel(save_error: str | None = None, is_page: bool = False) -> str:
"""Build the WYSIWYG editor panel HTML for new post/page creation."""
import os
from quart import url_for as qurl, current_app
from shared.browser.app.csrf import generate_csrf_token
- from shared.sx.helpers import render_to_sx
+ from shared.sx.helpers import sx_call
csrf = generate_csrf_token()
asset_url_fn = current_app.jinja_env.globals.get("asset_url", lambda p: "")
@@ -28,15 +28,15 @@ async def render_editor_panel(save_error: str | None = None, is_page: bool = Fal
parts: list[str] = []
if save_error:
- parts.append(await render_to_sx("blog-editor-error", error=str(save_error)))
+ parts.append(sx_call("blog-editor-error", error=str(save_error)))
- parts.append(await render_to_sx("blog-editor-form",
+ parts.append(sx_call("blog-editor-form",
csrf=csrf, title_placeholder=title_placeholder,
create_label=create_label,
))
- parts.append(await render_to_sx("blog-editor-styles", css_href=editor_css))
- parts.append(await render_to_sx("sx-editor-styles"))
+ parts.append(sx_call("blog-editor-styles", css_href=editor_css))
+ parts.append(sx_call("sx-editor-styles"))
init_js = (
"console.log('[EDITOR-DEBUG] init script running');\n"
@@ -167,11 +167,11 @@ async def render_editor_panel(save_error: str | None = None, is_page: bool = Fal
" }\n"
"})();\n"
)
- parts.append(await render_to_sx("blog-editor-scripts",
+ parts.append(sx_call("blog-editor-scripts",
js_src=editor_js,
sx_editor_js_src=sx_editor_js,
init_js=init_js))
from shared.sx.parser import SxExpr
- return await render_to_sx("blog-editor-panel",
+ return sx_call("blog-editor-panel",
parts=SxExpr("(<> " + " ".join(parts) + ")")) if parts else ""
diff --git a/cart/bp/orders/routes.py b/cart/bp/orders/routes.py
index 22150a2..db1abab 100644
--- a/cart/bp/orders/routes.py
+++ b/cart/bp/orders/routes.py
@@ -154,7 +154,7 @@ def register(url_prefix: str) -> Blueprint:
)
resp = await make_response(html)
elif page > 1:
- sx_src = await render_orders_rows(
+ sx_src = render_orders_rows(
ctx, orders, page, total_pages, url_for, qs_fn,
)
resp = sx_response(sx_src)
diff --git a/cart/bp/page_admin/routes.py b/cart/bp/page_admin/routes.py
index 934e003..8fa9dbf 100644
--- a/cart/bp/page_admin/routes.py
+++ b/cart/bp/page_admin/routes.py
@@ -49,7 +49,7 @@ def register():
from shared.sx.page import get_template_context
from sxc.pages.renders import render_cart_payments_panel
ctx = await get_template_context()
- html = await render_cart_payments_panel(ctx)
+ html = render_cart_payments_panel(ctx)
return sx_response(html)
return bp
diff --git a/cart/sxc/pages/layouts.py b/cart/sxc/pages/layouts.py
index 9b4c981..536257f 100644
--- a/cart/sxc/pages/layouts.py
+++ b/cart/sxc/pages/layouts.py
@@ -57,9 +57,9 @@ async def _post_header_sx(ctx: dict, page_post: Any, *, oob: bool = False) -> st
return await _shared_post_header_sx(ctx, oob=oob)
-async def _cart_header_sx(ctx: dict, *, oob: bool = False) -> str:
- from shared.sx.helpers import render_to_sx, call_url
- return await render_to_sx(
+def _cart_header_sx(ctx: dict, *, oob: bool = False) -> str:
+ from shared.sx.helpers import sx_call, call_url
+ return sx_call(
"menu-row-sx",
id="cart-row", level=1, colour="sky",
link_href=call_url(ctx, "cart_url", "/"),
@@ -68,15 +68,15 @@ async def _cart_header_sx(ctx: dict, *, oob: bool = False) -> str:
)
-async def _page_cart_header_sx(ctx: dict, page_post: Any, *, oob: bool = False) -> str:
- from shared.sx.helpers import render_to_sx, call_url
+def _page_cart_header_sx(ctx: dict, page_post: Any, *, oob: bool = False) -> str:
+ from shared.sx.helpers import sx_call, call_url
slug = page_post.slug if page_post else ""
title = ((page_post.title if page_post else None) or "")[:160]
- label_sx = await render_to_sx("cart-page-label",
+ label_sx = sx_call("cart-page-label",
feature_image=page_post.feature_image if page_post else None,
title=title)
- nav_sx = await render_to_sx("cart-all-carts-link", href=call_url(ctx, "cart_url", "/"))
- return await render_to_sx(
+ nav_sx = sx_call("cart-all-carts-link", href=call_url(ctx, "cart_url", "/"))
+ return sx_call(
"menu-row-sx",
id="page-cart-row", level=2, colour="sky",
link_href=call_url(ctx, "cart_url", f"/{slug}/"),
@@ -102,8 +102,8 @@ async def _cart_page_full(ctx: dict, **kw: Any) -> str:
page_post = ctx.get("page_post")
env = {}
return await render_to_sx_with_env("cart-page-layout-full", env,
- cart_row=SxExpr(await _cart_header_sx(ctx)),
- page_cart_row=SxExpr(await _page_cart_header_sx(ctx, page_post)),
+ cart_row=SxExpr(_cart_header_sx(ctx)),
+ page_cart_row=SxExpr(_page_cart_header_sx(ctx, page_post)),
)
@@ -113,8 +113,8 @@ async def _cart_page_oob(ctx: dict, **kw: Any) -> str:
env = {}
return await render_to_sx_with_env("cart-page-layout-oob", env,
root_header_oob=SxExpr(await root_header_sx(ctx, oob=True)),
- cart_row_oob=SxExpr(await _cart_header_sx(ctx, oob=True)),
- page_cart_row=SxExpr(await _page_cart_header_sx(ctx, page_post)),
+ cart_row_oob=SxExpr(_cart_header_sx(ctx, oob=True)),
+ page_cart_row=SxExpr(_page_cart_header_sx(ctx, page_post)),
)
diff --git a/cart/sxc/pages/renders.py b/cart/sxc/pages/renders.py
index 125d53c..f4f0f98 100644
--- a/cart/sxc/pages/renders.py
+++ b/cart/sxc/pages/renders.py
@@ -7,7 +7,7 @@ from .utils import _serialize_order, _serialize_calendar_entry
async def render_orders_page(ctx, orders, page, total_pages, search, search_count, url_for_fn, qs_fn):
- from shared.sx.helpers import render_to_sx, render_to_sx_with_env, search_desktop_sx, search_mobile_sx, full_page_sx
+ from shared.sx.helpers import sx_call, render_to_sx_with_env, search_desktop_sx, search_mobile_sx, full_page_sx
from shared.utils import route_prefix
ctx["search"] = search
ctx["search_count"] = search_count
@@ -15,18 +15,18 @@ async def render_orders_page(ctx, orders, page, total_pages, search, search_coun
list_url = pfx + url_for_fn("orders.list_orders")
detail_url_prefix = pfx + url_for_fn("orders.order.order_detail", order_id=0).rsplit("0/", 1)[0]
order_dicts = [_serialize_order(o) for o in orders]
- content = await render_to_sx("orders-list-content", orders=order_dicts,
+ content = sx_call("orders-list-content", orders=order_dicts,
page=page, total_pages=total_pages, rows_url=list_url, detail_url_prefix=detail_url_prefix)
header_rows = await render_to_sx_with_env("cart-orders-layout-full", {},
list_url=list_url,
)
- filt = await render_to_sx("order-list-header", search_mobile=SxExpr(await search_mobile_sx(ctx)))
+ filt = sx_call("order-list-header", search_mobile=SxExpr(await search_mobile_sx(ctx)))
return await full_page_sx(ctx, header_rows=header_rows, filter=filt,
aside=await search_desktop_sx(ctx), content=content)
-async def render_orders_rows(ctx, orders, page, total_pages, url_for_fn, qs_fn):
- from shared.sx.helpers import render_to_sx
+def render_orders_rows(ctx, orders, page, total_pages, url_for_fn, qs_fn):
+ from shared.sx.helpers import sx_call
from shared.utils import route_prefix
pfx = route_prefix()
list_url = pfx + url_for_fn("orders.list_orders")
@@ -34,22 +34,22 @@ async def render_orders_rows(ctx, orders, page, total_pages, url_for_fn, qs_fn):
order_dicts = [_serialize_order(o) for o in orders]
parts = []
for od in order_dicts:
- parts.append(await render_to_sx("order-row-pair", order=od, detail_url_prefix=detail_url_prefix))
+ parts.append(sx_call("order-row-pair", order=od, detail_url_prefix=detail_url_prefix))
next_scroll = ""
if page < total_pages:
next_url = list_url + qs_fn(page=page + 1)
- next_scroll = await render_to_sx("infinite-scroll", url=next_url, page=page,
+ next_scroll = sx_call("infinite-scroll", url=next_url, page=page,
total_pages=total_pages, id_prefix="orders", colspan=5)
else:
- next_scroll = await render_to_sx("order-end-row")
- return await render_to_sx("cart-orders-rows",
+ next_scroll = sx_call("order-end-row")
+ return sx_call("cart-orders-rows",
rows=SxExpr("(<> " + " ".join(parts) + ")"),
next_scroll=SxExpr(next_scroll),
)
async def render_orders_oob(ctx, orders, page, total_pages, search, search_count, url_for_fn, qs_fn):
- from shared.sx.helpers import render_to_sx, render_to_sx_with_env, search_desktop_sx, search_mobile_sx, oob_page_sx
+ from shared.sx.helpers import sx_call, render_to_sx_with_env, search_desktop_sx, search_mobile_sx, oob_page_sx
from shared.utils import route_prefix
ctx["search"] = search
ctx["search_count"] = search_count
@@ -57,17 +57,17 @@ async def render_orders_oob(ctx, orders, page, total_pages, search, search_count
list_url = pfx + url_for_fn("orders.list_orders")
detail_url_prefix = pfx + url_for_fn("orders.order.order_detail", order_id=0).rsplit("0/", 1)[0]
order_dicts = [_serialize_order(o) for o in orders]
- content = await render_to_sx("orders-list-content", orders=order_dicts,
+ content = sx_call("orders-list-content", orders=order_dicts,
page=page, total_pages=total_pages, rows_url=list_url, detail_url_prefix=detail_url_prefix)
oobs = await render_to_sx_with_env("cart-orders-layout-oob", {},
list_url=list_url,
)
- filt = await render_to_sx("order-list-header", search_mobile=SxExpr(await search_mobile_sx(ctx)))
+ filt = sx_call("order-list-header", search_mobile=SxExpr(await search_mobile_sx(ctx)))
return await oob_page_sx(oobs=oobs, filter=filt, aside=await search_desktop_sx(ctx), content=content)
async def render_order_page(ctx, order, calendar_entries, url_for_fn):
- from shared.sx.helpers import render_to_sx, render_to_sx_with_env, full_page_sx
+ from shared.sx.helpers import sx_call, render_to_sx_with_env, full_page_sx
from shared.utils import route_prefix
from shared.browser.app.csrf import generate_csrf_token
pfx = route_prefix()
@@ -77,8 +77,8 @@ async def render_order_page(ctx, order, calendar_entries, url_for_fn):
pay_url = pfx + url_for_fn("orders.order.order_pay", order_id=order.id)
order_data = _serialize_order(order)
cal_data = [_serialize_calendar_entry(e) for e in (calendar_entries or [])]
- main = await render_to_sx("order-detail-content", order=order_data, calendar_entries=cal_data)
- filt = await render_to_sx("order-detail-filter-content", order=order_data,
+ main = sx_call("order-detail-content", order=order_data, calendar_entries=cal_data)
+ filt = sx_call("order-detail-filter-content", order=order_data,
list_url=list_url, recheck_url=recheck_url, pay_url=pay_url, csrf=generate_csrf_token())
header_rows = await render_to_sx_with_env("cart-order-detail-layout-full", {},
list_url=list_url, detail_url=detail_url,
@@ -88,7 +88,7 @@ async def render_order_page(ctx, order, calendar_entries, url_for_fn):
async def render_order_oob(ctx, order, calendar_entries, url_for_fn):
- from shared.sx.helpers import render_to_sx, render_to_sx_with_env, oob_page_sx
+ from shared.sx.helpers import sx_call, render_to_sx_with_env, oob_page_sx
from shared.utils import route_prefix
from shared.browser.app.csrf import generate_csrf_token
pfx = route_prefix()
@@ -98,8 +98,8 @@ async def render_order_oob(ctx, order, calendar_entries, url_for_fn):
pay_url = pfx + url_for_fn("orders.order.order_pay", order_id=order.id)
order_data = _serialize_order(order)
cal_data = [_serialize_calendar_entry(e) for e in (calendar_entries or [])]
- main = await render_to_sx("order-detail-content", order=order_data, calendar_entries=cal_data)
- filt = await render_to_sx("order-detail-filter-content", order=order_data,
+ main = sx_call("order-detail-content", order=order_data, calendar_entries=cal_data)
+ filt = sx_call("order-detail-filter-content", order=order_data,
list_url=list_url, recheck_url=recheck_url, pay_url=pay_url, csrf=generate_csrf_token())
oobs = await render_to_sx_with_env("cart-order-detail-layout-oob", {},
detail_url=detail_url,
@@ -109,19 +109,19 @@ async def render_order_oob(ctx, order, calendar_entries, url_for_fn):
async def render_checkout_error_page(ctx, error=None, order=None):
- from shared.sx.helpers import render_to_sx, render_to_sx_with_env, full_page_sx
+ from shared.sx.helpers import sx_call, render_to_sx_with_env, full_page_sx
from shared.infrastructure.urls import cart_url
err_msg = error or "Unexpected error while creating the hosted checkout session."
- order_sx = await render_to_sx("checkout-error-order-id", oid=f"#{order.id}") if order else None
+ order_sx = sx_call("checkout-error-order-id", oid=f"#{order.id}") if order else None
hdr = await render_to_sx_with_env("layout-root-full", {})
- filt = await render_to_sx("checkout-error-header")
- content = await render_to_sx("checkout-error-content", msg=err_msg,
+ filt = sx_call("checkout-error-header")
+ content = sx_call("checkout-error-content", msg=err_msg,
order=SxExpr(order_sx) if order_sx else None, back_url=cart_url("/"))
return await full_page_sx(ctx, header_rows=hdr, filter=filt, content=content)
-async def render_cart_payments_panel(ctx):
- from shared.sx.helpers import render_to_sx
+def render_cart_payments_panel(ctx):
+ from shared.sx.helpers import sx_call
page_config = ctx.get("page_config")
pc_data = None
if page_config:
@@ -130,4 +130,4 @@ async def render_cart_payments_panel(ctx):
"sumup_merchant_code": getattr(page_config, "sumup_merchant_code", None) or "",
"sumup_checkout_prefix": getattr(page_config, "sumup_checkout_prefix", None) or "",
}
- return await render_to_sx("cart-payments-content", page_config=pc_data)
+ return sx_call("cart-payments-content", page_config=pc_data)
diff --git a/events/bp/all_events/routes.py b/events/bp/all_events/routes.py
index 1fbc60b..83f6dc6 100644
--- a/events/bp/all_events/routes.py
+++ b/events/bp/all_events/routes.py
@@ -85,7 +85,7 @@ def register() -> Blueprint:
entries, has_more, pending_tickets, page_info = await _load_entries(page)
from sxc.pages.renders import render_all_events_cards
- sx_src = await render_all_events_cards(entries, has_more, pending_tickets, page_info, page, view)
+ sx_src = render_all_events_cards(entries, has_more, pending_tickets, page_info, page, view)
return sx_response(sx_src)
@bp.post("/all-tickets/adjust")
@@ -126,7 +126,7 @@ def register() -> Blueprint:
frag_params["session_id"] = ident["session_id"]
from sxc.pages.tickets import render_ticket_widget
- widget_html = await render_ticket_widget(entry, qty, "/all-tickets/adjust")
+ widget_html = render_ticket_widget(entry, qty, "/all-tickets/adjust")
mini_html = await fetch_fragment("cart", "cart-mini", params=frag_params, required=False)
return sx_response(widget_html + (mini_html or ""))
diff --git a/events/bp/calendar/admin/routes.py b/events/bp/calendar/admin/routes.py
index 123e3ff..7a53274 100644
--- a/events/bp/calendar/admin/routes.py
+++ b/events/bp/calendar/admin/routes.py
@@ -19,7 +19,7 @@ def register():
@require_admin
async def calendar_description_edit(calendar_slug: str, **kwargs):
from sxc.pages.renders import render_calendar_description_edit
- html = await render_calendar_description_edit(g.calendar)
+ html = render_calendar_description_edit(g.calendar)
return sx_response(html)
@@ -35,7 +35,7 @@ def register():
await g.s.flush()
from sxc.pages.renders import render_calendar_description
- html = await render_calendar_description(g.calendar, oob=True)
+ html = render_calendar_description(g.calendar, oob=True)
return sx_response(html)
@@ -43,7 +43,7 @@ def register():
@require_admin
async def calendar_description_view(calendar_slug: str, **kwargs):
from sxc.pages.renders import render_calendar_description
- html = await render_calendar_description(g.calendar)
+ html = render_calendar_description(g.calendar)
return sx_response(html)
return bp
diff --git a/events/bp/calendar/routes.py b/events/bp/calendar/routes.py
index 2d3e661..7d77f27 100644
--- a/events/bp/calendar/routes.py
+++ b/events/bp/calendar/routes.py
@@ -201,7 +201,7 @@ def register():
from shared.sx.page import get_template_context
from sxc.pages.calendar import _calendar_admin_main_panel_html
ctx = await get_template_context()
- html = await _calendar_admin_main_panel_html(ctx)
+ html = _calendar_admin_main_panel_html(ctx)
return sx_response(html)
@@ -220,7 +220,7 @@ def register():
from shared.sx.page import get_template_context
from sxc.pages.renders import render_calendars_list_panel
ctx = await get_template_context()
- html = await render_calendars_list_panel(ctx)
+ html = render_calendars_list_panel(ctx)
if post_data:
from shared.services.entry_associations import get_associated_entries
@@ -236,7 +236,7 @@ def register():
).scalars().all()
associated_entries = await get_associated_entries(post_id)
- nav_oob = await render_post_nav_entries_oob(associated_entries, cals, post_data["post"])
+ nav_oob = render_post_nav_entries_oob(associated_entries, cals, post_data["post"])
html = html + nav_oob
return sx_response(html)
diff --git a/events/bp/calendar_entries/routes.py b/events/bp/calendar_entries/routes.py
index b211bef..f9c2f19 100644
--- a/events/bp/calendar_entries/routes.py
+++ b/events/bp/calendar_entries/routes.py
@@ -259,7 +259,7 @@ def register():
}
from sxc.pages.renders import render_day_main_panel
- html = await render_day_main_panel(ctx)
+ html = render_day_main_panel(ctx)
mini_html = await fetch_fragment("cart", "cart-mini", params=frag_params, required=False)
return sx_response(html + (mini_html or ""))
@@ -280,12 +280,12 @@ def register():
day_slots = list(result.scalars())
from sxc.pages.entries import render_entry_add_form
- return sx_response(await render_entry_add_form(g.calendar, day, month, year, day_slots))
+ return sx_response(render_entry_add_form(g.calendar, day, month, year, day_slots))
@bp.get("/add-button/")
async def add_button(day: int, month: int, year: int, **kwargs):
from sxc.pages.entries import render_entry_add_button
- return sx_response(await render_entry_add_button(g.calendar, day, month, year))
+ return sx_response(render_entry_add_button(g.calendar, day, month, year))
diff --git a/events/bp/calendar_entry/routes.py b/events/bp/calendar_entry/routes.py
index 7f81c77..8813b06 100644
--- a/events/bp/calendar_entry/routes.py
+++ b/events/bp/calendar_entry/routes.py
@@ -112,7 +112,7 @@ def register():
# Render OOB nav
from sxc.pages.entries import render_day_entries_nav_oob
- return await render_day_entries_nav_oob(visible.confirmed_entries, calendar, day_date)
+ return render_day_entries_nav_oob(visible.confirmed_entries, calendar, day_date)
async def get_post_nav_oob(entry_id: int):
"""Helper to generate OOB update for post entries nav when entry state changes"""
@@ -149,7 +149,7 @@ def register():
# Render OOB nav for this post
from sxc.pages.entries import render_post_nav_entries_oob
- nav_oob = await render_post_nav_entries_oob(associated_entries, calendars, post)
+ nav_oob = render_post_nav_entries_oob(associated_entries, calendars, post)
nav_oobs.append(nav_oob)
return "".join(nav_oobs)
@@ -257,7 +257,7 @@ def register():
day_slots = list(result.scalars())
from sxc.pages.entries import render_entry_edit_form
- return sx_response(await render_entry_edit_form(g.entry, g.calendar, day, month, year, day_slots))
+ return sx_response(render_entry_edit_form(g.entry, g.calendar, day, month, year, day_slots))
@bp.put("/")
@require_admin
@@ -423,7 +423,7 @@ def register():
from sxc.pages.entries import _entry_main_panel_html
tctx = await get_template_context()
- html = await _entry_main_panel_html(tctx)
+ html = _entry_main_panel_html(tctx)
return sx_response(html + nav_oob)
@@ -449,7 +449,7 @@ def register():
# Re-read entry to get updated state
await g.s.refresh(g.entry)
from sxc.pages.entries import render_entry_optioned
- html = await render_entry_optioned(g.entry, g.calendar, day, month, year)
+ html = render_entry_optioned(g.entry, g.calendar, day, month, year)
return sx_response(html + day_nav_oob + post_nav_oob)
@bp.post("/decline/")
@@ -474,7 +474,7 @@ def register():
# Re-read entry to get updated state
await g.s.refresh(g.entry)
from sxc.pages.entries import render_entry_optioned
- html = await render_entry_optioned(g.entry, g.calendar, day, month, year)
+ html = render_entry_optioned(g.entry, g.calendar, day, month, year)
return sx_response(html + day_nav_oob + post_nav_oob)
@bp.post("/provisional/")
@@ -499,7 +499,7 @@ def register():
# Re-read entry to get updated state
await g.s.refresh(g.entry)
from sxc.pages.entries import render_entry_optioned
- html = await render_entry_optioned(g.entry, g.calendar, day, month, year)
+ html = render_entry_optioned(g.entry, g.calendar, day, month, year)
return sx_response(html + day_nav_oob + post_nav_oob)
@bp.post("/tickets/")
@@ -543,7 +543,7 @@ def register():
# Return just the tickets fragment (targeted by hx-target="#entry-tickets-...")
await g.s.refresh(g.entry)
from sxc.pages.entries import render_entry_tickets_config
- html = await render_entry_tickets_config(g.entry, g.calendar, request.view_args.get("day"), request.view_args.get("month"), request.view_args.get("year"))
+ html = render_entry_tickets_config(g.entry, g.calendar, request.view_args.get("day"), request.view_args.get("month"), request.view_args.get("year"))
return sx_response(html)
@bp.get("/posts/search/")
@@ -559,7 +559,7 @@ def register():
va = request.view_args or {}
from sxc.pages.entries import render_post_search_results
- return sx_response(await render_post_search_results(
+ return sx_response(render_post_search_results(
search_posts, query, page, total_pages,
g.entry, g.calendar,
va.get("day"), va.get("month"), va.get("year"),
@@ -594,8 +594,8 @@ def register():
# Return updated posts list + OOB nav update
from sxc.pages.entries import render_entry_posts_panel, render_entry_posts_nav_oob
va = request.view_args or {}
- html = await render_entry_posts_panel(entry_posts, g.entry, g.calendar, va.get("day"), va.get("month"), va.get("year"))
- nav_oob = await render_entry_posts_nav_oob(entry_posts)
+ html = render_entry_posts_panel(entry_posts, g.entry, g.calendar, va.get("day"), va.get("month"), va.get("year"))
+ nav_oob = render_entry_posts_nav_oob(entry_posts)
return sx_response(html + nav_oob)
@bp.delete("/posts//")
@@ -616,8 +616,8 @@ def register():
# Return updated posts list + OOB nav update
from sxc.pages.entries import render_entry_posts_panel, render_entry_posts_nav_oob
va = request.view_args or {}
- html = await render_entry_posts_panel(entry_posts, g.entry, g.calendar, va.get("day"), va.get("month"), va.get("year"))
- nav_oob = await render_entry_posts_nav_oob(entry_posts)
+ html = render_entry_posts_panel(entry_posts, g.entry, g.calendar, va.get("day"), va.get("month"), va.get("year"))
+ nav_oob = render_entry_posts_nav_oob(entry_posts)
return sx_response(html + nav_oob)
return bp
diff --git a/events/bp/calendars/routes.py b/events/bp/calendars/routes.py
index 0bc3661..2bb5565 100644
--- a/events/bp/calendars/routes.py
+++ b/events/bp/calendars/routes.py
@@ -69,7 +69,7 @@ def register():
from shared.sx.page import get_template_context
from sxc.pages.renders import render_calendars_list_panel
ctx = await get_template_context()
- html = await render_calendars_list_panel(ctx)
+ html = render_calendars_list_panel(ctx)
# Blog-embedded mode: also update post nav
if post_data:
@@ -85,7 +85,7 @@ def register():
).scalars().all()
associated_entries = await get_associated_entries(post_id)
- nav_oob = await render_post_nav_entries_oob(associated_entries, cals, post_data["post"])
+ nav_oob = render_post_nav_entries_oob(associated_entries, cals, post_data["post"])
html = html + nav_oob
return sx_response(html)
diff --git a/events/bp/markets/routes.py b/events/bp/markets/routes.py
index 415f6c0..319649d 100644
--- a/events/bp/markets/routes.py
+++ b/events/bp/markets/routes.py
@@ -44,7 +44,7 @@ def register():
from shared.sx.page import get_template_context
from sxc.pages.renders import render_markets_list_panel
ctx = await get_template_context()
- return sx_response(await render_markets_list_panel(ctx))
+ return sx_response(render_markets_list_panel(ctx))
@bp.delete("//")
@require_admin
@@ -57,6 +57,6 @@ def register():
from shared.sx.page import get_template_context
from sxc.pages.renders import render_markets_list_panel
ctx = await get_template_context()
- return sx_response(await render_markets_list_panel(ctx))
+ return sx_response(render_markets_list_panel(ctx))
return bp
diff --git a/events/bp/page/routes.py b/events/bp/page/routes.py
index 0b88755..ecbbe5b 100644
--- a/events/bp/page/routes.py
+++ b/events/bp/page/routes.py
@@ -66,7 +66,7 @@ def register() -> Blueprint:
entries, has_more, pending_tickets = await _load_entries(post["id"], page)
from sxc.pages.renders import render_page_summary_cards
- sx_src = await render_page_summary_cards(entries, has_more, pending_tickets, {}, page, view, post)
+ sx_src = render_page_summary_cards(entries, has_more, pending_tickets, {}, page, view, post)
return sx_response(sx_src)
@bp.post("/tickets/adjust")
@@ -107,7 +107,7 @@ def register() -> Blueprint:
frag_params["session_id"] = ident["session_id"]
from sxc.pages.tickets import render_ticket_widget
- widget_html = await render_ticket_widget(entry, qty, f"/{g.post_slug}/tickets/adjust")
+ widget_html = render_ticket_widget(entry, qty, f"/{g.post_slug}/tickets/adjust")
mini_html = await fetch_fragment("cart", "cart-mini", params=frag_params, required=False)
return sx_response(widget_html + (mini_html or ""))
diff --git a/events/bp/slot/routes.py b/events/bp/slot/routes.py
index 5b157b1..b2585e4 100644
--- a/events/bp/slot/routes.py
+++ b/events/bp/slot/routes.py
@@ -36,7 +36,7 @@ def register():
if not slot:
return await make_response("Not found", 404)
from sxc.pages.slots import render_slot_edit_form
- return sx_response(await render_slot_edit_form(slot, g.calendar))
+ return sx_response(render_slot_edit_form(slot, g.calendar))
@bp.get("/view/")
@require_admin
@@ -45,7 +45,7 @@ def register():
if not slot:
return await make_response("Not found", 404)
from sxc.pages.slots import render_slot_main_panel
- return sx_response(await render_slot_main_panel(slot, g.calendar))
+ return sx_response(render_slot_main_panel(slot, g.calendar))
@bp.delete("/")
@require_admin
@@ -54,7 +54,7 @@ def register():
await svc_delete_slot(g.s, slot_id)
slots = await svc_list_slots(g.s, g.calendar.id)
from sxc.pages.slots import render_slots_table
- return sx_response(await render_slots_table(slots, g.calendar))
+ return sx_response(render_slots_table(slots, g.calendar))
@bp.put("/")
@require_admin
@@ -136,7 +136,7 @@ def register():
), 422
from sxc.pages.slots import render_slot_main_panel
- return sx_response(await render_slot_main_panel(slot, g.calendar, oob=True))
+ return sx_response(render_slot_main_panel(slot, g.calendar, oob=True))
diff --git a/events/bp/slots/routes.py b/events/bp/slots/routes.py
index 61f1ae7..d3bfee3 100644
--- a/events/bp/slots/routes.py
+++ b/events/bp/slots/routes.py
@@ -111,19 +111,19 @@ def register():
# Success → re-render the slots table
slots = await svc_list_slots(g.s, g.calendar.id)
from sxc.pages.slots import render_slots_table
- return sx_response(await render_slots_table(slots, g.calendar))
+ return sx_response(render_slots_table(slots, g.calendar))
@bp.get("/add")
@require_admin
async def add_form(**kwargs):
from sxc.pages.slots import render_slot_add_form
- return sx_response(await render_slot_add_form(g.calendar))
+ return sx_response(render_slot_add_form(g.calendar))
@bp.get("/add-button")
@require_admin
async def add_button(**kwargs):
from sxc.pages.slots import render_slot_add_button
- return sx_response(await render_slot_add_button(g.calendar))
+ return sx_response(render_slot_add_button(g.calendar))
return bp
diff --git a/events/bp/ticket_admin/routes.py b/events/bp/ticket_admin/routes.py
index 88d14b8..6db06ae 100644
--- a/events/bp/ticket_admin/routes.py
+++ b/events/bp/ticket_admin/routes.py
@@ -54,7 +54,7 @@ def register() -> Blueprint:
tickets = await get_tickets_for_entry(g.s, entry_id)
from sxc.pages.tickets import render_entry_tickets_admin
- html = await render_entry_tickets_admin(entry, tickets)
+ html = render_entry_tickets_admin(entry, tickets)
return sx_response(html)
@bp.get("/lookup/")
@@ -71,9 +71,9 @@ def register() -> Blueprint:
ticket = await get_ticket_by_code(g.s, code)
from sxc.pages.tickets import render_lookup_result
if not ticket:
- return sx_response(await render_lookup_result(None, "Ticket not found"))
+ return sx_response(render_lookup_result(None, "Ticket not found"))
- return sx_response(await render_lookup_result(ticket, None))
+ return sx_response(render_lookup_result(ticket, None))
@bp.post("//checkin/")
@require_admin
@@ -84,9 +84,9 @@ def register() -> Blueprint:
from sxc.pages.tickets import render_checkin_result
if not success:
- return sx_response(await render_checkin_result(False, error, None))
+ return sx_response(render_checkin_result(False, error, None))
ticket = await get_ticket_by_code(g.s, code)
- return sx_response(await render_checkin_result(True, None, ticket))
+ return sx_response(render_checkin_result(True, None, ticket))
return bp
diff --git a/events/bp/ticket_type/routes.py b/events/bp/ticket_type/routes.py
index 64f2624..ba72d8a 100644
--- a/events/bp/ticket_type/routes.py
+++ b/events/bp/ticket_type/routes.py
@@ -32,7 +32,7 @@ def register():
from sxc.pages.tickets import render_ticket_type_edit_form
va = request.view_args or {}
- return sx_response(await render_ticket_type_edit_form(
+ return sx_response(render_ticket_type_edit_form(
ticket_type, g.entry, g.calendar,
va.get("day"), va.get("month"), va.get("year"),
))
@@ -47,7 +47,7 @@ def register():
from sxc.pages.tickets import render_ticket_type_main_panel
va = request.view_args or {}
- return sx_response(await render_ticket_type_main_panel(
+ return sx_response(render_ticket_type_main_panel(
ticket_type, g.entry, g.calendar,
va.get("day"), va.get("month"), va.get("year"),
))
@@ -114,7 +114,7 @@ def register():
# Return updated view with OOB flag
from sxc.pages.tickets import render_ticket_type_main_panel
va = request.view_args or {}
- return sx_response(await render_ticket_type_main_panel(
+ return sx_response(render_ticket_type_main_panel(
ticket_type, g.entry, g.calendar,
va.get("day"), va.get("month"), va.get("year"),
oob=True,
@@ -133,7 +133,7 @@ def register():
ticket_types = await svc_list_ticket_types(g.s, g.entry.id)
from sxc.pages.tickets import render_ticket_types_table
va = request.view_args or {}
- return sx_response(await render_ticket_types_table(
+ return sx_response(render_ticket_types_table(
ticket_types, g.entry, g.calendar,
va.get("day"), va.get("month"), va.get("year"),
))
diff --git a/events/bp/ticket_types/routes.py b/events/bp/ticket_types/routes.py
index 05f55b4..abd4a1f 100644
--- a/events/bp/ticket_types/routes.py
+++ b/events/bp/ticket_types/routes.py
@@ -95,7 +95,7 @@ def register():
ticket_types = await svc_list_ticket_types(g.s, g.entry.id)
from sxc.pages.tickets import render_ticket_types_table
va = request.view_args or {}
- return sx_response(await render_ticket_types_table(
+ return sx_response(render_ticket_types_table(
ticket_types, g.entry, g.calendar,
va.get("day"), va.get("month"), va.get("year"),
))
@@ -106,7 +106,7 @@ def register():
"""Show the add ticket type form."""
from sxc.pages.tickets import render_ticket_type_add_form
va = request.view_args or {}
- return sx_response(await render_ticket_type_add_form(
+ return sx_response(render_ticket_type_add_form(
g.entry, g.calendar,
va.get("day"), va.get("month"), va.get("year"),
))
@@ -117,7 +117,7 @@ def register():
"""Show the add ticket type button."""
from sxc.pages.tickets import render_ticket_type_add_button
va = request.view_args or {}
- return sx_response(await render_ticket_type_add_button(
+ return sx_response(render_ticket_type_add_button(
g.entry, g.calendar,
va.get("day"), va.get("month"), va.get("year"),
))
diff --git a/events/bp/tickets/routes.py b/events/bp/tickets/routes.py
index f480e32..e7a6e36 100644
--- a/events/bp/tickets/routes.py
+++ b/events/bp/tickets/routes.py
@@ -127,7 +127,7 @@ def register() -> Blueprint:
cart_count = summary.count + summary.calendar_count + summary.ticket_count
from sxc.pages.tickets import render_buy_result
- return sx_response(await render_buy_result(entry, created, remaining, cart_count))
+ return sx_response(render_buy_result(entry, created, remaining, cart_count))
@bp.post("/adjust/")
@clear_cache(tag="calendars", tag_scope="all")
@@ -250,7 +250,7 @@ def register() -> Blueprint:
cart_count = summary.count + summary.calendar_count + summary.ticket_count
from sxc.pages.tickets import render_adjust_response
- return sx_response(await render_adjust_response(
+ return sx_response(render_adjust_response(
entry, ticket_remaining, ticket_sold_count,
user_ticket_count, user_ticket_counts_by_type, cart_count,
))
diff --git a/events/sxc/pages/calendar.py b/events/sxc/pages/calendar.py
index 28bb587..d4d90a4 100644
--- a/events/sxc/pages/calendar.py
+++ b/events/sxc/pages/calendar.py
@@ -2,7 +2,7 @@
from __future__ import annotations
from shared.sx.helpers import (
- call_url, render_to_sx, render_to_sx_with_env,
+ call_url, sx_call, render_to_sx_with_env,
post_admin_header_sx,
)
from shared.sx.parser import SxExpr
@@ -23,7 +23,7 @@ async def _post_header_sx(ctx: dict, *, oob: bool = False) -> str:
return await post_header_sx(ctx, oob=oob)
-async def _post_nav_sx(ctx: dict) -> str:
+def _post_nav_sx(ctx: dict) -> str:
"""Post desktop nav: calendar links + container nav (markets, etc.)."""
from quart import url_for, g
@@ -37,7 +37,7 @@ async def _post_nav_sx(ctx: dict) -> str:
cal_name = getattr(cal, "name", "") if hasattr(cal, "name") else cal.get("name", "")
href = url_for("calendar.get", calendar_slug=cal_slug)
is_sel = (cal_slug == current_cal_slug)
- parts.append(await render_to_sx("nav-link", href=href, icon="fa fa-calendar",
+ parts.append(sx_call("nav-link", href=href, icon="fa fa-calendar",
label=cal_name, select_colours=select_colours,
is_selected=is_sel))
# Container nav fragments (markets, etc.)
@@ -72,13 +72,13 @@ async def _post_nav_sx(ctx: dict) -> str:
# Calendars header
# ---------------------------------------------------------------------------
-async def _calendars_header_sx(ctx: dict, *, oob: bool = False) -> str:
+def _calendars_header_sx(ctx: dict, *, oob: bool = False) -> str:
"""Build the calendars section header row."""
from quart import url_for
link_href = url_for("calendars.home")
- return await render_to_sx("menu-row-sx", id="calendars-row", level=3,
+ return sx_call("menu-row-sx", id="calendars-row", level=3,
link_href=link_href,
- link_label_content=SxExpr(await render_to_sx("events-calendars-label")),
+ link_label_content=SxExpr(sx_call("events-calendars-label")),
child_id="calendars-header-child", oob=oob)
@@ -86,7 +86,7 @@ async def _calendars_header_sx(ctx: dict, *, oob: bool = False) -> str:
# Calendar header
# ---------------------------------------------------------------------------
-async def _calendar_header_sx(ctx: dict, *, oob: bool = False) -> str:
+def _calendar_header_sx(ctx: dict, *, oob: bool = False) -> str:
"""Build a single calendar's header row."""
from quart import url_for
calendar = ctx.get("calendar")
@@ -97,18 +97,18 @@ async def _calendar_header_sx(ctx: dict, *, oob: bool = False) -> str:
cal_desc = getattr(calendar, "description", "") or ""
link_href = url_for("calendar.get", calendar_slug=cal_slug)
- label_html = await render_to_sx("events-calendar-label",
+ label_html = sx_call("events-calendar-label",
name=cal_name, description=cal_desc)
# Desktop nav: slots + admin
- nav_html = await _calendar_nav_sx(ctx)
+ nav_html = _calendar_nav_sx(ctx)
- return await render_to_sx("menu-row-sx", id="calendar-row", level=3,
+ return sx_call("menu-row-sx", id="calendar-row", level=3,
link_href=link_href, link_label_content=SxExpr(label_html),
nav=SxExpr(nav_html) if nav_html else None, child_id="calendar-header-child", oob=oob)
-async def _calendar_nav_sx(ctx: dict) -> str:
+def _calendar_nav_sx(ctx: dict) -> str:
"""Calendar desktop nav: Slots + admin link."""
from quart import url_for
calendar = ctx.get("calendar")
@@ -121,11 +121,11 @@ async def _calendar_nav_sx(ctx: dict) -> str:
parts = []
slots_href = url_for("defpage_slots_listing", calendar_slug=cal_slug)
- parts.append(await render_to_sx("nav-link", href=slots_href, icon="fa fa-clock",
+ parts.append(sx_call("nav-link", href=slots_href, icon="fa fa-clock",
label="Slots", select_colours=select_colours))
if is_admin:
admin_href = url_for("defpage_calendar_admin", calendar_slug=cal_slug)
- parts.append(await render_to_sx("nav-link", href=admin_href, icon="fa fa-cog",
+ parts.append(sx_call("nav-link", href=admin_href, icon="fa fa-cog",
select_colours=select_colours))
return "(<> " + " ".join(parts) + ")" if parts else ""
@@ -134,7 +134,7 @@ async def _calendar_nav_sx(ctx: dict) -> str:
# Day header
# ---------------------------------------------------------------------------
-async def _day_header_sx(ctx: dict, *, oob: bool = False) -> str:
+def _day_header_sx(ctx: dict, *, oob: bool = False) -> str:
"""Build day detail header row."""
from quart import url_for
calendar = ctx.get("calendar")
@@ -152,17 +152,17 @@ async def _day_header_sx(ctx: dict, *, oob: bool = False) -> str:
month=day_date.month,
day=day_date.day,
)
- label_html = await render_to_sx("events-day-label",
+ label_html = sx_call("events-day-label",
date_str=day_date.strftime("%A %d %B %Y"))
- nav_html = await _day_nav_sx(ctx)
+ nav_html = _day_nav_sx(ctx)
- return await render_to_sx("menu-row-sx", id="day-row", level=4,
+ return sx_call("menu-row-sx", id="day-row", level=4,
link_href=link_href, link_label_content=SxExpr(label_html),
nav=SxExpr(nav_html) if nav_html else None, child_id="day-header-child", oob=oob)
-async def _day_nav_sx(ctx: dict) -> str:
+def _day_nav_sx(ctx: dict) -> str:
"""Day desktop nav: confirmed entries scrolling menu + admin link."""
from quart import url_for
calendar = ctx.get("calendar")
@@ -189,11 +189,11 @@ async def _day_nav_sx(ctx: dict) -> str:
)
start = entry.start_at.strftime("%H:%M") if entry.start_at else ""
end = f" \u2013 {entry.end_at.strftime('%H:%M')}" if entry.end_at else ""
- entry_links.append(await render_to_sx("events-day-entry-link",
+ entry_links.append(sx_call("events-day-entry-link",
href=href, name=entry.name,
time_str=f"{start}{end}"))
inner = "".join(entry_links)
- parts.append(await render_to_sx("events-day-entries-nav", inner=SxExpr(inner)))
+ parts.append(sx_call("events-day-entries-nav", inner=SxExpr(inner)))
if is_admin and day_date:
admin_href = url_for(
@@ -203,7 +203,7 @@ async def _day_nav_sx(ctx: dict) -> str:
month=day_date.month,
day=day_date.day,
)
- parts.append(await render_to_sx("nav-link", href=admin_href, icon="fa fa-cog"))
+ parts.append(sx_call("nav-link", href=admin_href, icon="fa fa-cog"))
return "".join(parts)
@@ -211,7 +211,7 @@ async def _day_nav_sx(ctx: dict) -> str:
# Day admin header
# ---------------------------------------------------------------------------
-async def _day_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
+def _day_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
"""Build day admin header row."""
from quart import url_for
calendar = ctx.get("calendar")
@@ -229,7 +229,7 @@ async def _day_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
month=day_date.month,
day=day_date.day,
)
- return await render_to_sx("menu-row-sx", id="day-admin-row", level=5,
+ return sx_call("menu-row-sx", id="day-admin-row", level=5,
link_href=link_href, link_label="admin", icon="fa fa-cog",
child_id="day-admin-header-child", oob=oob)
@@ -238,7 +238,7 @@ async def _day_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
# Calendar admin header
# ---------------------------------------------------------------------------
-async def _calendar_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
+def _calendar_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
"""Build calendar admin header row with nav links."""
from quart import url_for
calendar = ctx.get("calendar")
@@ -252,11 +252,11 @@ async def _calendar_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
("calendar.admin.calendar_description_edit", "description"),
]:
href = url_for(endpoint, calendar_slug=cal_slug)
- nav_parts.append(await render_to_sx("nav-link", href=href, label=label,
+ nav_parts.append(sx_call("nav-link", href=href, label=label,
select_colours=select_colours))
nav_html = "".join(nav_parts)
- return await render_to_sx("menu-row-sx", id="calendar-admin-row", level=4,
+ return sx_call("menu-row-sx", id="calendar-admin-row", level=4,
link_label="admin", icon="fa fa-cog",
nav=SxExpr(nav_html) if nav_html else None, child_id="calendar-admin-header-child", oob=oob)
@@ -265,13 +265,13 @@ async def _calendar_admin_header_sx(ctx: dict, *, oob: bool = False) -> str:
# Markets header
# ---------------------------------------------------------------------------
-async def _markets_header_sx(ctx: dict, *, oob: bool = False) -> str:
+def _markets_header_sx(ctx: dict, *, oob: bool = False) -> str:
"""Build the markets section header row."""
from quart import url_for
link_href = url_for("defpage_events_markets")
- return await render_to_sx("menu-row-sx", id="markets-row", level=3,
+ return sx_call("menu-row-sx", id="markets-row", level=3,
link_href=link_href,
- link_label_content=SxExpr(await render_to_sx("events-markets-label")),
+ link_label_content=SxExpr(sx_call("events-markets-label")),
child_id="markets-header-child", oob=oob)
@@ -279,7 +279,7 @@ async def _markets_header_sx(ctx: dict, *, oob: bool = False) -> str:
# Calendars main panel
# ---------------------------------------------------------------------------
-async def _calendars_main_panel_sx(ctx: dict) -> str:
+def _calendars_main_panel_sx(ctx: dict) -> str:
"""Render the calendars list + create form panel."""
from quart import url_for
rights = ctx.get("rights") or {}
@@ -294,18 +294,18 @@ async def _calendars_main_panel_sx(ctx: dict) -> str:
form_html = ""
if can_create:
create_url = url_for("calendars.create_calendar")
- form_html = await render_to_sx("crud-create-form",
+ form_html = sx_call("crud-create-form",
create_url=create_url, csrf=csrf,
errors_id="cal-create-errors", list_id="calendars-list",
placeholder="e.g. Events, Gigs, Meetings", btn_label="Add calendar")
- list_html = await _calendars_list_sx(ctx, calendars)
- return await render_to_sx("crud-panel",
+ list_html = _calendars_list_sx(ctx, calendars)
+ return sx_call("crud-panel",
form=SxExpr(form_html), list=SxExpr(list_html),
list_id="calendars-list")
-async def _calendars_list_sx(ctx: dict, calendars: list) -> str:
+def _calendars_list_sx(ctx: dict, calendars: list) -> str:
"""Render the calendars list items."""
from quart import url_for
from shared.utils import route_prefix
@@ -314,7 +314,7 @@ async def _calendars_list_sx(ctx: dict, calendars: list) -> str:
prefix = route_prefix()
if not calendars:
- return await render_to_sx("empty-state", message="No calendars yet. Create one above.",
+ return sx_call("empty-state", message="No calendars yet. Create one above.",
cls="text-gray-500 mt-4")
parts = []
@@ -324,7 +324,7 @@ async def _calendars_list_sx(ctx: dict, calendars: list) -> str:
href = prefix + url_for("calendar.get", calendar_slug=cal_slug)
del_url = url_for("calendar.delete", calendar_slug=cal_slug)
csrf_hdr = f'{{"X-CSRFToken":"{csrf}"}}'
- parts.append(await render_to_sx("crud-item",
+ parts.append(sx_call("crud-item",
href=href, name=cal_name, slug=cal_slug,
del_url=del_url, csrf_hdr=csrf_hdr,
list_id="calendars-list",
@@ -337,7 +337,7 @@ async def _calendars_list_sx(ctx: dict, calendars: list) -> str:
# Calendar month grid
# ---------------------------------------------------------------------------
-async def _calendar_main_panel_html(ctx: dict) -> str:
+def _calendar_main_panel_html(ctx: dict) -> str:
"""Render the calendar month grid."""
from quart import url_for
from quart import session as qsession
@@ -375,10 +375,10 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
("\u2039", prev_month_year, prev_month),
]:
href = nav_link(yr, mn)
- nav_arrows.append(await render_to_sx("events-calendar-nav-arrow",
+ nav_arrows.append(sx_call("events-calendar-nav-arrow",
pill_cls=pill_cls, href=href, label=label))
- nav_arrows.append(await render_to_sx("events-calendar-month-label",
+ nav_arrows.append(sx_call("events-calendar-month-label",
month_name=month_name, year=str(year)))
for label, yr, mn in [
@@ -386,13 +386,13 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
("\u00bb", next_year, month),
]:
href = nav_link(yr, mn)
- nav_arrows.append(await render_to_sx("events-calendar-nav-arrow",
+ nav_arrows.append(sx_call("events-calendar-nav-arrow",
pill_cls=pill_cls, href=href, label=label))
# Weekday headers
wd_parts = []
for wd in weekday_names:
- wd_parts.append(await render_to_sx("events-calendar-weekday", name=wd))
+ wd_parts.append(sx_call("events-calendar-weekday", name=wd))
wd_html = "".join(wd_parts)
# Day cells
@@ -423,9 +423,9 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
calendar_slug=cal_slug,
year=day_date.year, month=day_date.month, day=day_date.day,
)
- day_short_html = await render_to_sx("events-calendar-day-short",
+ day_short_html = sx_call("events-calendar-day-short",
day_str=day_date.strftime("%a"))
- day_num_html = await render_to_sx("events-calendar-day-num",
+ day_num_html = sx_call("events-calendar-day-num",
pill_cls=pill_cls, href=day_href,
num=str(day_date.day))
@@ -443,12 +443,12 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
else:
bg_cls = "bg-sky-100 text-sky-800" if is_mine else "bg-stone-100 text-stone-700"
state_label = (e.state or "pending").replace("_", " ")
- entry_badges.append(await render_to_sx("events-calendar-entry-badge",
+ entry_badges.append(sx_call("events-calendar-entry-badge",
bg_cls=bg_cls, name=e.name,
state_label=state_label))
badges_html = "(<> " + "".join(entry_badges) + ")" if entry_badges else ""
- cells.append(await render_to_sx("events-calendar-cell",
+ cells.append(sx_call("events-calendar-cell",
cell_cls=cell_cls, day_short=SxExpr(day_short_html),
day_num=SxExpr(day_num_html),
badges=SxExpr(badges_html) if badges_html else None))
@@ -456,7 +456,7 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
cells_html = "(<> " + "".join(cells) + ")"
arrows_html = "(<> " + "".join(nav_arrows) + ")"
wd_html = "(<> " + wd_html + ")"
- return await render_to_sx("events-calendar-grid",
+ return sx_call("events-calendar-grid",
arrows=SxExpr(arrows_html), weekdays=SxExpr(wd_html),
cells=SxExpr(cells_html))
@@ -465,7 +465,7 @@ async def _calendar_main_panel_html(ctx: dict) -> str:
# Day main panel
# ---------------------------------------------------------------------------
-async def _day_main_panel_html(ctx: dict) -> str:
+def _day_main_panel_html(ctx: dict) -> str:
"""Render the day entries table + add button."""
from quart import url_for
@@ -488,10 +488,10 @@ async def _day_main_panel_html(ctx: dict) -> str:
if day_entries:
row_parts = []
for entry in day_entries:
- row_parts.append(await _day_row_html(ctx, entry))
+ row_parts.append(_day_row_html(ctx, entry))
rows_html = "".join(row_parts)
else:
- rows_html = await render_to_sx("events-day-empty-row")
+ rows_html = sx_call("events-day-empty-row")
add_url = url_for(
"calendar.day.calendar_entries.add_form",
@@ -499,12 +499,12 @@ async def _day_main_panel_html(ctx: dict) -> str:
day=day, month=month, year=year,
)
- return await render_to_sx("events-day-table",
+ return sx_call("events-day-table",
list_container=list_container, rows=SxExpr(rows_html),
pre_action=pre_action, add_url=add_url)
-async def _day_row_html(ctx: dict, entry) -> str:
+def _day_row_html(ctx: dict, entry) -> str:
"""Render a single day table row."""
from quart import url_for
calendar = ctx.get("calendar")
@@ -523,7 +523,7 @@ async def _day_row_html(ctx: dict, entry) -> str:
)
# Name
- name_html = await render_to_sx("events-day-row-name",
+ name_html = sx_call("events-day-row-name",
href=entry_href, pill_cls=pill_cls, name=entry.name)
# Slot/Time
@@ -532,38 +532,38 @@ async def _day_row_html(ctx: dict, entry) -> str:
slot_href = url_for("defpage_slot_detail", calendar_slug=cal_slug, slot_id=slot.id)
time_start = slot.time_start.strftime("%H:%M") if slot.time_start else ""
time_end = f" \u2192 {slot.time_end.strftime('%H:%M')}" if slot.time_end else ""
- slot_html = await render_to_sx("events-day-row-slot",
+ slot_html = sx_call("events-day-row-slot",
href=slot_href, pill_cls=pill_cls, slot_name=slot.name,
time_str=f"({time_start}{time_end})")
else:
start = entry.start_at.strftime("%H:%M") if entry.start_at else ""
end = f" \u2192 {entry.end_at.strftime('%H:%M')}" if entry.end_at else ""
- slot_html = await render_to_sx("events-day-row-time", start=start, end=end)
+ slot_html = sx_call("events-day-row-time", start=start, end=end)
# State
state = getattr(entry, "state", "pending") or "pending"
- state_badge = await _entry_state_badge_html(state)
- state_td = await render_to_sx("events-day-row-state",
+ state_badge = _entry_state_badge_html(state)
+ state_td = sx_call("events-day-row-state",
state_id=f"entry-state-{entry.id}", badge=SxExpr(state_badge))
# Cost
cost = getattr(entry, "cost", None)
cost_str = f"\u00a3{cost:.2f}" if cost is not None else "\u00a30.00"
- cost_td = await render_to_sx("events-day-row-cost", cost_str=cost_str)
+ cost_td = sx_call("events-day-row-cost", cost_str=cost_str)
# Tickets
tp = getattr(entry, "ticket_price", None)
if tp is not None:
tc = getattr(entry, "ticket_count", None)
tc_str = f"{tc} tickets" if tc is not None else "Unlimited"
- tickets_td = await render_to_sx("events-day-row-tickets",
+ tickets_td = sx_call("events-day-row-tickets",
price_str=f"\u00a3{tp:.2f}", count_str=tc_str)
else:
- tickets_td = await render_to_sx("events-day-row-no-tickets")
+ tickets_td = sx_call("events-day-row-no-tickets")
- actions_td = await render_to_sx("events-day-row-actions")
+ actions_td = sx_call("events-day-row-actions")
- return await render_to_sx("events-day-row",
+ return sx_call("events-day-row",
tr_cls=tr_cls, name=SxExpr(name_html), slot=SxExpr(slot_html),
state=SxExpr(state_td), cost=SxExpr(cost_td),
tickets=SxExpr(tickets_td), actions=SxExpr(actions_td))
@@ -573,16 +573,16 @@ async def _day_row_html(ctx: dict, entry) -> str:
# Day admin main panel
# ---------------------------------------------------------------------------
-async def _day_admin_main_panel_html(ctx: dict) -> str:
+def _day_admin_main_panel_html(ctx: dict) -> str:
"""Render day admin panel (placeholder nav)."""
- return await render_to_sx("events-day-admin-panel")
+ return sx_call("events-day-admin-panel")
# ---------------------------------------------------------------------------
# Calendar admin main panel
# ---------------------------------------------------------------------------
-async def _calendar_admin_main_panel_html(ctx: dict) -> str:
+def _calendar_admin_main_panel_html(ctx: dict) -> str:
"""Render calendar admin config panel with description editor."""
from quart import url_for
calendar = ctx.get("calendar")
@@ -595,17 +595,17 @@ async def _calendar_admin_main_panel_html(ctx: dict) -> str:
hx_select = ctx.get("hx_select_search", "#main-panel")
desc_edit_url = url_for("calendar.admin.calendar_description_edit", calendar_slug=cal_slug)
- description_html = await _calendar_description_display_html(calendar, desc_edit_url)
+ description_html = _calendar_description_display_html(calendar, desc_edit_url)
- return await render_to_sx("events-calendar-admin-panel",
+ return sx_call("events-calendar-admin-panel",
description_content=SxExpr(description_html), csrf=csrf,
description=desc)
-async def _calendar_description_display_html(calendar, edit_url: str) -> str:
+def _calendar_description_display_html(calendar, edit_url: str) -> str:
"""Render calendar description display with edit button."""
desc = getattr(calendar, "description", "") or ""
- return await render_to_sx("events-calendar-description-display",
+ return sx_call("events-calendar-description-display",
description=desc, edit_url=edit_url)
@@ -613,7 +613,7 @@ async def _calendar_description_display_html(calendar, edit_url: str) -> str:
# Markets main panel
# ---------------------------------------------------------------------------
-async def _markets_main_panel_html(ctx: dict) -> str:
+def _markets_main_panel_html(ctx: dict) -> str:
"""Render markets list + create form panel."""
from quart import url_for
rights = ctx.get("rights") or {}
@@ -627,18 +627,18 @@ async def _markets_main_panel_html(ctx: dict) -> str:
form_html = ""
if can_create:
create_url = url_for("markets.create_market")
- form_html = await render_to_sx("crud-create-form",
+ form_html = sx_call("crud-create-form",
create_url=create_url, csrf=csrf,
errors_id="market-create-errors", list_id="markets-list",
placeholder="e.g. Farm Shop, Bakery", btn_label="Add market")
- list_html = await _markets_list_html(ctx, markets)
- return await render_to_sx("crud-panel",
+ list_html = _markets_list_html(ctx, markets)
+ return sx_call("crud-panel",
form=SxExpr(form_html), list=SxExpr(list_html),
list_id="markets-list")
-async def _markets_list_html(ctx: dict, markets: list) -> str:
+def _markets_list_html(ctx: dict, markets: list) -> str:
"""Render markets list items."""
from quart import url_for
csrf_token = ctx.get("csrf_token")
@@ -647,7 +647,7 @@ async def _markets_list_html(ctx: dict, markets: list) -> str:
slug = post.get("slug", "")
if not markets:
- return await render_to_sx("empty-state", message="No markets yet. Create one above.",
+ return sx_call("empty-state", message="No markets yet. Create one above.",
cls="text-gray-500 mt-4")
parts = []
@@ -657,7 +657,7 @@ async def _markets_list_html(ctx: dict, markets: list) -> str:
market_href = call_url(ctx, "market_url", f"/{slug}/{m_slug}/")
del_url = url_for("markets.delete_market", market_slug=m_slug)
csrf_hdr = f'{{"X-CSRFToken":"{csrf}"}}'
- parts.append(await render_to_sx("crud-item",
+ parts.append(sx_call("crud-item",
href=market_href, name=m_name,
slug=m_slug, del_url=del_url,
csrf_hdr=csrf_hdr,
diff --git a/events/sxc/pages/entries.py b/events/sxc/pages/entries.py
index 5c9bdec..b8cd573 100644
--- a/events/sxc/pages/entries.py
+++ b/events/sxc/pages/entries.py
@@ -3,7 +3,7 @@ from __future__ import annotations
from markupsafe import escape
-from shared.sx.helpers import render_to_sx, render_to_sx_with_env
+from shared.sx.helpers import sx_call
from shared.sx.parser import SxExpr
from .utils import (
@@ -16,7 +16,7 @@ from .utils import (
# All events / page summary entry cards
# ---------------------------------------------------------------------------
-async def _entry_card_html(entry, page_info: dict, pending_tickets: dict,
+def _entry_card_html(entry, page_info: dict, pending_tickets: dict,
ticket_url: str, events_url_fn, *, is_page_scoped: bool = False,
post: dict | None = None) -> str:
"""Render a list card for one event entry."""
@@ -35,36 +35,36 @@ async def _entry_card_html(entry, page_info: dict, pending_tickets: dict,
# Title (linked or plain)
if entry_href:
- title_html = await render_to_sx("events-entry-title-linked",
+ title_html = sx_call("events-entry-title-linked",
href=entry_href, name=entry.name)
else:
- title_html = await render_to_sx("events-entry-title-plain", name=entry.name)
+ title_html = sx_call("events-entry-title-plain", name=entry.name)
# Badges
badges_html = ""
if page_title and (not is_page_scoped or page_title != (post or {}).get("title")):
page_href = events_url_fn(f"/{page_slug}/")
- badges_html += await render_to_sx("events-entry-page-badge",
+ badges_html += sx_call("events-entry-page-badge",
href=page_href, title=page_title)
cal_name = getattr(entry, "calendar_name", "")
if cal_name:
- badges_html += await render_to_sx("events-entry-cal-badge", name=cal_name)
+ badges_html += sx_call("events-entry-cal-badge", name=cal_name)
# Time line
time_parts = ""
if day_href and not is_page_scoped:
- time_parts += await render_to_sx("events-entry-time-linked",
+ time_parts += sx_call("events-entry-time-linked",
href=day_href,
date_str=entry.start_at.strftime("%a %-d %b"))
elif not is_page_scoped:
- time_parts += await render_to_sx("events-entry-time-plain",
+ time_parts += sx_call("events-entry-time-plain",
date_str=entry.start_at.strftime("%a %-d %b"))
time_parts += entry.start_at.strftime("%H:%M")
if entry.end_at:
time_parts += f' \u2013 {entry.end_at.strftime("%H:%M")}'
cost = getattr(entry, "cost", None)
- cost_html = await render_to_sx("events-entry-cost",
+ cost_html = sx_call("events-entry-cost",
cost=f"\u00a3{cost:.2f}") if cost else ""
# Ticket widget
@@ -72,16 +72,16 @@ async def _entry_card_html(entry, page_info: dict, pending_tickets: dict,
widget_html = ""
if tp is not None:
qty = pending_tickets.get(entry.id, 0)
- widget_html = await render_to_sx("events-entry-widget-wrapper",
- widget=SxExpr(await _ticket_widget_html(entry, qty, ticket_url, ctx={})))
+ widget_html = sx_call("events-entry-widget-wrapper",
+ widget=SxExpr(_ticket_widget_html(entry, qty, ticket_url, ctx={})))
- return await render_to_sx("events-entry-card",
+ return sx_call("events-entry-card",
title=SxExpr(title_html), badges=SxExpr(badges_html),
time_parts=SxExpr(time_parts), cost=SxExpr(cost_html),
widget=SxExpr(widget_html))
-async def _entry_card_tile_html(entry, page_info: dict, pending_tickets: dict,
+def _entry_card_tile_html(entry, page_info: dict, pending_tickets: dict,
ticket_url: str, events_url_fn, *, is_page_scoped: bool = False,
post: dict | None = None) -> str:
"""Render a tile card for one event entry."""
@@ -100,25 +100,25 @@ async def _entry_card_tile_html(entry, page_info: dict, pending_tickets: dict,
# Title
if entry_href:
- title_html = await render_to_sx("events-entry-title-tile-linked",
+ title_html = sx_call("events-entry-title-tile-linked",
href=entry_href, name=entry.name)
else:
- title_html = await render_to_sx("events-entry-title-tile-plain", name=entry.name)
+ title_html = sx_call("events-entry-title-tile-plain", name=entry.name)
# Badges
badges_html = ""
if page_title and (not is_page_scoped or page_title != (post or {}).get("title")):
page_href = events_url_fn(f"/{page_slug}/")
- badges_html += await render_to_sx("events-entry-page-badge",
+ badges_html += sx_call("events-entry-page-badge",
href=page_href, title=page_title)
cal_name = getattr(entry, "calendar_name", "")
if cal_name:
- badges_html += await render_to_sx("events-entry-cal-badge", name=cal_name)
+ badges_html += sx_call("events-entry-cal-badge", name=cal_name)
# Time
time_html = ""
if day_href:
- time_html += (await render_to_sx("events-entry-time-linked",
+ time_html += (sx_call("events-entry-time-linked",
href=day_href,
date_str=entry.start_at.strftime("%a %-d %b"))).replace(" · ", "")
else:
@@ -128,7 +128,7 @@ async def _entry_card_tile_html(entry, page_info: dict, pending_tickets: dict,
time_html += f' \u2013 {entry.end_at.strftime("%H:%M")}'
cost = getattr(entry, "cost", None)
- cost_html = await render_to_sx("events-entry-cost",
+ cost_html = sx_call("events-entry-cost",
cost=f"\u00a3{cost:.2f}") if cost else ""
# Ticket widget
@@ -136,16 +136,16 @@ async def _entry_card_tile_html(entry, page_info: dict, pending_tickets: dict,
widget_html = ""
if tp is not None:
qty = pending_tickets.get(entry.id, 0)
- widget_html = await render_to_sx("events-entry-tile-widget-wrapper",
- widget=SxExpr(await _ticket_widget_html(entry, qty, ticket_url, ctx={})))
+ widget_html = sx_call("events-entry-tile-widget-wrapper",
+ widget=SxExpr(_ticket_widget_html(entry, qty, ticket_url, ctx={})))
- return await render_to_sx("events-entry-card-tile",
+ return sx_call("events-entry-card-tile",
title=SxExpr(title_html), badges=SxExpr(badges_html),
time=SxExpr(time_html), cost=SxExpr(cost_html),
widget=SxExpr(widget_html))
-async def _entry_cards_html(entries, page_info, pending_tickets, ticket_url,
+def _entry_cards_html(entries, page_info, pending_tickets, ticket_url,
events_url_fn, view, page, has_more, next_url,
*, is_page_scoped=False, post=None) -> str:
"""Render entry cards (list or tile) with sentinel."""
@@ -153,23 +153,23 @@ async def _entry_cards_html(entries, page_info, pending_tickets, ticket_url,
last_date = None
for entry in entries:
if view == "tile":
- parts.append(await _entry_card_tile_html(
+ parts.append(_entry_card_tile_html(
entry, page_info, pending_tickets, ticket_url, events_url_fn,
is_page_scoped=is_page_scoped, post=post,
))
else:
entry_date = entry.start_at.strftime("%A %-d %B %Y") if entry.start_at else ""
if entry_date != last_date:
- parts.append(await render_to_sx("events-date-separator",
+ parts.append(sx_call("events-date-separator",
date_str=entry_date))
last_date = entry_date
- parts.append(await _entry_card_html(
+ parts.append(_entry_card_html(
entry, page_info, pending_tickets, ticket_url, events_url_fn,
is_page_scoped=is_page_scoped, post=post,
))
if has_more:
- parts.append(await render_to_sx("sentinel-simple",
+ parts.append(sx_call("sentinel-simple",
id=f"sentinel-{page}", next_url=next_url))
return "".join(parts)
@@ -178,27 +178,27 @@ async def _entry_cards_html(entries, page_info, pending_tickets, ticket_url,
# All events / page summary main panels
# ---------------------------------------------------------------------------
-async def _events_main_panel_html(ctx: dict, entries, has_more, pending_tickets, page_info,
+def _events_main_panel_html(ctx: dict, entries, has_more, pending_tickets, page_info,
page, view, ticket_url, next_url, events_url_fn,
*, is_page_scoped=False, post=None) -> str:
"""Render the events main panel with view toggle + cards."""
- toggle = await _view_toggle_html(ctx, view)
+ toggle = _view_toggle_html(ctx, view)
if entries:
- cards = await _entry_cards_html(
+ cards = _entry_cards_html(
entries, page_info, pending_tickets, ticket_url, events_url_fn,
view, page, has_more, next_url,
is_page_scoped=is_page_scoped, post=post,
)
grid_cls = ("max-w-full px-3 py-3 grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-4"
if view == "tile" else "max-w-full px-3 py-3 space-y-3")
- body = await render_to_sx("events-grid", grid_cls=grid_cls, cards=SxExpr(cards))
+ body = sx_call("events-grid", grid_cls=grid_cls, cards=SxExpr(cards))
else:
- body = await render_to_sx("empty-state", icon="fa fa-calendar-xmark",
+ body = sx_call("empty-state", icon="fa fa-calendar-xmark",
message="No upcoming events",
cls="px-3 py-12 text-center text-stone-400")
- return await render_to_sx("events-main-panel-body",
+ return sx_call("events-main-panel-body",
toggle=SxExpr(toggle), body=SxExpr(body))
@@ -206,7 +206,7 @@ async def _events_main_panel_html(ctx: dict, entries, has_more, pending_tickets,
# Entry main panel
# ---------------------------------------------------------------------------
-async def _entry_main_panel_html(ctx: dict) -> str:
+def _entry_main_panel_html(ctx: dict) -> str:
"""Render the entry detail panel (name, slot, time, state, cost, tickets,
buy form, date, posts, options + edit button)."""
from quart import url_for
@@ -228,63 +228,63 @@ async def _entry_main_panel_html(ctx: dict) -> str:
eid = entry.id
state = getattr(entry, "state", "pending") or "pending"
- async def _field(label, content_html):
- return await render_to_sx("events-entry-field", label=label, content=SxExpr(content_html))
+ def _field(label, content_html):
+ return sx_call("events-entry-field", label=label, content=SxExpr(content_html))
# Name
- name_html = await _field("Name", await render_to_sx("events-entry-name-field", name=entry.name))
+ name_html = _field("Name", sx_call("events-entry-name-field", name=entry.name))
# Slot
slot = getattr(entry, "slot", None)
if slot:
flex_label = "(flexible)" if getattr(slot, "flexible", False) else "(fixed)"
- slot_inner = await render_to_sx("events-entry-slot-assigned",
+ slot_inner = sx_call("events-entry-slot-assigned",
slot_name=slot.name, flex_label=flex_label)
else:
- slot_inner = await render_to_sx("events-entry-slot-none")
- slot_html = await _field("Slot", slot_inner)
+ slot_inner = sx_call("events-entry-slot-none")
+ slot_html = _field("Slot", slot_inner)
# Time Period
start_str = entry.start_at.strftime("%H:%M") if entry.start_at else ""
end_str = f" \u2013 {entry.end_at.strftime('%H:%M')}" if entry.end_at else " \u2013 open-ended"
- time_html = await _field("Time Period", await render_to_sx("events-entry-time-field",
+ time_html = _field("Time Period", sx_call("events-entry-time-field",
time_str=start_str + end_str))
# State
- state_html = await _field("State", await render_to_sx("events-entry-state-field",
+ state_html = _field("State", sx_call("events-entry-state-field",
entry_id=str(eid),
- badge=SxExpr(await _entry_state_badge_html(state))))
+ badge=SxExpr(_entry_state_badge_html(state))))
# Cost
cost = getattr(entry, "cost", None)
cost_str = f"{cost:.2f}" if cost is not None else "0.00"
- cost_html = await _field("Cost", await render_to_sx("events-entry-cost-field",
+ cost_html = _field("Cost", sx_call("events-entry-cost-field",
cost=f"\u00a3{cost_str}"))
# Ticket Configuration (admin)
- tickets_html = await _field("Tickets", await render_to_sx("events-entry-tickets-field",
+ tickets_html = _field("Tickets", sx_call("events-entry-tickets-field",
entry_id=str(eid),
- tickets_config=SxExpr(await render_entry_tickets_config(entry, calendar, day, month, year))))
+ tickets_config=SxExpr(render_entry_tickets_config(entry, calendar, day, month, year))))
# Buy Tickets (public-facing)
ticket_remaining = ctx.get("ticket_remaining")
ticket_sold_count = ctx.get("ticket_sold_count", 0)
user_ticket_count = ctx.get("user_ticket_count", 0)
user_ticket_counts_by_type = ctx.get("user_ticket_counts_by_type") or {}
- buy_html = await render_buy_form(
+ buy_html = render_buy_form(
entry, ticket_remaining, ticket_sold_count,
user_ticket_count, user_ticket_counts_by_type,
)
# Date
date_str = entry.start_at.strftime("%A, %B %d, %Y") if entry.start_at else ""
- date_html = await _field("Date", await render_to_sx("events-entry-date-field", date_str=date_str))
+ date_html = _field("Date", sx_call("events-entry-date-field", date_str=date_str))
# Associated Posts
entry_posts = ctx.get("entry_posts") or []
- posts_html = await _field("Associated Posts", await render_to_sx("events-entry-posts-field",
+ posts_html = _field("Associated Posts", sx_call("events-entry-posts-field",
entry_id=str(eid),
- posts_panel=SxExpr(await render_entry_posts_panel(entry_posts, entry, calendar, day, month, year))))
+ posts_panel=SxExpr(render_entry_posts_panel(entry_posts, entry, calendar, day, month, year))))
# Options and Edit Button
edit_url = url_for(
@@ -293,14 +293,14 @@ async def _entry_main_panel_html(ctx: dict) -> str:
day=day, month=month, year=year,
)
- return await render_to_sx("events-entry-panel",
+ return sx_call("events-entry-panel",
entry_id=str(eid), list_container=list_container,
name=SxExpr(name_html), slot=SxExpr(slot_html),
time=SxExpr(time_html), state=SxExpr(state_html),
cost=SxExpr(cost_html), tickets=SxExpr(tickets_html),
buy=SxExpr(buy_html), date=SxExpr(date_html),
posts=SxExpr(posts_html),
- options=SxExpr(await _entry_options_html(entry, calendar, day, month, year)),
+ options=SxExpr(_entry_options_html(entry, calendar, day, month, year)),
pre_action=pre_action, edit_url=edit_url)
@@ -308,7 +308,7 @@ async def _entry_main_panel_html(ctx: dict) -> str:
# Entry header row
# ---------------------------------------------------------------------------
-async def _entry_header_html(ctx: dict, *, oob: bool = False) -> str:
+def _entry_header_html(ctx: dict, *, oob: bool = False) -> str:
"""Build entry detail header row."""
from quart import url_for
@@ -329,19 +329,19 @@ async def _entry_header_html(ctx: dict, *, oob: bool = False) -> str:
year=year, month=month, day=day,
entry_id=entry.id,
)
- label_html = await render_to_sx("events-entry-label",
+ label_html = sx_call("events-entry-label",
entry_id=str(entry.id),
- title=SxExpr(await _entry_title_html(entry)),
- times=SxExpr(await _entry_times_html(entry)))
+ title=SxExpr(_entry_title_html(entry)),
+ times=SxExpr(_entry_times_html(entry)))
- nav_html = await _entry_nav_html(ctx)
+ nav_html = _entry_nav_html(ctx)
- return await render_to_sx("menu-row-sx", id="entry-row", level=5,
+ return sx_call("menu-row-sx", id="entry-row", level=5,
link_href=link_href, link_label_content=SxExpr(label_html),
nav=SxExpr(nav_html) if nav_html else None, child_id="entry-header-child", oob=oob)
-async def _entry_times_html(entry) -> str:
+def _entry_times_html(entry) -> str:
"""Render entry times label."""
start = entry.start_at
end = entry.end_at
@@ -349,14 +349,14 @@ async def _entry_times_html(entry) -> str:
return ""
start_str = start.strftime("%H:%M")
end_str = f" \u2192 {end.strftime('%H:%M')}" if end else ""
- return await render_to_sx("events-entry-times", time_str=start_str + end_str)
+ return sx_call("events-entry-times", time_str=start_str + end_str)
# ---------------------------------------------------------------------------
# Entry nav (desktop + admin link)
# ---------------------------------------------------------------------------
-async def _entry_nav_html(ctx: dict) -> str:
+def _entry_nav_html(ctx: dict) -> str:
"""Entry desktop nav: associated posts scrolling menu + admin link."""
from quart import url_for
@@ -387,12 +387,12 @@ async def _entry_nav_html(ctx: dict) -> str:
feat = getattr(ep, "feature_image", None)
href = blog_url_fn(f"/{slug}/") if blog_url_fn else f"/{slug}/"
if feat:
- img_html = await render_to_sx("events-post-img", src=feat, alt=title)
+ img_html = sx_call("events-post-img", src=feat, alt=title)
else:
- img_html = await render_to_sx("events-post-img-placeholder")
- post_links += await render_to_sx("events-entry-nav-post-link",
+ img_html = sx_call("events-post-img-placeholder")
+ post_links += sx_call("events-entry-nav-post-link",
href=href, img=SxExpr(img_html), title=title)
- parts.append((await render_to_sx("events-entry-posts-nav-oob",
+ parts.append((sx_call("events-entry-posts-nav-oob",
items=SxExpr(post_links))).replace(' :hx-swap-oob "true"', ''))
# Admin link
@@ -403,7 +403,7 @@ async def _entry_nav_html(ctx: dict) -> str:
day=day, month=month, year=year,
entry_id=entry.id,
)
- parts.append(await render_to_sx("events-entry-admin-link", href=admin_url))
+ parts.append(sx_call("events-entry-admin-link", href=admin_url))
return "".join(parts)
@@ -412,26 +412,26 @@ async def _entry_nav_html(ctx: dict) -> str:
# Entry optioned (confirm/decline/provisional response)
# ---------------------------------------------------------------------------
-async def render_entry_optioned(entry, calendar, day, month, year) -> str:
+def render_entry_optioned(entry, calendar, day, month, year) -> str:
"""Render entry options buttons + OOB title & state swaps."""
- options = await _entry_options_html(entry, calendar, day, month, year)
- title = await _entry_title_html(entry)
- state = await _entry_state_badge_html(getattr(entry, "state", "pending") or "pending")
+ options = _entry_options_html(entry, calendar, day, month, year)
+ title = _entry_title_html(entry)
+ state = _entry_state_badge_html(getattr(entry, "state", "pending") or "pending")
- return options + await render_to_sx("events-entry-optioned-oob",
+ return options + sx_call("events-entry-optioned-oob",
entry_id=str(entry.id),
title=SxExpr(title), state=SxExpr(state))
-async def _entry_title_html(entry) -> str:
+def _entry_title_html(entry) -> str:
"""Render entry title (icon + name + state badge)."""
state = getattr(entry, "state", "pending") or "pending"
- return await render_to_sx("events-entry-title",
+ return sx_call("events-entry-title",
name=entry.name,
- badge=SxExpr(await _entry_state_badge_html(state)))
+ badge=SxExpr(_entry_state_badge_html(state)))
-async def _entry_options_html(entry, calendar, day, month, year) -> str:
+def _entry_options_html(entry, calendar, day, month, year) -> str:
"""Render confirm/decline/provisional buttons based on entry state."""
from quart import url_for, g
from shared.browser.app.csrf import generate_csrf_token
@@ -445,13 +445,13 @@ async def _entry_options_html(entry, calendar, day, month, year) -> str:
state = getattr(entry, "state", "pending") or "pending"
target = f"#calendar_entry_options_{eid}"
- async def _make_button(action_name, label, confirm_title, confirm_text, *, trigger_type="submit"):
+ def _make_button(action_name, label, confirm_title, confirm_text, *, trigger_type="submit"):
url = url_for(
f"calendar.day.calendar_entries.calendar_entry.{action_name}",
calendar_slug=cal_slug, day=day, month=month, year=year, entry_id=eid,
)
btn_type = "button" if trigger_type == "button" else "submit"
- return await render_to_sx("events-entry-option-button",
+ return sx_call("events-entry-option-button",
url=url, target=target, csrf=csrf, btn_type=btn_type,
action_btn=action_btn, confirm_title=confirm_title,
confirm_text=confirm_text, label=label,
@@ -459,22 +459,22 @@ async def _entry_options_html(entry, calendar, day, month, year) -> str:
buttons_html = ""
if state == "provisional":
- buttons_html += await _make_button(
+ buttons_html += _make_button(
"confirm_entry", "confirm",
"Confirm entry?", "Are you sure you want to confirm this entry?",
)
- buttons_html += await _make_button(
+ buttons_html += _make_button(
"decline_entry", "decline",
"Decline entry?", "Are you sure you want to decline this entry?",
)
elif state == "confirmed":
- buttons_html += await _make_button(
+ buttons_html += _make_button(
"provisional_entry", "provisional",
"Provisional entry?", "Are you sure you want to provisional this entry?",
trigger_type="button",
)
- return await render_to_sx("events-entry-options",
+ return sx_call("events-entry-options",
entry_id=str(eid), buttons=SxExpr(buttons_html))
@@ -482,7 +482,7 @@ async def _entry_options_html(entry, calendar, day, month, year) -> str:
# Entry tickets config (display + form)
# ---------------------------------------------------------------------------
-async def render_entry_tickets_config(entry, calendar, day, month, year) -> str:
+def render_entry_tickets_config(entry, calendar, day, month, year) -> str:
"""Render ticket config display + edit form for admin entry view."""
from quart import url_for
from shared.browser.app.csrf import generate_csrf_token
@@ -499,11 +499,11 @@ async def render_entry_tickets_config(entry, calendar, day, month, year) -> str:
if tp is not None:
tc_str = f"{tc} tickets" if tc is not None else "Unlimited"
- display_html = await render_to_sx("events-ticket-config-display",
+ display_html = sx_call("events-ticket-config-display",
price_str=f"\u00a3{tp:.2f}",
count_str=tc_str, show_js=show_js)
else:
- display_html = await render_to_sx("events-ticket-config-none", show_js=show_js)
+ display_html = sx_call("events-ticket-config-none", show_js=show_js)
update_url = url_for(
"calendar.day.calendar_entries.calendar_entry.update_tickets",
@@ -513,7 +513,7 @@ async def render_entry_tickets_config(entry, calendar, day, month, year) -> str:
tp_val = f"{tp:.2f}" if tp is not None else ""
tc_val = str(tc) if tc is not None else ""
- form_html = await render_to_sx("events-ticket-config-form",
+ form_html = sx_call("events-ticket-config-form",
entry_id=eid_s, hidden_cls=hidden_cls,
update_url=update_url, csrf=csrf,
price_val=tp_val, count_val=tc_val, hide_js=hide_js)
@@ -524,7 +524,7 @@ async def render_entry_tickets_config(entry, calendar, day, month, year) -> str:
# Entry posts panel
# ---------------------------------------------------------------------------
-async def render_entry_posts_panel(entry_posts, entry, calendar, day, month, year) -> str:
+def render_entry_posts_panel(entry_posts, entry, calendar, day, month, year) -> str:
"""Render associated posts list with remove buttons and search input."""
from quart import url_for
from shared.browser.app.csrf import generate_csrf_token
@@ -541,28 +541,28 @@ async def render_entry_posts_panel(entry_posts, entry, calendar, day, month, yea
ep_title = getattr(ep, "title", "")
ep_id = getattr(ep, "id", 0)
feat = getattr(ep, "feature_image", None)
- img_html = (await render_to_sx("events-post-img", src=feat, alt=ep_title)
- if feat else await render_to_sx("events-post-img-placeholder"))
+ img_html = (sx_call("events-post-img", src=feat, alt=ep_title)
+ if feat else sx_call("events-post-img-placeholder"))
del_url = url_for(
"calendar.day.calendar_entries.calendar_entry.remove_post",
calendar_slug=cal_slug, day=day, month=month, year=year,
entry_id=eid, post_id=ep_id,
)
- items += await render_to_sx("events-entry-post-item",
+ items += sx_call("events-entry-post-item",
img=SxExpr(img_html), title=ep_title,
del_url=del_url, entry_id=eid_s,
csrf_hdr=f'{{"X-CSRFToken": "{csrf}"}}')
- posts_html = await render_to_sx("events-entry-posts-list", items=SxExpr(items))
+ posts_html = sx_call("events-entry-posts-list", items=SxExpr(items))
else:
- posts_html = await render_to_sx("events-entry-posts-none")
+ posts_html = sx_call("events-entry-posts-none")
search_url = url_for(
"calendar.day.calendar_entries.calendar_entry.search_posts",
calendar_slug=cal_slug, day=day, month=month, year=year, entry_id=eid,
)
- return await render_to_sx("events-entry-posts-panel",
+ return sx_call("events-entry-posts-panel",
posts=SxExpr(posts_html), search_url=search_url,
entry_id=eid_s)
@@ -571,7 +571,7 @@ async def render_entry_posts_panel(entry_posts, entry, calendar, day, month, yea
# Entry posts nav OOB
# ---------------------------------------------------------------------------
-async def render_entry_posts_nav_oob(entry_posts) -> str:
+def render_entry_posts_nav_oob(entry_posts) -> str:
"""Render OOB nav for entry posts (scrolling menu)."""
from quart import g
styles = getattr(g, "styles", None) or {}
@@ -579,7 +579,7 @@ async def render_entry_posts_nav_oob(entry_posts) -> str:
blog_url_fn = getattr(g, "blog_url", None)
if not entry_posts:
- return await render_to_sx("events-entry-posts-nav-oob-empty")
+ return sx_call("events-entry-posts-nav-oob-empty")
items = ""
for ep in entry_posts:
@@ -587,20 +587,20 @@ async def render_entry_posts_nav_oob(entry_posts) -> str:
title = getattr(ep, "title", "")
feat = getattr(ep, "feature_image", None)
href = blog_url_fn(f"/{slug}/") if blog_url_fn else f"/{slug}/"
- img_html = (await render_to_sx("events-post-img", src=feat, alt=title)
- if feat else await render_to_sx("events-post-img-placeholder"))
- items += await render_to_sx("events-entry-nav-post",
+ img_html = (sx_call("events-post-img", src=feat, alt=title)
+ if feat else sx_call("events-post-img-placeholder"))
+ items += sx_call("events-entry-nav-post",
href=href, nav_btn=nav_btn,
img=SxExpr(img_html), title=title)
- return await render_to_sx("events-entry-posts-nav-oob", items=SxExpr(items))
+ return sx_call("events-entry-posts-nav-oob", items=SxExpr(items))
# ---------------------------------------------------------------------------
# Day entries nav OOB
# ---------------------------------------------------------------------------
-async def render_day_entries_nav_oob(confirmed_entries, calendar, day_date) -> str:
+def render_day_entries_nav_oob(confirmed_entries, calendar, day_date) -> str:
"""Render OOB nav for confirmed entries in a day."""
from quart import url_for, g
@@ -609,7 +609,7 @@ async def render_day_entries_nav_oob(confirmed_entries, calendar, day_date) -> s
cal_slug = getattr(calendar, "slug", "")
if not confirmed_entries:
- return await render_to_sx("events-day-entries-nav-oob-empty")
+ return sx_call("events-day-entries-nav-oob-empty")
items = ""
for entry in confirmed_entries:
@@ -621,18 +621,18 @@ async def render_day_entries_nav_oob(confirmed_entries, calendar, day_date) -> s
)
start = entry.start_at.strftime("%H:%M") if entry.start_at else ""
end = f" \u2013 {entry.end_at.strftime('%H:%M')}" if entry.end_at else ""
- items += await render_to_sx("events-day-nav-entry",
+ items += sx_call("events-day-nav-entry",
href=href, nav_btn=nav_btn,
name=entry.name, time_str=start + end)
- return await render_to_sx("events-day-entries-nav-oob", items=SxExpr(items))
+ return sx_call("events-day-entries-nav-oob", items=SxExpr(items))
# ---------------------------------------------------------------------------
# Post nav entries OOB
# ---------------------------------------------------------------------------
-async def render_post_nav_entries_oob(associated_entries, calendars, post) -> str:
+def render_post_nav_entries_oob(associated_entries, calendars, post) -> str:
"""Render OOB nav for associated entries and calendars of a post."""
from quart import g
from shared.infrastructure.urls import events_url
@@ -644,7 +644,7 @@ async def render_post_nav_entries_oob(associated_entries, calendars, post) -> st
has_items = has_entries or calendars
if not has_items:
- return await render_to_sx("events-post-nav-oob-empty")
+ return sx_call("events-post-nav-oob-empty")
slug = post.get("slug", "") if isinstance(post, dict) else getattr(post, "slug", "")
@@ -659,7 +659,7 @@ async def render_post_nav_entries_oob(associated_entries, calendars, post) -> st
href = events_url(entry_path)
time_str = entry.start_at.strftime("%b %d, %Y at %H:%M")
end_str = f" \u2013 {entry.end_at.strftime('%H:%M')}" if entry.end_at else ""
- items += await render_to_sx("events-post-nav-entry",
+ items += sx_call("events-post-nav-entry",
href=href, nav_btn=nav_btn,
name=entry.name, time_str=time_str + end_str)
@@ -667,7 +667,7 @@ async def render_post_nav_entries_oob(associated_entries, calendars, post) -> st
for cal in calendars:
cs = getattr(cal, "slug", "")
local_href = events_url(f"/{slug}/{cs}/")
- items += await render_to_sx("events-post-nav-calendar",
+ items += sx_call("events-post-nav-calendar",
href=local_href, nav_btn=nav_btn, name=cal.name)
hs = ("on load or scroll "
@@ -675,7 +675,7 @@ async def render_post_nav_entries_oob(associated_entries, calendars, post) -> st
"remove .hidden from .entries-nav-arrow add .flex to .entries-nav-arrow "
"else add .hidden to .entries-nav-arrow remove .flex from .entries-nav-arrow end")
- return await render_to_sx("events-post-nav-wrapper",
+ return sx_call("events-post-nav-wrapper",
items=SxExpr(items), hyperscript=hs)
@@ -683,23 +683,23 @@ async def render_post_nav_entries_oob(associated_entries, calendars, post) -> st
# Calendar description display + edit form
# ---------------------------------------------------------------------------
-async def render_calendar_description(calendar, *, oob: bool = False) -> str:
+def render_calendar_description(calendar, *, oob: bool = False) -> str:
"""Render calendar description display with edit button, optionally with OOB title."""
from quart import url_for
from .calendar import _calendar_description_display_html
cal_slug = getattr(calendar, "slug", "")
edit_url = url_for("calendar.admin.calendar_description_edit", calendar_slug=cal_slug)
- html = await _calendar_description_display_html(calendar, edit_url)
+ html = _calendar_description_display_html(calendar, edit_url)
if oob:
desc = getattr(calendar, "description", "") or ""
- html += await render_to_sx("events-calendar-description-title-oob",
+ html += sx_call("events-calendar-description-title-oob",
description=desc)
return html
-async def render_calendar_description_edit(calendar) -> str:
+def render_calendar_description_edit(calendar) -> str:
"""Render calendar description edit form."""
from quart import url_for
from shared.browser.app.csrf import generate_csrf_token
@@ -710,7 +710,7 @@ async def render_calendar_description_edit(calendar) -> str:
save_url = url_for("calendar.admin.calendar_description_save", calendar_slug=cal_slug)
cancel_url = url_for("calendar.admin.calendar_description_view", calendar_slug=cal_slug)
- return await render_to_sx("events-calendar-description-edit-form",
+ return sx_call("events-calendar-description-edit-form",
save_url=save_url, cancel_url=cancel_url,
csrf=csrf, description=desc)
@@ -719,7 +719,7 @@ async def render_calendar_description_edit(calendar) -> str:
# Entry admin page / OOB
# ---------------------------------------------------------------------------
-async def _entry_admin_header_html(ctx: dict, *, oob: bool = False) -> str:
+def _entry_admin_header_html(ctx: dict, *, oob: bool = False) -> str:
"""Build the entry admin header row."""
from quart import url_for
@@ -739,14 +739,14 @@ async def _entry_admin_header_html(ctx: dict, *, oob: bool = False) -> str:
calendar_slug=cal_slug, day=day, month=month, year=year, entry_id=entry.id,
)
# Nav: ticket_types link
- nav_html = await _entry_admin_nav_html(ctx)
+ nav_html = _entry_admin_nav_html(ctx)
- return await render_to_sx("menu-row-sx", id="entry-admin-row", level=6,
+ return sx_call("menu-row-sx", id="entry-admin-row", level=6,
link_href=link_href, link_label="admin", icon="fa fa-cog",
nav=SxExpr(nav_html) if nav_html else None, child_id="entry-admin-header-child", oob=oob)
-async def _entry_admin_nav_html(ctx: dict) -> str:
+def _entry_admin_nav_html(ctx: dict) -> str:
"""Entry admin nav: ticket_types link."""
from quart import url_for
@@ -765,11 +765,11 @@ async def _entry_admin_nav_html(ctx: dict) -> str:
href = url_for("calendar.day.calendar_entries.calendar_entry.ticket_types.get",
calendar_slug=cal_slug, entry_id=entry.id,
year=year, month=month, day=day)
- return await render_to_sx("nav-link", href=href, label="ticket_types",
+ return sx_call("nav-link", href=href, label="ticket_types",
select_colours=select_colours)
-async def _entry_admin_main_panel_html(ctx: dict) -> str:
+def _entry_admin_main_panel_html(ctx: dict) -> str:
"""Entry admin main panel: just a ticket_types link."""
from quart import url_for
@@ -789,7 +789,7 @@ async def _entry_admin_main_panel_html(ctx: dict) -> str:
href = url_for("calendar.day.calendar_entries.calendar_entry.ticket_types.get",
calendar_slug=cal_slug, entry_id=entry.id,
year=year, month=month, day=day)
- return await render_to_sx("nav-link", href=href, label="ticket_types",
+ return sx_call("nav-link", href=href, label="ticket_types",
select_colours=select_colours, aclass=nav_btn,
is_selected=False)
@@ -798,7 +798,7 @@ async def _entry_admin_main_panel_html(ctx: dict) -> str:
# Post search results
# ---------------------------------------------------------------------------
-async def render_post_search_results(search_posts, search_query, page, total_pages,
+def render_post_search_results(search_posts, search_query, page, total_pages,
entry, calendar, day, month, year) -> str:
"""Render post search results (replaces _types/entry/_post_search_results.html)."""
from quart import url_for
@@ -816,11 +816,11 @@ async def render_post_search_results(search_posts, search_query, page, total_pag
feat = getattr(sp, "feature_image", None)
title = getattr(sp, "title", "")
if feat:
- img_html = await render_to_sx("events-post-img", src=feat, alt=title)
+ img_html = sx_call("events-post-img", src=feat, alt=title)
else:
- img_html = await render_to_sx("events-post-img-placeholder")
+ img_html = sx_call("events-post-img-placeholder")
- parts.append(await render_to_sx("events-post-search-item",
+ parts.append(sx_call("events-post-search-item",
post_url=post_url, entry_id=str(eid), csrf=csrf,
post_id=str(sp.id), img=SxExpr(img_html), title=title))
@@ -830,10 +830,10 @@ async def render_post_search_results(search_posts, search_query, page, total_pag
next_url = url_for("calendar.day.calendar_entries.calendar_entry.search_posts",
calendar_slug=cal_slug, day=day, month=month, year=year,
entry_id=eid, q=search_query, page=page + 1)
- result += await render_to_sx("events-post-search-sentinel",
+ result += sx_call("events-post-search-sentinel",
page=str(page), next_url=next_url)
elif search_posts:
- result += await render_to_sx("events-post-search-end")
+ result += sx_call("events-post-search-end")
return result
@@ -842,7 +842,7 @@ async def render_post_search_results(search_posts, search_query, page, total_pag
# Entry edit form
# ---------------------------------------------------------------------------
-async def render_entry_edit_form(entry, calendar, day, month, year, day_slots) -> str:
+def render_entry_edit_form(entry, calendar, day, month, year, day_slots) -> str:
"""Render entry edit form (replaces _types/entry/_edit.html)."""
from quart import url_for, g
from shared.browser.app.csrf import generate_csrf_token
@@ -863,11 +863,11 @@ async def render_entry_edit_form(entry, calendar, day, month, year, day_slots) -
# Slot picker
if day_slots:
- options_html = await _slot_options_html(day_slots, selected_slot_id=getattr(entry, "slot_id", None))
- slot_picker_html = await render_to_sx("events-slot-picker",
+ options_html = _slot_options_html(day_slots, selected_slot_id=getattr(entry, "slot_id", None))
+ slot_picker_html = sx_call("events-slot-picker",
id=f"entry-slot-{eid}", options=SxExpr(options_html))
else:
- slot_picker_html = await render_to_sx("events-no-slots")
+ slot_picker_html = sx_call("events-no-slots")
# Values
start_val = entry.start_at.strftime("%H:%M") if entry.start_at else ""
@@ -879,7 +879,7 @@ async def render_entry_edit_form(entry, calendar, day, month, year, day_slots) -
tp_val = f"{tp:.2f}" if tp is not None else ""
tc_val = str(tc) if tc is not None else ""
- html = await render_to_sx("events-entry-edit-form",
+ html = sx_call("events-entry-edit-form",
entry_id=str(eid), list_container=list_container,
put_url=put_url, cancel_url=cancel_url, csrf=csrf,
name_val=entry.name or "", slot_picker=SxExpr(slot_picker_html),
@@ -893,7 +893,7 @@ async def render_entry_edit_form(entry, calendar, day, month, year, day_slots) -
# Entry add form / button
# ---------------------------------------------------------------------------
-async def render_entry_add_form(calendar, day, month, year, day_slots) -> str:
+def render_entry_add_form(calendar, day, month, year, day_slots) -> str:
"""Render entry add form (replaces _types/day/_add.html)."""
from quart import url_for, g
from shared.browser.app.csrf import generate_csrf_token
@@ -912,13 +912,13 @@ async def render_entry_add_form(calendar, day, month, year, day_slots) -> str:
# Slot picker
if day_slots:
- options_html = await _slot_options_html(day_slots)
- slot_picker_html = await render_to_sx("events-slot-picker",
+ options_html = _slot_options_html(day_slots)
+ slot_picker_html = sx_call("events-slot-picker",
id="entry-slot-new", options=SxExpr(options_html))
else:
- slot_picker_html = await render_to_sx("events-no-slots")
+ slot_picker_html = sx_call("events-no-slots")
- html = await render_to_sx("events-entry-add-form",
+ html = sx_call("events-entry-add-form",
post_url=post_url, csrf=csrf,
slot_picker=SxExpr(slot_picker_html),
action_btn=action_btn, cancel_btn=cancel_btn,
@@ -926,7 +926,7 @@ async def render_entry_add_form(calendar, day, month, year, day_slots) -> str:
return html + _SLOT_PICKER_JS
-async def render_entry_add_button(calendar, day, month, year) -> str:
+def render_entry_add_button(calendar, day, month, year) -> str:
"""Render entry add button (replaces _types/day/_add_button.html)."""
from quart import url_for, g
@@ -936,14 +936,14 @@ async def render_entry_add_button(calendar, day, month, year) -> str:
add_url = url_for("calendar.day.calendar_entries.add_form",
calendar_slug=cal_slug, day=day, month=month, year=year)
- return await render_to_sx("events-entry-add-button", pre_action=pre_action, add_url=add_url)
+ return sx_call("events-entry-add-button", pre_action=pre_action, add_url=add_url)
# ---------------------------------------------------------------------------
# Fragment: container cards entries
# ---------------------------------------------------------------------------
-async def render_fragment_container_cards(batch, post_ids, slug_map) -> str:
+def render_fragment_container_cards(batch, post_ids, slug_map) -> str:
"""Render container cards entries (replaces fragments/container_cards_entries.html)."""
from shared.infrastructure.urls import events_url
@@ -963,12 +963,12 @@ async def render_fragment_container_cards(batch, post_ids, slug_map) -> str:
time_str = entry.start_at.strftime("%H:%M")
if entry.end_at:
time_str += f" \u2013 {entry.end_at.strftime('%H:%M')}"
- cards_html += await render_to_sx("events-frag-entry-card",
+ cards_html += sx_call("events-frag-entry-card",
href=events_url(_entry_path),
name=entry.name,
date_str=entry.start_at.strftime("%a, %b %d"),
time_str=time_str)
- parts.append(await render_to_sx("events-frag-entries-widget", cards=SxExpr(cards_html)))
+ parts.append(sx_call("events-frag-entries-widget", cards=SxExpr(cards_html)))
parts.append(f"")
return "\n".join(parts)
@@ -978,7 +978,7 @@ async def render_fragment_container_cards(batch, post_ids, slug_map) -> str:
# Fragment: account page tickets
# ---------------------------------------------------------------------------
-async def render_fragment_account_tickets(tickets) -> str:
+def render_fragment_account_tickets(tickets) -> str:
"""Render account page tickets (replaces fragments/account_page_tickets.html)."""
from shared.infrastructure.urls import events_url
@@ -993,25 +993,25 @@ async def render_fragment_account_tickets(tickets) -> str:
type_name = ""
if getattr(ticket, "ticket_type_name", None):
type_name = f'· {escape(ticket.ticket_type_name)}'
- badge_html = await render_to_sx("status-pill",
+ badge_html = sx_call("status-pill",
status=getattr(ticket, "state", ""))
- items_html += await render_to_sx("events-frag-ticket-item",
+ items_html += sx_call("events-frag-ticket-item",
href=href, entry_name=ticket.entry_name,
date_str=date_str, calendar_name=cal_name,
type_name=type_name, badge=SxExpr(badge_html))
- body = await render_to_sx("events-frag-tickets-list", items=SxExpr(items_html))
+ body = sx_call("events-frag-tickets-list", items=SxExpr(items_html))
else:
- body = await render_to_sx("empty-state", message="No tickets yet.",
+ body = sx_call("empty-state", message="No tickets yet.",
cls="text-sm text-stone-500")
- return await render_to_sx("events-frag-tickets-panel", items=SxExpr(body))
+ return sx_call("events-frag-tickets-panel", items=SxExpr(body))
# ---------------------------------------------------------------------------
# Fragment: account page bookings
# ---------------------------------------------------------------------------
-async def render_fragment_account_bookings(bookings) -> str:
+def render_fragment_account_bookings(bookings) -> str:
"""Render account page bookings (replaces fragments/account_page_bookings.html)."""
if bookings:
items_html = ""
@@ -1027,16 +1027,16 @@ async def render_fragment_account_bookings(bookings) -> str:
cost_str = ""
if getattr(booking, "cost", None):
cost_str = f'· £{escape(str(booking.cost))}'
- badge_html = await render_to_sx("status-pill",
+ badge_html = sx_call("status-pill",
status=getattr(booking, "state", ""))
- items_html += await render_to_sx("events-frag-booking-item",
+ items_html += sx_call("events-frag-booking-item",
name=booking.name,
date_str=date_str + date_str_extra,
calendar_name=cal_name, cost_str=cost_str,
badge=SxExpr(badge_html))
- body = await render_to_sx("events-frag-bookings-list", items=SxExpr(items_html))
+ body = sx_call("events-frag-bookings-list", items=SxExpr(items_html))
else:
- body = await render_to_sx("empty-state", message="No bookings yet.",
+ body = sx_call("empty-state", message="No bookings yet.",
cls="text-sm text-stone-500")
- return await render_to_sx("events-frag-bookings-panel", items=SxExpr(body))
+ return sx_call("events-frag-bookings-panel", items=SxExpr(body))
diff --git a/events/sxc/pages/helpers.py b/events/sxc/pages/helpers.py
index 8604e05..ddf8dab 100644
--- a/events/sxc/pages/helpers.py
+++ b/events/sxc/pages/helpers.py
@@ -3,7 +3,7 @@ from __future__ import annotations
from typing import Any
-from shared.sx.helpers import render_to_sx
+from shared.sx.helpers import sx_call
from .utils import _clear_deeper_oob, _ensure_container_nav
from .calendar import (
@@ -235,8 +235,8 @@ async def _cal_admin_full(ctx: dict, **kw: Any) -> str:
return await render_to_sx_with_env("events-cal-admin-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
admin_header=SxExpr(await post_admin_header_sx(ctx, slug, selected="calendars")),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- calendar_admin_header=SxExpr(await _calendar_admin_header_sx(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ calendar_admin_header=SxExpr(_calendar_admin_header_sx(ctx)),
)
@@ -247,9 +247,9 @@ async def _cal_admin_oob(ctx: dict, **kw: Any) -> str:
slug = (ctx.get("post") or {}).get("slug", "")
return await render_to_sx_with_env("events-cal-admin-layout-oob", {},
admin_oob=SxExpr(await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")),
- cal_oob=SxExpr(await _calendar_header_sx(ctx, oob=True)),
+ cal_oob=SxExpr(_calendar_header_sx(ctx, oob=True)),
cal_admin_oob_wrap=SxExpr(await oob_header_sx("calendar-header-child",
- "calendar-admin-header-child", await _calendar_admin_header_sx(ctx))),
+ "calendar-admin-header-child", _calendar_admin_header_sx(ctx))),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"post-admin-row", "post-admin-header-child",
"calendar-row", "calendar-header-child",
@@ -270,7 +270,7 @@ async def _slots_oob(ctx: dict, **kw: Any) -> str:
slug = (ctx.get("post") or {}).get("slug", "")
return await render_to_sx_with_env("events-slots-layout-oob", {},
admin_oob=SxExpr(await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")),
- cal_admin_oob=SxExpr(await _calendar_admin_header_sx(ctx, oob=True)),
+ cal_admin_oob=SxExpr(_calendar_admin_header_sx(ctx, oob=True)),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"post-admin-row", "post-admin-header-child",
"calendar-row", "calendar-header-child",
@@ -288,9 +288,9 @@ async def _slot_full(ctx: dict, **kw: Any) -> str:
return await render_to_sx_with_env("events-slot-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
admin_header=SxExpr(await post_admin_header_sx(ctx, slug, selected="calendars")),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- calendar_admin_header=SxExpr(await _calendar_admin_header_sx(ctx)),
- slot_header=SxExpr(await _slot_header_html(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ calendar_admin_header=SxExpr(_calendar_admin_header_sx(ctx)),
+ slot_header=SxExpr(_slot_header_html(ctx)),
)
@@ -301,9 +301,9 @@ async def _slot_oob(ctx: dict, **kw: Any) -> str:
slug = (ctx.get("post") or {}).get("slug", "")
return await render_to_sx_with_env("events-slot-layout-oob", {},
admin_oob=SxExpr(await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")),
- cal_admin_oob=SxExpr(await _calendar_admin_header_sx(ctx, oob=True)),
+ cal_admin_oob=SxExpr(_calendar_admin_header_sx(ctx, oob=True)),
slot_oob_wrap=SxExpr(await oob_header_sx("calendar-admin-header-child",
- "slot-header-child", await _slot_header_html(ctx))),
+ "slot-header-child", _slot_header_html(ctx))),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"post-admin-row", "post-admin-header-child",
"calendar-row", "calendar-header-child",
@@ -322,9 +322,9 @@ async def _day_admin_full(ctx: dict, **kw: Any) -> str:
return await render_to_sx_with_env("events-day-admin-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
admin_header=SxExpr(await post_admin_header_sx(ctx, slug, selected="calendars")),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- day_header=SxExpr(await _day_header_sx(ctx)),
- day_admin_header=SxExpr(await _day_admin_header_sx(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ day_header=SxExpr(_day_header_sx(ctx)),
+ day_admin_header=SxExpr(_day_admin_header_sx(ctx)),
)
@@ -335,9 +335,9 @@ async def _day_admin_oob(ctx: dict, **kw: Any) -> str:
slug = (ctx.get("post") or {}).get("slug", "")
return await render_to_sx_with_env("events-day-admin-layout-oob", {},
admin_oob=SxExpr(await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")),
- cal_oob=SxExpr(await _calendar_header_sx(ctx, oob=True)),
+ cal_oob=SxExpr(_calendar_header_sx(ctx, oob=True)),
day_admin_oob_wrap=SxExpr(await oob_header_sx("day-header-child",
- "day-admin-header-child", await _day_admin_header_sx(ctx))),
+ "day-admin-header-child", _day_admin_header_sx(ctx))),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"post-admin-row", "post-admin-header-child",
"calendar-row", "calendar-header-child",
@@ -353,9 +353,9 @@ async def _entry_full(ctx: dict, **kw: Any) -> str:
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-entry-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- day_header=SxExpr(await _day_header_sx(ctx)),
- entry_header=SxExpr(await _entry_header_html(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ day_header=SxExpr(_day_header_sx(ctx)),
+ entry_header=SxExpr(_entry_header_html(ctx)),
)
@@ -363,9 +363,9 @@ async def _entry_oob(ctx: dict, **kw: Any) -> str:
from shared.sx.helpers import render_to_sx_with_env, oob_header_sx
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-entry-layout-oob", {},
- day_oob=SxExpr(await _day_header_sx(ctx, oob=True)),
+ day_oob=SxExpr(_day_header_sx(ctx, oob=True)),
entry_oob_wrap=SxExpr(await oob_header_sx("day-header-child",
- "entry-header-child", await _entry_header_html(ctx))),
+ "entry-header-child", _entry_header_html(ctx))),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"calendar-row", "calendar-header-child",
"day-row", "day-header-child",
@@ -383,10 +383,10 @@ async def _entry_admin_full(ctx: dict, **kw: Any) -> str:
return await render_to_sx_with_env("events-entry-admin-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
admin_header=SxExpr(await post_admin_header_sx(ctx, slug, selected="calendars")),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- day_header=SxExpr(await _day_header_sx(ctx)),
- entry_header=SxExpr(await _entry_header_html(ctx)),
- entry_admin_header=SxExpr(await _entry_admin_header_html(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ day_header=SxExpr(_day_header_sx(ctx)),
+ entry_header=SxExpr(_entry_header_html(ctx)),
+ entry_admin_header=SxExpr(_entry_admin_header_html(ctx)),
)
@@ -397,9 +397,9 @@ async def _entry_admin_oob(ctx: dict, **kw: Any) -> str:
slug = (ctx.get("post") or {}).get("slug", "")
return await render_to_sx_with_env("events-entry-admin-layout-oob", {},
admin_oob=SxExpr(await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")),
- entry_oob=SxExpr(await _entry_header_html(ctx, oob=True)),
+ entry_oob=SxExpr(_entry_header_html(ctx, oob=True)),
entry_admin_oob_wrap=SxExpr(await oob_header_sx("entry-header-child",
- "entry-admin-header-child", await _entry_admin_header_html(ctx))),
+ "entry-admin-header-child", _entry_admin_header_html(ctx))),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"post-admin-row", "post-admin-header-child",
"calendar-row", "calendar-header-child",
@@ -416,11 +416,11 @@ async def _ticket_types_full(ctx: dict, **kw: Any) -> str:
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-ticket-types-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- day_header=SxExpr(await _day_header_sx(ctx)),
- entry_header=SxExpr(await _entry_header_html(ctx)),
- entry_admin_header=SxExpr(await _entry_admin_header_html(ctx)),
- ticket_types_header=SxExpr(await _ticket_types_header_html(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ day_header=SxExpr(_day_header_sx(ctx)),
+ entry_header=SxExpr(_entry_header_html(ctx)),
+ entry_admin_header=SxExpr(_entry_admin_header_html(ctx)),
+ ticket_types_header=SxExpr(_ticket_types_header_html(ctx)),
)
@@ -428,9 +428,9 @@ async def _ticket_types_oob(ctx: dict, **kw: Any) -> str:
from shared.sx.helpers import render_to_sx_with_env, oob_header_sx
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-ticket-types-layout-oob", {},
- entry_admin_oob=SxExpr(await _entry_admin_header_html(ctx, oob=True)),
+ entry_admin_oob=SxExpr(_entry_admin_header_html(ctx, oob=True)),
ticket_types_oob_wrap=SxExpr(await oob_header_sx("entry-admin-header-child",
- "ticket_types-header-child", await _ticket_types_header_html(ctx))),
+ "ticket_types-header-child", _ticket_types_header_html(ctx))),
)
@@ -441,12 +441,12 @@ async def _ticket_type_full(ctx: dict, **kw: Any) -> str:
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-ticket-type-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- day_header=SxExpr(await _day_header_sx(ctx)),
- entry_header=SxExpr(await _entry_header_html(ctx)),
- entry_admin_header=SxExpr(await _entry_admin_header_html(ctx)),
- ticket_types_header=SxExpr(await _ticket_types_header_html(ctx)),
- ticket_type_header=SxExpr(await _ticket_type_header_html(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ day_header=SxExpr(_day_header_sx(ctx)),
+ entry_header=SxExpr(_entry_header_html(ctx)),
+ entry_admin_header=SxExpr(_entry_admin_header_html(ctx)),
+ ticket_types_header=SxExpr(_ticket_types_header_html(ctx)),
+ ticket_type_header=SxExpr(_ticket_type_header_html(ctx)),
)
@@ -454,9 +454,9 @@ async def _ticket_type_oob(ctx: dict, **kw: Any) -> str:
from shared.sx.helpers import render_to_sx_with_env, oob_header_sx
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-ticket-type-layout-oob", {},
- ticket_types_oob=SxExpr(await _ticket_types_header_html(ctx, oob=True)),
+ ticket_types_oob=SxExpr(_ticket_types_header_html(ctx, oob=True)),
ticket_type_oob_wrap=SxExpr(await oob_header_sx("ticket_types-header-child",
- "ticket_type-header-child", await _ticket_type_header_html(ctx))),
+ "ticket_type-header-child", _ticket_type_header_html(ctx))),
)
@@ -467,7 +467,7 @@ async def _markets_full(ctx: dict, **kw: Any) -> str:
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-markets-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
- markets_header=SxExpr(await _markets_header_sx(ctx)),
+ markets_header=SxExpr(_markets_header_sx(ctx)),
)
@@ -477,7 +477,7 @@ async def _markets_oob(ctx: dict, **kw: Any) -> str:
return await render_to_sx_with_env("events-markets-layout-oob", {},
post_oob=SxExpr(await _post_header_sx(ctx, oob=True)),
markets_oob_wrap=SxExpr(await oob_header_sx("post-header-child",
- "markets-header-child", await _markets_header_sx(ctx))),
+ "markets-header-child", _markets_header_sx(ctx))),
)
@@ -510,14 +510,14 @@ async def _h_calendar_admin_content(calendar_slug=None, **kw):
await _ensure_calendar(calendar_slug)
from shared.sx.page import get_template_context
ctx = await get_template_context()
- return await _calendar_admin_main_panel_html(ctx)
+ return _calendar_admin_main_panel_html(ctx)
async def _h_day_admin_content(calendar_slug=None, year=None, month=None, day=None, **kw):
await _ensure_calendar(calendar_slug)
if year is not None:
await _ensure_day_data(int(year), int(month), int(day))
- return await _day_admin_main_panel_html({})
+ return _day_admin_main_panel_html({})
async def _h_slots_content(calendar_slug=None, **kw):
@@ -527,7 +527,7 @@ async def _h_slots_content(calendar_slug=None, **kw):
from bp.slots.services.slots import list_slots as svc_list_slots
slots = await svc_list_slots(g.s, calendar.id) if calendar else []
_add_to_defpage_ctx(slots=slots)
- return await render_slots_table(slots, calendar)
+ return render_slots_table(slots, calendar)
async def _h_slot_content(calendar_slug=None, slot_id=None, **kw):
@@ -540,7 +540,7 @@ async def _h_slot_content(calendar_slug=None, slot_id=None, **kw):
g.slot = slot
_add_to_defpage_ctx(slot=slot)
calendar = getattr(g, "calendar", None)
- return await render_slot_main_panel(slot, calendar)
+ return render_slot_main_panel(slot, calendar)
async def _h_entry_content(calendar_slug=None, entry_id=None, **kw):
@@ -548,7 +548,7 @@ async def _h_entry_content(calendar_slug=None, entry_id=None, **kw):
await _ensure_entry_context(entry_id)
from shared.sx.page import get_template_context
ctx = await get_template_context()
- return await _entry_main_panel_html(ctx)
+ return _entry_main_panel_html(ctx)
async def _h_entry_menu(calendar_slug=None, entry_id=None, **kw):
@@ -556,7 +556,7 @@ async def _h_entry_menu(calendar_slug=None, entry_id=None, **kw):
await _ensure_entry_context(entry_id)
from shared.sx.page import get_template_context
ctx = await get_template_context()
- return await _entry_nav_html(ctx)
+ return _entry_nav_html(ctx)
async def _h_entry_admin_content(calendar_slug=None, entry_id=None, **kw):
@@ -564,12 +564,11 @@ async def _h_entry_admin_content(calendar_slug=None, entry_id=None, **kw):
await _ensure_entry_context(entry_id)
from shared.sx.page import get_template_context
ctx = await get_template_context()
- return await _entry_admin_main_panel_html(ctx)
+ return _entry_admin_main_panel_html(ctx)
-async def _h_admin_menu():
- from shared.sx.helpers import render_to_sx
- return await render_to_sx("events-admin-placeholder-nav")
+def _h_admin_menu():
+ return sx_call("events-admin-placeholder-nav")
async def _h_ticket_types_content(calendar_slug=None, entry_id=None,
@@ -582,7 +581,7 @@ async def _h_ticket_types_content(calendar_slug=None, entry_id=None,
from bp.ticket_types.services.tickets import list_ticket_types as svc_list_ticket_types
ticket_types = await svc_list_ticket_types(g.s, entry.id) if entry else []
_add_to_defpage_ctx(ticket_types=ticket_types)
- return await render_ticket_types_table(ticket_types, entry, calendar, day, month, year)
+ return render_ticket_types_table(ticket_types, entry, calendar, day, month, year)
async def _h_ticket_type_content(calendar_slug=None, entry_id=None,
@@ -598,7 +597,7 @@ async def _h_ticket_type_content(calendar_slug=None, entry_id=None,
_add_to_defpage_ctx(ticket_type=ticket_type)
entry = getattr(g, "entry", None)
calendar = getattr(g, "calendar", None)
- return await render_ticket_type_main_panel(ticket_type, entry, calendar, day, month, year)
+ return render_ticket_type_main_panel(ticket_type, entry, calendar, day, month, year)
async def _h_tickets_content(**kw):
@@ -613,7 +612,7 @@ async def _h_tickets_content(**kw):
)
from shared.sx.page import get_template_context
ctx = await get_template_context()
- return await _tickets_main_panel_html(ctx, tickets)
+ return _tickets_main_panel_html(ctx, tickets)
async def _h_ticket_detail_content(code=None, **kw):
@@ -635,7 +634,7 @@ async def _h_ticket_detail_content(code=None, **kw):
abort(404)
from shared.sx.page import get_template_context
ctx = await get_template_context()
- return await _ticket_detail_panel_html(ctx, ticket)
+ return _ticket_detail_panel_html(ctx, ticket)
async def _h_ticket_admin_content(**kw):
@@ -674,10 +673,10 @@ async def _h_ticket_admin_content(**kw):
from shared.sx.page import get_template_context
ctx = await get_template_context()
- return await _ticket_admin_main_panel_html(ctx, tickets, stats)
+ return _ticket_admin_main_panel_html(ctx, tickets, stats)
async def _h_markets_content(**kw):
from shared.sx.page import get_template_context
ctx = await get_template_context()
- return await _markets_main_panel_html(ctx)
+ return _markets_main_panel_html(ctx)
diff --git a/events/sxc/pages/layouts.py b/events/sxc/pages/layouts.py
index 82717ab..5ebe088 100644
--- a/events/sxc/pages/layouts.py
+++ b/events/sxc/pages/layouts.py
@@ -42,8 +42,8 @@ async def _cal_admin_full(ctx: dict, **kw: Any) -> str:
return await render_to_sx_with_env("events-cal-admin-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
admin_header=SxExpr(await post_admin_header_sx(ctx, slug, selected="calendars")),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- calendar_admin_header=SxExpr(await _calendar_admin_header_sx(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ calendar_admin_header=SxExpr(_calendar_admin_header_sx(ctx)),
)
@@ -54,9 +54,9 @@ async def _cal_admin_oob(ctx: dict, **kw: Any) -> str:
slug = (ctx.get("post") or {}).get("slug", "")
return await render_to_sx_with_env("events-cal-admin-layout-oob", {},
admin_oob=SxExpr(await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")),
- cal_oob=SxExpr(await _calendar_header_sx(ctx, oob=True)),
+ cal_oob=SxExpr(_calendar_header_sx(ctx, oob=True)),
cal_admin_oob_wrap=SxExpr(await oob_header_sx("calendar-header-child",
- "calendar-admin-header-child", await _calendar_admin_header_sx(ctx))),
+ "calendar-admin-header-child", _calendar_admin_header_sx(ctx))),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"post-admin-row", "post-admin-header-child",
"calendar-row", "calendar-header-child",
@@ -77,7 +77,7 @@ async def _slots_oob(ctx: dict, **kw: Any) -> str:
slug = (ctx.get("post") or {}).get("slug", "")
return await render_to_sx_with_env("events-slots-layout-oob", {},
admin_oob=SxExpr(await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")),
- cal_admin_oob=SxExpr(await _calendar_admin_header_sx(ctx, oob=True)),
+ cal_admin_oob=SxExpr(_calendar_admin_header_sx(ctx, oob=True)),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"post-admin-row", "post-admin-header-child",
"calendar-row", "calendar-header-child",
@@ -95,9 +95,9 @@ async def _slot_full(ctx: dict, **kw: Any) -> str:
return await render_to_sx_with_env("events-slot-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
admin_header=SxExpr(await post_admin_header_sx(ctx, slug, selected="calendars")),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- calendar_admin_header=SxExpr(await _calendar_admin_header_sx(ctx)),
- slot_header=SxExpr(await _slot_header_html(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ calendar_admin_header=SxExpr(_calendar_admin_header_sx(ctx)),
+ slot_header=SxExpr(_slot_header_html(ctx)),
)
@@ -108,9 +108,9 @@ async def _slot_oob(ctx: dict, **kw: Any) -> str:
slug = (ctx.get("post") or {}).get("slug", "")
return await render_to_sx_with_env("events-slot-layout-oob", {},
admin_oob=SxExpr(await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")),
- cal_admin_oob=SxExpr(await _calendar_admin_header_sx(ctx, oob=True)),
+ cal_admin_oob=SxExpr(_calendar_admin_header_sx(ctx, oob=True)),
slot_oob_wrap=SxExpr(await oob_header_sx("calendar-admin-header-child",
- "slot-header-child", await _slot_header_html(ctx))),
+ "slot-header-child", _slot_header_html(ctx))),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"post-admin-row", "post-admin-header-child",
"calendar-row", "calendar-header-child",
@@ -129,9 +129,9 @@ async def _day_admin_full(ctx: dict, **kw: Any) -> str:
return await render_to_sx_with_env("events-day-admin-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
admin_header=SxExpr(await post_admin_header_sx(ctx, slug, selected="calendars")),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- day_header=SxExpr(await _day_header_sx(ctx)),
- day_admin_header=SxExpr(await _day_admin_header_sx(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ day_header=SxExpr(_day_header_sx(ctx)),
+ day_admin_header=SxExpr(_day_admin_header_sx(ctx)),
)
@@ -142,9 +142,9 @@ async def _day_admin_oob(ctx: dict, **kw: Any) -> str:
slug = (ctx.get("post") or {}).get("slug", "")
return await render_to_sx_with_env("events-day-admin-layout-oob", {},
admin_oob=SxExpr(await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")),
- cal_oob=SxExpr(await _calendar_header_sx(ctx, oob=True)),
+ cal_oob=SxExpr(_calendar_header_sx(ctx, oob=True)),
day_admin_oob_wrap=SxExpr(await oob_header_sx("day-header-child",
- "day-admin-header-child", await _day_admin_header_sx(ctx))),
+ "day-admin-header-child", _day_admin_header_sx(ctx))),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"post-admin-row", "post-admin-header-child",
"calendar-row", "calendar-header-child",
@@ -160,9 +160,9 @@ async def _entry_full(ctx: dict, **kw: Any) -> str:
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-entry-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- day_header=SxExpr(await _day_header_sx(ctx)),
- entry_header=SxExpr(await _entry_header_html(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ day_header=SxExpr(_day_header_sx(ctx)),
+ entry_header=SxExpr(_entry_header_html(ctx)),
)
@@ -170,9 +170,9 @@ async def _entry_oob(ctx: dict, **kw: Any) -> str:
from shared.sx.helpers import render_to_sx_with_env, oob_header_sx
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-entry-layout-oob", {},
- day_oob=SxExpr(await _day_header_sx(ctx, oob=True)),
+ day_oob=SxExpr(_day_header_sx(ctx, oob=True)),
entry_oob_wrap=SxExpr(await oob_header_sx("day-header-child",
- "entry-header-child", await _entry_header_html(ctx))),
+ "entry-header-child", _entry_header_html(ctx))),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"calendar-row", "calendar-header-child",
"day-row", "day-header-child",
@@ -190,10 +190,10 @@ async def _entry_admin_full(ctx: dict, **kw: Any) -> str:
return await render_to_sx_with_env("events-entry-admin-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
admin_header=SxExpr(await post_admin_header_sx(ctx, slug, selected="calendars")),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- day_header=SxExpr(await _day_header_sx(ctx)),
- entry_header=SxExpr(await _entry_header_html(ctx)),
- entry_admin_header=SxExpr(await _entry_admin_header_html(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ day_header=SxExpr(_day_header_sx(ctx)),
+ entry_header=SxExpr(_entry_header_html(ctx)),
+ entry_admin_header=SxExpr(_entry_admin_header_html(ctx)),
)
@@ -204,9 +204,9 @@ async def _entry_admin_oob(ctx: dict, **kw: Any) -> str:
slug = (ctx.get("post") or {}).get("slug", "")
return await render_to_sx_with_env("events-entry-admin-layout-oob", {},
admin_oob=SxExpr(await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")),
- entry_oob=SxExpr(await _entry_header_html(ctx, oob=True)),
+ entry_oob=SxExpr(_entry_header_html(ctx, oob=True)),
entry_admin_oob_wrap=SxExpr(await oob_header_sx("entry-header-child",
- "entry-admin-header-child", await _entry_admin_header_html(ctx))),
+ "entry-admin-header-child", _entry_admin_header_html(ctx))),
clear_oob=SxExpr(_clear_deeper_oob("post-row", "post-header-child",
"post-admin-row", "post-admin-header-child",
"calendar-row", "calendar-header-child",
@@ -223,11 +223,11 @@ async def _ticket_types_full(ctx: dict, **kw: Any) -> str:
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-ticket-types-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- day_header=SxExpr(await _day_header_sx(ctx)),
- entry_header=SxExpr(await _entry_header_html(ctx)),
- entry_admin_header=SxExpr(await _entry_admin_header_html(ctx)),
- ticket_types_header=SxExpr(await _ticket_types_header_html(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ day_header=SxExpr(_day_header_sx(ctx)),
+ entry_header=SxExpr(_entry_header_html(ctx)),
+ entry_admin_header=SxExpr(_entry_admin_header_html(ctx)),
+ ticket_types_header=SxExpr(_ticket_types_header_html(ctx)),
)
@@ -235,9 +235,9 @@ async def _ticket_types_oob(ctx: dict, **kw: Any) -> str:
from shared.sx.helpers import render_to_sx_with_env, oob_header_sx
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-ticket-types-layout-oob", {},
- entry_admin_oob=SxExpr(await _entry_admin_header_html(ctx, oob=True)),
+ entry_admin_oob=SxExpr(_entry_admin_header_html(ctx, oob=True)),
ticket_types_oob_wrap=SxExpr(await oob_header_sx("entry-admin-header-child",
- "ticket_types-header-child", await _ticket_types_header_html(ctx))),
+ "ticket_types-header-child", _ticket_types_header_html(ctx))),
)
@@ -248,12 +248,12 @@ async def _ticket_type_full(ctx: dict, **kw: Any) -> str:
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-ticket-type-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
- calendar_header=SxExpr(await _calendar_header_sx(ctx)),
- day_header=SxExpr(await _day_header_sx(ctx)),
- entry_header=SxExpr(await _entry_header_html(ctx)),
- entry_admin_header=SxExpr(await _entry_admin_header_html(ctx)),
- ticket_types_header=SxExpr(await _ticket_types_header_html(ctx)),
- ticket_type_header=SxExpr(await _ticket_type_header_html(ctx)),
+ calendar_header=SxExpr(_calendar_header_sx(ctx)),
+ day_header=SxExpr(_day_header_sx(ctx)),
+ entry_header=SxExpr(_entry_header_html(ctx)),
+ entry_admin_header=SxExpr(_entry_admin_header_html(ctx)),
+ ticket_types_header=SxExpr(_ticket_types_header_html(ctx)),
+ ticket_type_header=SxExpr(_ticket_type_header_html(ctx)),
)
@@ -261,9 +261,9 @@ async def _ticket_type_oob(ctx: dict, **kw: Any) -> str:
from shared.sx.helpers import render_to_sx_with_env, oob_header_sx
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-ticket-type-layout-oob", {},
- ticket_types_oob=SxExpr(await _ticket_types_header_html(ctx, oob=True)),
+ ticket_types_oob=SxExpr(_ticket_types_header_html(ctx, oob=True)),
ticket_type_oob_wrap=SxExpr(await oob_header_sx("ticket_types-header-child",
- "ticket_type-header-child", await _ticket_type_header_html(ctx))),
+ "ticket_type-header-child", _ticket_type_header_html(ctx))),
)
@@ -274,7 +274,7 @@ async def _markets_full(ctx: dict, **kw: Any) -> str:
from shared.sx.parser import SxExpr
return await render_to_sx_with_env("events-markets-layout-full", {},
post_header=SxExpr(await _post_header_sx(ctx)),
- markets_header=SxExpr(await _markets_header_sx(ctx)),
+ markets_header=SxExpr(_markets_header_sx(ctx)),
)
@@ -284,5 +284,5 @@ async def _markets_oob(ctx: dict, **kw: Any) -> str:
return await render_to_sx_with_env("events-markets-layout-oob", {},
post_oob=SxExpr(await _post_header_sx(ctx, oob=True)),
markets_oob_wrap=SxExpr(await oob_header_sx("post-header-child",
- "markets-header-child", await _markets_header_sx(ctx))),
+ "markets-header-child", _markets_header_sx(ctx))),
)
diff --git a/events/sxc/pages/renders.py b/events/sxc/pages/renders.py
index 1684fc6..f478172 100644
--- a/events/sxc/pages/renders.py
+++ b/events/sxc/pages/renders.py
@@ -40,7 +40,7 @@ async def render_all_events_page(ctx: dict, entries, has_more, pending_tickets,
ticket_url = url_for("all_events.adjust_ticket")
next_url = prefix + url_for("all_events.entries_fragment", page=page + 1) + (f"?view={view}" if view != "list" else "")
- content = await _events_main_panel_html(
+ content = _events_main_panel_html(
ctx, entries, has_more, pending_tickets, page_info,
page, view, ticket_url, next_url, events_url,
)
@@ -59,15 +59,15 @@ async def render_all_events_oob(ctx: dict, entries, has_more, pending_tickets,
ticket_url = url_for("all_events.adjust_ticket")
next_url = prefix + url_for("all_events.entries_fragment", page=page + 1) + (f"?view={view}" if view != "list" else "")
- content = await _events_main_panel_html(
+ content = _events_main_panel_html(
ctx, entries, has_more, pending_tickets, page_info,
page, view, ticket_url, next_url, events_url,
)
return await oob_page_sx(content=content)
-async def render_all_events_cards(entries, has_more, pending_tickets,
- page_info, page, view) -> str:
+def render_all_events_cards(entries, has_more, pending_tickets,
+ page_info, page, view) -> str:
"""Pagination fragment: all events cards only."""
from quart import url_for
from shared.utils import route_prefix
@@ -77,7 +77,7 @@ async def render_all_events_cards(entries, has_more, pending_tickets,
ticket_url = url_for("all_events.adjust_ticket")
next_url = prefix + url_for("all_events.entries_fragment", page=page + 1) + (f"?view={view}" if view != "list" else "")
- return await _entry_cards_html(
+ return _entry_cards_html(
entries, page_info, pending_tickets, ticket_url, events_url,
view, page, has_more, next_url,
)
@@ -99,7 +99,7 @@ async def render_page_summary_page(ctx: dict, entries, has_more, pending_tickets
ticket_url = url_for("page_summary.adjust_ticket")
next_url = prefix + url_for("page_summary.entries_fragment", page=page + 1) + (f"?view={view}" if view != "list" else "")
- content = await _events_main_panel_html(
+ content = _events_main_panel_html(
ctx, entries, has_more, pending_tickets, page_info,
page, view, ticket_url, next_url, events_url,
is_page_scoped=True, post=post,
@@ -122,7 +122,7 @@ async def render_page_summary_oob(ctx: dict, entries, has_more, pending_tickets,
ticket_url = url_for("page_summary.adjust_ticket")
next_url = prefix + url_for("page_summary.entries_fragment", page=page + 1) + (f"?view={view}" if view != "list" else "")
- content = await _events_main_panel_html(
+ content = _events_main_panel_html(
ctx, entries, has_more, pending_tickets, page_info,
page, view, ticket_url, next_url, events_url,
is_page_scoped=True, post=post,
@@ -133,8 +133,8 @@ async def render_page_summary_oob(ctx: dict, entries, has_more, pending_tickets,
return await oob_page_sx(oobs=oobs, content=content)
-async def render_page_summary_cards(entries, has_more, pending_tickets,
- page_info, page, view, post) -> str:
+def render_page_summary_cards(entries, has_more, pending_tickets,
+ page_info, page, view, post) -> str:
"""Pagination fragment: page-scoped events cards only."""
from quart import url_for
from shared.utils import route_prefix
@@ -144,7 +144,7 @@ async def render_page_summary_cards(entries, has_more, pending_tickets,
ticket_url = url_for("page_summary.adjust_ticket")
next_url = prefix + url_for("page_summary.entries_fragment", page=page + 1) + (f"?view={view}" if view != "list" else "")
- return await _entry_cards_html(
+ return _entry_cards_html(
entries, page_info, pending_tickets, ticket_url, events_url,
view, page, has_more, next_url,
is_page_scoped=True, post=post,
@@ -157,7 +157,7 @@ async def render_page_summary_cards(entries, has_more, pending_tickets,
async def render_calendars_page(ctx: dict) -> str:
"""Full page: calendars listing."""
- content = await _calendars_main_panel_sx(ctx)
+ content = _calendars_main_panel_sx(ctx)
ctx = await _ensure_container_nav(ctx)
slug = (ctx.get("post") or {}).get("slug", "")
root_hdr = await render_to_sx_with_env("layout-root-full", {})
@@ -168,7 +168,7 @@ async def render_calendars_page(ctx: dict) -> str:
async def render_calendars_oob(ctx: dict) -> str:
"""OOB response: calendars listing."""
- content = await _calendars_main_panel_sx(ctx)
+ content = _calendars_main_panel_sx(ctx)
ctx = await _ensure_container_nav(ctx)
slug = (ctx.get("post") or {}).get("slug", "")
oobs = await post_admin_header_sx(ctx, slug, oob=True, selected="calendars")
@@ -183,19 +183,19 @@ async def render_calendars_oob(ctx: dict) -> str:
async def render_calendar_page(ctx: dict) -> str:
"""Full page: calendar month view."""
- content = await _calendar_main_panel_html(ctx)
+ content = _calendar_main_panel_html(ctx)
hdr = await render_to_sx_with_env("layout-root-full", {})
- child = await _post_header_sx(ctx) + await _calendar_header_sx(ctx)
+ child = await _post_header_sx(ctx) + _calendar_header_sx(ctx)
hdr += await header_child_sx(child)
return await full_page_sx(ctx, header_rows=hdr, content=content)
async def render_calendar_oob(ctx: dict) -> str:
"""OOB response: calendar month view."""
- content = await _calendar_main_panel_html(ctx)
+ content = _calendar_main_panel_html(ctx)
oobs = await _post_header_sx(ctx, oob=True)
oobs += await oob_header_sx("post-header-child", "calendar-header-child",
- await _calendar_header_sx(ctx))
+ _calendar_header_sx(ctx))
oobs += _clear_deeper_oob("post-row", "post-header-child",
"calendar-row", "calendar-header-child")
return await oob_page_sx(oobs=oobs, content=content)
@@ -207,20 +207,20 @@ async def render_calendar_oob(ctx: dict) -> str:
async def render_day_page(ctx: dict) -> str:
"""Full page: day detail."""
- content = await _day_main_panel_html(ctx)
+ content = _day_main_panel_html(ctx)
hdr = await render_to_sx_with_env("layout-root-full", {})
child = (await _post_header_sx(ctx)
- + await _calendar_header_sx(ctx) + await _day_header_sx(ctx))
+ + _calendar_header_sx(ctx) + _day_header_sx(ctx))
hdr += await header_child_sx(child)
return await full_page_sx(ctx, header_rows=hdr, content=content)
async def render_day_oob(ctx: dict) -> str:
"""OOB response: day detail."""
- content = await _day_main_panel_html(ctx)
- oobs = await _calendar_header_sx(ctx, oob=True)
+ content = _day_main_panel_html(ctx)
+ oobs = _calendar_header_sx(ctx, oob=True)
oobs += await oob_header_sx("calendar-header-child", "day-header-child",
- await _day_header_sx(ctx))
+ _day_header_sx(ctx))
oobs += _clear_deeper_oob("post-row", "post-header-child",
"calendar-row", "calendar-header-child",
"day-row", "day-header-child")
@@ -231,36 +231,36 @@ async def render_day_oob(ctx: dict) -> str:
# Day main panel -- public API
# ---------------------------------------------------------------------------
-async def render_day_main_panel(ctx: dict) -> str:
+def render_day_main_panel(ctx: dict) -> str:
"""Public wrapper for day main panel rendering."""
- return await _day_main_panel_html(ctx)
+ return _day_main_panel_html(ctx)
# ---------------------------------------------------------------------------
# Calendar description display + edit form
# ---------------------------------------------------------------------------
-async def render_calendar_description(calendar, *, oob: bool = False) -> str:
+def render_calendar_description(calendar, *, oob: bool = False) -> str:
"""Render calendar description display with edit button, optionally with OOB title."""
from quart import url_for
- from shared.sx.helpers import render_to_sx
+ from shared.sx.helpers import sx_call
cal_slug = getattr(calendar, "slug", "")
edit_url = url_for("calendar.admin.calendar_description_edit", calendar_slug=cal_slug)
- html = await _calendar_description_display_html(calendar, edit_url)
+ html = _calendar_description_display_html(calendar, edit_url)
if oob:
desc = getattr(calendar, "description", "") or ""
- html += await render_to_sx("events-calendar-description-title-oob",
+ html += sx_call("events-calendar-description-title-oob",
description=desc)
return html
-async def render_calendar_description_edit(calendar) -> str:
+def render_calendar_description_edit(calendar) -> str:
"""Render calendar description edit form."""
from quart import url_for
from shared.browser.app.csrf import generate_csrf_token
- from shared.sx.helpers import render_to_sx
+ from shared.sx.helpers import sx_call
csrf = generate_csrf_token()
cal_slug = getattr(calendar, "slug", "")
desc = getattr(calendar, "description", "") or ""
@@ -268,7 +268,7 @@ async def render_calendar_description_edit(calendar) -> str:
save_url = url_for("calendar.admin.calendar_description_save", calendar_slug=cal_slug)
cancel_url = url_for("calendar.admin.calendar_description_view", calendar_slug=cal_slug)
- return await render_to_sx("events-calendar-description-edit-form",
+ return sx_call("events-calendar-description-edit-form",
save_url=save_url, cancel_url=cancel_url,
csrf=csrf, description=desc)
@@ -277,11 +277,11 @@ async def render_calendar_description_edit(calendar) -> str:
# Calendars / Markets list panels (for POST create / DELETE)
# ---------------------------------------------------------------------------
-async def render_calendars_list_panel(ctx: dict) -> str:
+def render_calendars_list_panel(ctx: dict) -> str:
"""Render the calendars main panel HTML for POST/DELETE response."""
- return await _calendars_main_panel_sx(ctx)
+ return _calendars_main_panel_sx(ctx)
-async def render_markets_list_panel(ctx: dict) -> str:
+def render_markets_list_panel(ctx: dict) -> str:
"""Render the markets main panel HTML for POST/DELETE response."""
- return await _markets_main_panel_html(ctx)
+ return _markets_main_panel_html(ctx)
diff --git a/events/sxc/pages/slots.py b/events/sxc/pages/slots.py
index b3ad565..6661a90 100644
--- a/events/sxc/pages/slots.py
+++ b/events/sxc/pages/slots.py
@@ -2,7 +2,7 @@
from __future__ import annotations
-from shared.sx.helpers import render_to_sx
+from shared.sx.helpers import sx_call
from shared.sx.parser import SxExpr
@@ -111,7 +111,7 @@ _SLOT_PICKER_JS = """\
# Slot options (shared by entry edit + add forms)
# ---------------------------------------------------------------------------
-async def _slot_options_html(day_slots, selected_slot_id=None) -> str:
+def _slot_options_html(day_slots, selected_slot_id=None) -> str:
"""Build slot