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