Rebrand sexp → sx across web platform (173 files)
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 11m37s

Rename all sexp directories, files, identifiers, and references to sx.
artdag/ excluded (separate media processing DSL).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-01 11:06:57 +00:00
parent 17cebe07e7
commit e8bc228c7f
174 changed files with 3126 additions and 2952 deletions

View File

@@ -1,6 +1,6 @@
from __future__ import annotations
import path_setup # noqa: F401 # adds shared/ to sys.path
import sexp.sexp_components as sexp_components # noqa: F401 # ensure Hypercorn --reload watches this file
import sx.sx_components as sx_components # noqa: F401 # ensure Hypercorn --reload watches this file
from decimal import Decimal
from pathlib import Path

View File

@@ -150,8 +150,8 @@ def register(url_prefix: str) -> Blueprint:
try:
page_config = await resolve_page_config(g.s, cart, calendar_entries, tickets)
except ValueError as e:
from shared.sexp.page import get_template_context
from sexp.sexp_components import render_checkout_error_page
from shared.sx.page import get_template_context
from sx.sx_components import render_checkout_error_page
tctx = await get_template_context()
html = await render_checkout_error_page(tctx, error=str(e))
return await make_response(html, 400)
@@ -207,8 +207,8 @@ def register(url_prefix: str) -> Blueprint:
hosted_url = result.get("sumup_hosted_url")
if not hosted_url:
from shared.sexp.page import get_template_context
from sexp.sexp_components import render_checkout_error_page
from shared.sx.page import get_template_context
from sx.sx_components import render_checkout_error_page
tctx = await get_template_context()
html = await render_checkout_error_page(tctx, error="No hosted checkout URL returned from SumUp.")
return await make_response(html, 500)

View File

@@ -5,7 +5,7 @@ from __future__ import annotations
from quart import Blueprint, render_template, make_response
from shared.browser.app.utils.htmx import is_htmx_request
from shared.sexp.helpers import sexp_response
from shared.sx.helpers import sx_response
from .services import get_cart_grouped_by_page
@@ -15,8 +15,8 @@ def register(url_prefix: str) -> Blueprint:
@bp.get("/")
async def overview():
from quart import g
from shared.sexp.page import get_template_context
from sexp.sexp_components import render_overview_page, render_overview_oob
from shared.sx.page import get_template_context
from sx.sx_components import render_overview_page, render_overview_oob
page_groups = await get_cart_grouped_by_page(g.s)
ctx = await get_template_context()
@@ -25,7 +25,7 @@ def register(url_prefix: str) -> Blueprint:
html = await render_overview_page(ctx, page_groups)
return await make_response(html)
else:
sexp_src = await render_overview_oob(ctx, page_groups)
return sexp_response(sexp_src)
sx_src = await render_overview_oob(ctx, page_groups)
return sx_response(sx_src)
return bp

View File

@@ -5,7 +5,7 @@ from __future__ import annotations
from quart import Blueprint, g, redirect, make_response, url_for
from shared.browser.app.utils.htmx import is_htmx_request
from shared.sexp.helpers import sexp_response
from shared.sx.helpers import sx_response
from shared.infrastructure.actions import call_action
from .services import (
total,
@@ -41,8 +41,8 @@ def register(url_prefix: str) -> Blueprint:
ticket_total=ticket_total,
)
from shared.sexp.page import get_template_context
from sexp.sexp_components import render_page_cart_page, render_page_cart_oob
from shared.sx.page import get_template_context
from sx.sx_components import render_page_cart_page, render_page_cart_oob
ctx = await get_template_context()
if not is_htmx_request():
@@ -52,11 +52,11 @@ def register(url_prefix: str) -> Blueprint:
)
return await make_response(html)
else:
sexp_src = await render_page_cart_oob(
sx_src = await render_page_cart_oob(
ctx, post, cart, cal_entries, page_tickets,
ticket_groups, total, calendar_total, ticket_total,
)
return sexp_response(sexp_src)
return sx_response(sx_src)
@bp.post("/checkout/")
async def page_checkout():
@@ -111,8 +111,8 @@ def register(url_prefix: str) -> Blueprint:
hosted_url = result.get("sumup_hosted_url")
if not hosted_url:
from shared.sexp.page import get_template_context
from sexp.sexp_components import render_checkout_error_page
from shared.sx.page import get_template_context
from sx.sx_components import render_checkout_error_page
tctx = await get_template_context()
html = await render_checkout_error_page(tctx, error="No hosted checkout URL returned from SumUp.")
return await make_response(html, 500)

View File

@@ -1,6 +1,6 @@
"""Cart app fragment endpoints.
Exposes sexp fragments at ``/internal/fragments/<type>`` for consumption
Exposes sx fragments at ``/internal/fragments/<type>`` for consumption
by other coop apps via the fragment client.
Fragments:
@@ -19,13 +19,13 @@ def register():
bp = Blueprint("fragments", __name__, url_prefix="/internal/fragments")
# ---------------------------------------------------------------
# Fragment handlers — return sexp source text
# Fragment handlers — return sx source text
# ---------------------------------------------------------------
async def _cart_mini():
from shared.services.registry import services
from shared.infrastructure.urls import blog_url, cart_url
from shared.sexp.helpers import sexp_call
from shared.sx.helpers import sx_call
user_id = request.args.get("user_id", type=int)
session_id = request.args.get("session_id")
@@ -35,7 +35,7 @@ def register():
)
count = summary.count + summary.calendar_count + summary.ticket_count
oob = request.args.get("oob", "")
return sexp_call("cart-mini",
return sx_call("cart-mini",
cart_count=count,
blog_url=blog_url(""),
cart_url=cart_url(""),
@@ -43,9 +43,9 @@ def register():
async def _account_nav_item():
from shared.infrastructure.urls import cart_url
from shared.sexp.helpers import sexp_call
from shared.sx.helpers import sx_call
return sexp_call("account-nav-item",
return sx_call("account-nav-item",
href=cart_url("/orders/"),
label="orders")
@@ -67,8 +67,8 @@ def register():
async def get_fragment(fragment_type: str):
handler = _handlers.get(fragment_type)
if handler is None:
return Response("", status=200, content_type="text/sexp")
return Response("", status=200, content_type="text/sx")
src = await handler()
return Response(src, status=200, content_type="text/sexp")
return Response(src, status=200, content_type="text/sx")
return bp

View File

@@ -13,7 +13,7 @@ from shared.infrastructure.http_utils import vary as _vary, current_url_without_
from shared.infrastructure.cart_identity import current_cart_identity
from bp.cart.services import check_sumup_status
from shared.browser.app.utils.htmx import is_htmx_request
from shared.sexp.helpers import sexp_response
from shared.sx.helpers import sx_response
from .filters.qs import makeqs_factory, decode
@@ -56,8 +56,8 @@ def register() -> Blueprint:
order = result.scalar_one_or_none()
if not order:
return await make_response("Order not found", 404)
from shared.sexp.page import get_template_context
from sexp.sexp_components import render_order_page, render_order_oob
from shared.sx.page import get_template_context
from sx.sx_components import render_order_page, render_order_oob
ctx = await get_template_context()
calendar_entries = ctx.get("calendar_entries")
@@ -66,8 +66,8 @@ def register() -> Blueprint:
html = await render_order_page(ctx, order, calendar_entries, url_for)
return await make_response(html)
else:
sexp_src = await render_order_oob(ctx, order, calendar_entries, url_for)
return sexp_response(sexp_src)
sx_src = await render_order_oob(ctx, order, calendar_entries, url_for)
return sx_response(sx_src)
@bp.get("/pay/")
async def order_pay(order_id: int):
@@ -121,8 +121,8 @@ def register() -> Blueprint:
await g.s.flush()
if not hosted_url:
from shared.sexp.page import get_template_context
from sexp.sexp_components import render_checkout_error_page
from shared.sx.page import get_template_context
from sx.sx_components import render_checkout_error_page
tctx = await get_template_context()
html = await render_checkout_error_page(tctx, error="No hosted checkout URL returned from SumUp when trying to reopen payment.", order=order)
return await make_response(html, 500)

View File

@@ -13,7 +13,7 @@ from shared.infrastructure.http_utils import vary as _vary, current_url_without_
from shared.infrastructure.cart_identity import current_cart_identity
from bp.cart.services import check_sumup_status
from shared.browser.app.utils.htmx import is_htmx_request
from shared.sexp.helpers import sexp_response
from shared.sx.helpers import sx_response
from bp import register_order
from .filters.qs import makeqs_factory, decode
@@ -137,8 +137,8 @@ def register(url_prefix: str) -> Blueprint:
result = await g.s.execute(stmt)
orders = result.scalars().all()
from shared.sexp.page import get_template_context
from sexp.sexp_components import (
from shared.sx.page import get_template_context
from sx.sx_components import (
render_orders_page,
render_orders_rows,
render_orders_oob,
@@ -154,16 +154,16 @@ def register(url_prefix: str) -> Blueprint:
)
resp = await make_response(html)
elif page > 1:
sexp_src = await render_orders_rows(
sx_src = await render_orders_rows(
ctx, orders, page, total_pages, url_for, qs_fn,
)
resp = sexp_response(sexp_src)
resp = sx_response(sx_src)
else:
sexp_src = await render_orders_oob(
sx_src = await render_orders_oob(
ctx, orders, page, total_pages, search, total_count,
url_for, qs_fn,
)
resp = sexp_response(sexp_src)
resp = sx_response(sx_src)
resp.headers["Hx-Push-Url"] = _current_url_without_page()
return _vary(resp)

View File

@@ -8,7 +8,7 @@ from shared.infrastructure.actions import call_action
from shared.infrastructure.data_client import fetch_data
from shared.browser.app.authz import require_admin
from shared.browser.app.utils.htmx import is_htmx_request
from shared.sexp.helpers import sexp_response
from shared.sx.helpers import sx_response
def register():
@@ -17,8 +17,8 @@ def register():
@bp.get("/")
@require_admin
async def admin(**kwargs):
from shared.sexp.page import get_template_context
from sexp.sexp_components import render_cart_admin_page, render_cart_admin_oob
from shared.sx.page import get_template_context
from sx.sx_components import render_cart_admin_page, render_cart_admin_oob
ctx = await get_template_context()
page_post = getattr(g, "page_post", None)
@@ -26,14 +26,14 @@ def register():
html = await render_cart_admin_page(ctx, page_post)
return await make_response(html)
else:
sexp_src = await render_cart_admin_oob(ctx, page_post)
return sexp_response(sexp_src)
sx_src = await render_cart_admin_oob(ctx, page_post)
return sx_response(sx_src)
@bp.get("/payments/")
@require_admin
async def payments(**kwargs):
from shared.sexp.page import get_template_context
from sexp.sexp_components import render_cart_payments_page, render_cart_payments_oob
from shared.sx.page import get_template_context
from sx.sx_components import render_cart_payments_page, render_cart_payments_oob
ctx = await get_template_context()
page_post = getattr(g, "page_post", None)
@@ -41,8 +41,8 @@ def register():
html = await render_cart_payments_page(ctx, page_post)
return await make_response(html)
else:
sexp_src = await render_cart_payments_oob(ctx, page_post)
return sexp_response(sexp_src)
sx_src = await render_cart_payments_oob(ctx, page_post)
return sx_response(sx_src)
@bp.put("/payments/")
@require_admin
@@ -77,10 +77,10 @@ def register():
)
g.page_config = SimpleNamespace(**raw_pc) if raw_pc else None
from shared.sexp.page import get_template_context
from sexp.sexp_components import render_cart_payments_panel
from shared.sx.page import get_template_context
from sx.sx_components import render_cart_payments_panel
ctx = await get_template_context()
html = render_cart_payments_panel(ctx)
return sexp_response(html)
return sx_response(html)
return bp

View File

@@ -10,17 +10,17 @@ import os
from typing import Any
from markupsafe import escape
from shared.sexp.jinja_bridge import load_service_components
from shared.sexp.helpers import (
call_url, root_header_sexp, post_admin_header_sexp,
post_header_sexp as _shared_post_header_sexp,
search_desktop_sexp, search_mobile_sexp,
full_page_sexp, oob_page_sexp, header_child_sexp,
sexp_call, SexpExpr,
from shared.sx.jinja_bridge import load_service_components
from shared.sx.helpers import (
call_url, root_header_sx, post_admin_header_sx,
post_header_sx as _shared_post_header_sx,
search_desktop_sx, search_mobile_sx,
full_page_sx, oob_page_sx, header_child_sx,
sx_call, SxExpr,
)
from shared.infrastructure.urls import market_product_url, cart_url
# Load cart-specific .sexpr components at import time
# Load cart-specific .sx components at import time
load_service_components(os.path.dirname(os.path.dirname(__file__)))
@@ -29,7 +29,7 @@ load_service_components(os.path.dirname(os.path.dirname(__file__)))
# ---------------------------------------------------------------------------
def _ensure_post_ctx(ctx: dict, page_post: Any) -> dict:
"""Ensure ctx has a 'post' dict from page_post DTO (for shared post_header_sexp)."""
"""Ensure ctx has a 'post' dict from page_post DTO (for shared post_header_sx)."""
if ctx.get("post") or not page_post:
return ctx
ctx = {**ctx, "post": {
@@ -63,16 +63,16 @@ async def _ensure_container_nav(ctx: dict) -> dict:
return {**ctx, "container_nav": events_nav + market_nav}
async def _post_header_sexp(ctx: dict, page_post: Any, *, oob: bool = False) -> str:
async def _post_header_sx(ctx: dict, page_post: Any, *, oob: bool = False) -> str:
"""Build post-level header row from page_post DTO, using shared helper."""
ctx = _ensure_post_ctx(ctx, page_post)
ctx = await _ensure_container_nav(ctx)
return _shared_post_header_sexp(ctx, oob=oob)
return _shared_post_header_sx(ctx, oob=oob)
def _cart_header_sexp(ctx: dict, *, oob: bool = False) -> str:
def _cart_header_sx(ctx: dict, *, oob: bool = False) -> str:
"""Build the cart section header row."""
return sexp_call(
return sx_call(
"menu-row-sx",
id="cart-row", level=1, colour="sky",
link_href=call_url(ctx, "cart_url", "/"),
@@ -81,28 +81,28 @@ def _cart_header_sexp(ctx: dict, *, oob: bool = False) -> str:
)
def _page_cart_header_sexp(ctx: dict, page_post: Any, *, oob: bool = False) -> str:
def _page_cart_header_sx(ctx: dict, page_post: Any, *, oob: bool = False) -> str:
"""Build the per-page cart header row."""
slug = page_post.slug if page_post else ""
title = ((page_post.title if page_post else None) or "")[:160]
label_parts = []
if page_post and page_post.feature_image:
label_parts.append(sexp_call("cart-page-label-img", src=page_post.feature_image))
label_parts.append(sx_call("cart-page-label-img", src=page_post.feature_image))
label_parts.append(f'(span "{escape(title)}")')
label_sexp = "(<> " + " ".join(label_parts) + ")"
nav_sexp = sexp_call("cart-all-carts-link", href=call_url(ctx, "cart_url", "/"))
return sexp_call(
label_sx = "(<> " + " ".join(label_parts) + ")"
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}/"),
link_label_content=SexpExpr(label_sexp),
nav=SexpExpr(nav_sexp), oob=oob,
link_label_content=SxExpr(label_sx),
nav=SxExpr(nav_sx), oob=oob,
)
def _auth_header_sexp(ctx: dict, *, oob: bool = False) -> str:
def _auth_header_sx(ctx: dict, *, oob: bool = False) -> str:
"""Build the account section header row (for orders)."""
return sexp_call(
return sx_call(
"menu-row-sx",
id="auth-row", level=1, colour="sky",
link_href=call_url(ctx, "account_url", "/"),
@@ -111,9 +111,9 @@ def _auth_header_sexp(ctx: dict, *, oob: bool = False) -> str:
)
def _orders_header_sexp(ctx: dict, list_url: str) -> str:
def _orders_header_sx(ctx: dict, list_url: str) -> str:
"""Build the orders section header row."""
return sexp_call(
return sx_call(
"menu-row-sx",
id="orders-row", level=2, colour="sky",
link_href=list_url, link_label="Orders", icon="fa fa-gbp",
@@ -125,13 +125,13 @@ def _orders_header_sexp(ctx: dict, list_url: str) -> str:
# Cart overview
# ---------------------------------------------------------------------------
def _badge_sexp(icon: str, count: int, label: str) -> str:
def _badge_sx(icon: str, count: int, label: str) -> str:
"""Render a count badge."""
s = "s" if count != 1 else ""
return sexp_call("cart-badge", icon=icon, text=f"{count} {label}{s}")
return sx_call("cart-badge", icon=icon, text=f"{count} {label}{s}")
def _page_group_card_sexp(grp: Any, ctx: dict) -> str:
def _page_group_card_sx(grp: Any, ctx: dict) -> str:
"""Render a single page group card for cart overview."""
post = grp.get("post") if isinstance(grp, dict) else getattr(grp, "post", None)
cart_items = grp.get("cart_items", []) if isinstance(grp, dict) else getattr(grp, "cart_items", [])
@@ -149,13 +149,13 @@ def _page_group_card_sexp(grp: Any, ctx: dict) -> str:
# Count badges
badge_parts = []
if product_count > 0:
badge_parts.append(_badge_sexp("fa fa-box-open", product_count, "item"))
badge_parts.append(_badge_sx("fa fa-box-open", product_count, "item"))
if calendar_count > 0:
badge_parts.append(_badge_sexp("fa fa-calendar", calendar_count, "booking"))
badge_parts.append(_badge_sx("fa fa-calendar", calendar_count, "booking"))
if ticket_count > 0:
badge_parts.append(_badge_sexp("fa fa-ticket", ticket_count, "ticket"))
badges_sexp = "(<> " + " ".join(badge_parts) + ")" if badge_parts else '""'
badges_wrap = sexp_call("cart-badges-wrap", badges=SexpExpr(badges_sexp))
badge_parts.append(_badge_sx("fa fa-ticket", ticket_count, "ticket"))
badges_sx = "(<> " + " ".join(badge_parts) + ")" if badge_parts else '""'
badges_wrap = sx_call("cart-badges-wrap", badges=SxExpr(badges_sx))
if post:
slug = post.slug if hasattr(post, "slug") else post.get("slug", "")
@@ -164,58 +164,58 @@ def _page_group_card_sexp(grp: Any, ctx: dict) -> str:
cart_href = call_url(ctx, "cart_url", f"/{slug}/")
if feature_image:
img = sexp_call("cart-group-card-img", src=feature_image, alt=title)
img = sx_call("cart-group-card-img", src=feature_image, alt=title)
else:
img = sexp_call("cart-group-card-placeholder")
img = sx_call("cart-group-card-placeholder")
mp_sub = ""
if market_place:
mp_name = market_place.name if hasattr(market_place, "name") else market_place.get("name", "")
mp_sub = sexp_call("cart-mp-subtitle", title=title)
mp_sub = sx_call("cart-mp-subtitle", title=title)
else:
mp_name = ""
display_title = mp_name or title
return sexp_call(
return sx_call(
"cart-group-card",
href=cart_href, img=SexpExpr(img), display_title=display_title,
subtitle=SexpExpr(mp_sub) if mp_sub else None,
badges=SexpExpr(badges_wrap),
href=cart_href, img=SxExpr(img), display_title=display_title,
subtitle=SxExpr(mp_sub) if mp_sub else None,
badges=SxExpr(badges_wrap),
total=f"\u00a3{total:.2f}",
)
else:
# Orphan items
return sexp_call(
return sx_call(
"cart-orphan-card",
badges=SexpExpr(badges_wrap),
badges=SxExpr(badges_wrap),
total=f"\u00a3{total:.2f}",
)
def _empty_cart_sexp() -> str:
def _empty_cart_sx() -> str:
"""Empty cart state."""
return sexp_call("cart-empty")
return sx_call("cart-empty")
def _overview_main_panel_sexp(page_groups: list, ctx: dict) -> str:
def _overview_main_panel_sx(page_groups: list, ctx: dict) -> str:
"""Cart overview main panel."""
if not page_groups:
return _empty_cart_sexp()
return _empty_cart_sx()
cards = [_page_group_card_sexp(grp, ctx) for grp in page_groups]
cards = [_page_group_card_sx(grp, ctx) for grp in page_groups]
has_items = any(c for c in cards)
if not has_items:
return _empty_cart_sexp()
return _empty_cart_sx()
cards_sexp = "(<> " + " ".join(c for c in cards if c) + ")"
return sexp_call("cart-overview-panel", cards=SexpExpr(cards_sexp))
cards_sx = "(<> " + " ".join(c for c in cards if c) + ")"
return sx_call("cart-overview-panel", cards=SxExpr(cards_sx))
# ---------------------------------------------------------------------------
# Page cart
# ---------------------------------------------------------------------------
def _cart_item_sexp(item: Any, ctx: dict) -> str:
def _cart_item_sx(item: Any, ctx: dict) -> str:
"""Render a single product cart item."""
from shared.browser.app.csrf import generate_csrf_token
from quart import url_for
@@ -230,41 +230,41 @@ def _cart_item_sexp(item: Any, ctx: dict) -> str:
prod_url = market_product_url(slug)
if p.image:
img = sexp_call("cart-item-img", src=p.image, alt=p.title)
img = sx_call("cart-item-img", src=p.image, alt=p.title)
else:
img = sexp_call("cart-item-no-img")
img = sx_call("cart-item-no-img")
price_parts = []
if unit_price:
price_parts.append(sexp_call("cart-item-price", text=f"{symbol}{unit_price:.2f}"))
price_parts.append(sx_call("cart-item-price", text=f"{symbol}{unit_price:.2f}"))
if p.special_price and p.special_price != p.regular_price:
price_parts.append(sexp_call("cart-item-price-was", text=f"{symbol}{p.regular_price:.2f}"))
price_parts.append(sx_call("cart-item-price-was", text=f"{symbol}{p.regular_price:.2f}"))
else:
price_parts.append(sexp_call("cart-item-no-price"))
price_sexp = "(<> " + " ".join(price_parts) + ")" if len(price_parts) > 1 else price_parts[0]
price_parts.append(sx_call("cart-item-no-price"))
price_sx = "(<> " + " ".join(price_parts) + ")" if len(price_parts) > 1 else price_parts[0]
deleted_sexp = sexp_call("cart-item-deleted") if getattr(item, "is_deleted", False) else None
deleted_sx = sx_call("cart-item-deleted") if getattr(item, "is_deleted", False) else None
brand_sexp = sexp_call("cart-item-brand", brand=p.brand) if getattr(p, "brand", None) else None
brand_sx = sx_call("cart-item-brand", brand=p.brand) if getattr(p, "brand", None) else None
line_total_sexp = None
line_total_sx = None
if unit_price:
lt = unit_price * item.quantity
line_total_sexp = sexp_call("cart-item-line-total", text=f"Line total: {symbol}{lt:.2f}")
line_total_sx = sx_call("cart-item-line-total", text=f"Line total: {symbol}{lt:.2f}")
return sexp_call(
return sx_call(
"cart-item",
id=f"cart-item-{slug}", img=SexpExpr(img), prod_url=prod_url, title=p.title,
brand=SexpExpr(brand_sexp) if brand_sexp else None,
deleted=SexpExpr(deleted_sexp) if deleted_sexp else None,
price=SexpExpr(price_sexp),
id=f"cart-item-{slug}", img=SxExpr(img), prod_url=prod_url, title=p.title,
brand=SxExpr(brand_sx) if brand_sx else None,
deleted=SxExpr(deleted_sx) if deleted_sx else None,
price=SxExpr(price_sx),
qty_url=qty_url, csrf=csrf, minus=str(item.quantity - 1),
qty=str(item.quantity), plus=str(item.quantity + 1),
line_total=SexpExpr(line_total_sexp) if line_total_sexp else None,
line_total=SxExpr(line_total_sx) if line_total_sx else None,
)
def _calendar_entries_sexp(entries: list) -> str:
def _calendar_entries_sx(entries: list) -> str:
"""Render calendar booking entries in cart."""
if not entries:
return ""
@@ -275,15 +275,15 @@ def _calendar_entries_sexp(entries: list) -> str:
end = getattr(e, "end_at", None)
cost = getattr(e, "cost", 0) or 0
end_str = f" \u2013 {end}" if end else ""
parts.append(sexp_call(
parts.append(sx_call(
"cart-cal-entry",
name=name, date_str=f"{start}{end_str}", cost=f"\u00a3{cost:.2f}",
))
items_sexp = "(<> " + " ".join(parts) + ")"
return sexp_call("cart-cal-section", items=SexpExpr(items_sexp))
items_sx = "(<> " + " ".join(parts) + ")"
return sx_call("cart-cal-section", items=SxExpr(items_sx))
def _ticket_groups_sexp(ticket_groups: list, ctx: dict) -> str:
def _ticket_groups_sx(ticket_groups: list, ctx: dict) -> str:
"""Render ticket groups in cart."""
if not ticket_groups:
return ""
@@ -309,26 +309,26 @@ def _ticket_groups_sexp(ticket_groups: list, ctx: dict) -> str:
if end_at:
date_str += f" \u2013 {end_at.strftime('%-d %b %Y, %H:%M')}"
tt_name_sexp = sexp_call("cart-ticket-type-name", name=tt_name) if tt_name else None
tt_hidden_sexp = sexp_call("cart-ticket-type-hidden", value=str(tt_id)) if tt_id else None
tt_name_sx = sx_call("cart-ticket-type-name", name=tt_name) if tt_name else None
tt_hidden_sx = sx_call("cart-ticket-type-hidden", value=str(tt_id)) if tt_id else None
parts.append(sexp_call(
parts.append(sx_call(
"cart-ticket-article",
name=name,
type_name=SexpExpr(tt_name_sexp) if tt_name_sexp else None,
type_name=SxExpr(tt_name_sx) if tt_name_sx else None,
date_str=date_str,
price=f"\u00a3{price or 0:.2f}", qty_url=qty_url, csrf=csrf,
entry_id=str(entry_id),
type_hidden=SexpExpr(tt_hidden_sexp) if tt_hidden_sexp else None,
type_hidden=SxExpr(tt_hidden_sx) if tt_hidden_sx else None,
minus=str(max(quantity - 1, 0)), qty=str(quantity),
plus=str(quantity + 1), line_total=f"Line total: \u00a3{line_total:.2f}",
))
items_sexp = "(<> " + " ".join(parts) + ")"
return sexp_call("cart-tickets-section", items=SexpExpr(items_sexp))
items_sx = "(<> " + " ".join(parts) + ")"
return sx_call("cart-tickets-section", items=SxExpr(items_sx))
def _cart_summary_sexp(ctx: dict, cart: list, cal_entries: list, tickets: list,
def _cart_summary_sx(ctx: dict, cart: list, cal_entries: list, tickets: list,
total_fn: Any, cal_total_fn: Any, ticket_total_fn: Any) -> str:
"""Render the order summary sidebar."""
from shared.browser.app.csrf import generate_csrf_token
@@ -360,41 +360,41 @@ def _cart_summary_sexp(ctx: dict, cart: list, cal_entries: list, tickets: list,
action = url_for("cart_global.checkout")
from shared.utils import route_prefix
action = route_prefix() + action
checkout_sexp = sexp_call(
checkout_sx = sx_call(
"cart-checkout-form",
action=action, csrf=csrf, label=f" Checkout as {user.email}",
)
else:
href = login_url(request.url)
checkout_sexp = sexp_call("cart-checkout-signin", href=href)
checkout_sx = sx_call("cart-checkout-signin", href=href)
return sexp_call(
return sx_call(
"cart-summary-panel",
item_count=str(item_count), subtotal=f"{symbol}{grand:.2f}",
checkout=SexpExpr(checkout_sexp),
checkout=SxExpr(checkout_sx),
)
def _page_cart_main_panel_sexp(ctx: dict, cart: list, cal_entries: list,
def _page_cart_main_panel_sx(ctx: dict, cart: list, cal_entries: list,
tickets: list, ticket_groups: list,
total_fn: Any, cal_total_fn: Any,
ticket_total_fn: Any) -> str:
"""Page cart main panel."""
if not cart and not cal_entries and not tickets:
return sexp_call("cart-page-empty")
return sx_call("cart-page-empty")
item_parts = [_cart_item_sexp(item, ctx) for item in cart]
items_sexp = "(<> " + " ".join(item_parts) + ")" if item_parts else '""'
cal_sexp = _calendar_entries_sexp(cal_entries)
tickets_sexp = _ticket_groups_sexp(ticket_groups, ctx)
summary_sexp = _cart_summary_sexp(ctx, cart, cal_entries, tickets, total_fn, cal_total_fn, ticket_total_fn)
item_parts = [_cart_item_sx(item, ctx) for item in cart]
items_sx = "(<> " + " ".join(item_parts) + ")" if item_parts else '""'
cal_sx = _calendar_entries_sx(cal_entries)
tickets_sx = _ticket_groups_sx(ticket_groups, ctx)
summary_sx = _cart_summary_sx(ctx, cart, cal_entries, tickets, total_fn, cal_total_fn, ticket_total_fn)
return sexp_call(
return sx_call(
"cart-page-panel",
items=SexpExpr(items_sexp),
cal=SexpExpr(cal_sexp) if cal_sexp else None,
tickets=SexpExpr(tickets_sexp) if tickets_sexp else None,
summary=SexpExpr(summary_sexp),
items=SxExpr(items_sx),
cal=SxExpr(cal_sx) if cal_sx else None,
tickets=SxExpr(tickets_sx) if tickets_sx else None,
summary=SxExpr(summary_sx),
)
@@ -402,7 +402,7 @@ def _page_cart_main_panel_sexp(ctx: dict, cart: list, cal_entries: list,
# Orders list (same pattern as orders service)
# ---------------------------------------------------------------------------
def _order_row_sexp(order: Any, detail_url: str) -> str:
def _order_row_sx(order: Any, detail_url: str) -> str:
"""Render a single order as desktop table row + mobile card."""
status = order.status or "pending"
sl = status.lower()
@@ -415,14 +415,14 @@ def _order_row_sexp(order: Any, detail_url: str) -> str:
created = order.created_at.strftime("%-d %b %Y, %H:%M") if order.created_at else "\u2014"
total = f"{order.currency or 'GBP'} {order.total_amount or 0:.2f}"
desktop = sexp_call(
desktop = sx_call(
"cart-order-row-desktop",
order_id=f"#{order.id}", created=created, desc=order.description or "",
total=total, pill=pill_cls, status=status, detail_url=detail_url,
)
mobile_pill = f"inline-flex items-center rounded-full border px-2 py-0.5 text-[11px] {pill}"
mobile = sexp_call(
mobile = sx_call(
"cart-order-row-mobile",
order_id=f"#{order.id}", pill=mobile_pill, status=status,
created=created, total=total, detail_url=detail_url,
@@ -431,47 +431,47 @@ def _order_row_sexp(order: Any, detail_url: str) -> str:
return "(<> " + desktop + " " + mobile + ")"
def _orders_rows_sexp(orders: list, page: int, total_pages: int,
def _orders_rows_sx(orders: list, page: int, total_pages: int,
url_for_fn: Any, qs_fn: Any) -> str:
"""Render order rows + infinite scroll sentinel."""
from shared.utils import route_prefix
pfx = route_prefix()
parts = [
_order_row_sexp(o, pfx + url_for_fn("orders.order.order_detail", order_id=o.id))
_order_row_sx(o, pfx + url_for_fn("orders.order.order_detail", order_id=o.id))
for o in orders
]
if page < total_pages:
next_url = pfx + url_for_fn("orders.list_orders") + qs_fn(page=page + 1)
parts.append(sexp_call(
parts.append(sx_call(
"infinite-scroll",
url=next_url, page=page, total_pages=total_pages,
id_prefix="orders", colspan=5,
))
else:
parts.append(sexp_call("cart-orders-end"))
parts.append(sx_call("cart-orders-end"))
return "(<> " + " ".join(parts) + ")"
def _orders_main_panel_sexp(orders: list, rows_sexp: str) -> str:
def _orders_main_panel_sx(orders: list, rows_sx: str) -> str:
"""Main panel for orders list."""
if not orders:
return sexp_call("cart-orders-empty")
return sexp_call("cart-orders-table", rows=SexpExpr(rows_sexp))
return sx_call("cart-orders-empty")
return sx_call("cart-orders-table", rows=SxExpr(rows_sx))
def _orders_summary_sexp(ctx: dict) -> str:
def _orders_summary_sx(ctx: dict) -> str:
"""Filter section for orders list."""
return sexp_call("cart-orders-filter", search_mobile=SexpExpr(search_mobile_sexp(ctx)))
return sx_call("cart-orders-filter", search_mobile=SxExpr(search_mobile_sx(ctx)))
# ---------------------------------------------------------------------------
# Single order detail
# ---------------------------------------------------------------------------
def _order_items_sexp(order: Any) -> str:
def _order_items_sx(order: Any) -> str:
"""Render order items list."""
if not order or not order.items:
return ""
@@ -479,27 +479,27 @@ def _order_items_sexp(order: Any) -> str:
for item in order.items:
prod_url = market_product_url(item.product_slug)
if item.product_image:
img = sexp_call(
img = sx_call(
"cart-order-item-img",
src=item.product_image, alt=item.product_title or "Product image",
)
else:
img = sexp_call("cart-order-item-no-img")
parts.append(sexp_call(
img = sx_call("cart-order-item-no-img")
parts.append(sx_call(
"cart-order-item",
prod_url=prod_url, img=SexpExpr(img),
prod_url=prod_url, img=SxExpr(img),
title=item.product_title or "Unknown product",
product_id=f"Product ID: {item.product_id}",
qty=f"Qty: {item.quantity}",
price=f"{item.currency or order.currency or 'GBP'} {item.unit_price or 0:.2f}",
))
items_sexp = "(<> " + " ".join(parts) + ")"
return sexp_call("cart-order-items-panel", items=SexpExpr(items_sexp))
items_sx = "(<> " + " ".join(parts) + ")"
return sx_call("cart-order-items-panel", items=SxExpr(items_sx))
def _order_summary_sexp(order: Any) -> str:
def _order_summary_sx(order: Any) -> str:
"""Order summary card."""
return sexp_call(
return sx_call(
"order-summary-card",
order_id=order.id,
created_at=order.created_at.strftime("%-d %b %Y, %H:%M") if order.created_at else None,
@@ -508,7 +508,7 @@ def _order_summary_sexp(order: Any) -> str:
)
def _order_calendar_items_sexp(calendar_entries: list | None) -> str:
def _order_calendar_items_sx(calendar_entries: list | None) -> str:
"""Render calendar bookings for an order."""
if not calendar_entries:
return ""
@@ -525,43 +525,43 @@ def _order_calendar_items_sexp(calendar_entries: list | None) -> str:
ds = e.start_at.strftime("%-d %b %Y, %H:%M") if e.start_at else ""
if e.end_at:
ds += f" \u2013 {e.end_at.strftime('%-d %b %Y, %H:%M')}"
parts.append(sexp_call(
parts.append(sx_call(
"cart-order-cal-entry",
name=e.name, pill=pill_cls, status=st.capitalize(),
date_str=ds, cost=f"\u00a3{e.cost or 0:.2f}",
))
items_sexp = "(<> " + " ".join(parts) + ")"
return sexp_call("cart-order-cal-section", items=SexpExpr(items_sexp))
items_sx = "(<> " + " ".join(parts) + ")"
return sx_call("cart-order-cal-section", items=SxExpr(items_sx))
def _order_main_sexp(order: Any, calendar_entries: list | None) -> str:
def _order_main_sx(order: Any, calendar_entries: list | None) -> str:
"""Main panel for single order detail."""
summary = _order_summary_sexp(order)
items = _order_items_sexp(order)
cal = _order_calendar_items_sexp(calendar_entries)
return sexp_call(
summary = _order_summary_sx(order)
items = _order_items_sx(order)
cal = _order_calendar_items_sx(calendar_entries)
return sx_call(
"cart-order-main",
summary=SexpExpr(summary),
items=SexpExpr(items) if items else None,
cal=SexpExpr(cal) if cal else None,
summary=SxExpr(summary),
items=SxExpr(items) if items else None,
cal=SxExpr(cal) if cal else None,
)
def _order_filter_sexp(order: Any, list_url: str, recheck_url: str,
def _order_filter_sx(order: Any, list_url: str, recheck_url: str,
pay_url: str, csrf_token: str) -> str:
"""Filter section for single order detail."""
created = order.created_at.strftime("%-d %b %Y, %H:%M") if order.created_at else "\u2014"
status = order.status or "pending"
pay_sexp = None
pay_sx = None
if status != "paid":
pay_sexp = sexp_call("cart-order-pay-btn", url=pay_url)
pay_sx = sx_call("cart-order-pay-btn", url=pay_url)
return sexp_call(
return sx_call(
"cart-order-filter",
info=f"Placed {created} \u00b7 Status: {status}",
list_url=list_url, recheck_url=recheck_url, csrf=csrf_token,
pay=SexpExpr(pay_sexp) if pay_sexp else None,
pay=SxExpr(pay_sx) if pay_sx else None,
)
@@ -571,16 +571,16 @@ def _order_filter_sexp(order: Any, list_url: str, recheck_url: str,
async def render_overview_page(ctx: dict, page_groups: list) -> str:
"""Full page: cart overview."""
main = _overview_main_panel_sexp(page_groups, ctx)
hdr = root_header_sexp(ctx)
return full_page_sexp(ctx, header_rows=hdr, content=main)
main = _overview_main_panel_sx(page_groups, ctx)
hdr = root_header_sx(ctx)
return full_page_sx(ctx, header_rows=hdr, content=main)
async def render_overview_oob(ctx: dict, page_groups: list) -> str:
"""OOB response for cart overview."""
main = _overview_main_panel_sexp(page_groups, ctx)
oobs = root_header_sexp(ctx, oob=True)
return oob_page_sexp(oobs=oobs, content=main)
main = _overview_main_panel_sx(page_groups, ctx)
oobs = root_header_sx(ctx, oob=True)
return oob_page_sx(oobs=oobs, content=main)
# ---------------------------------------------------------------------------
@@ -592,17 +592,17 @@ async def render_page_cart_page(ctx: dict, page_post: Any,
ticket_groups: list, total_fn: Any,
cal_total_fn: Any, ticket_total_fn: Any) -> str:
"""Full page: page-specific cart."""
main = _page_cart_main_panel_sexp(ctx, cart, cal_entries, tickets, ticket_groups,
main = _page_cart_main_panel_sx(ctx, cart, cal_entries, tickets, ticket_groups,
total_fn, cal_total_fn, ticket_total_fn)
hdr = root_header_sexp(ctx)
child = _cart_header_sexp(ctx)
page_hdr = _page_cart_header_sexp(ctx, page_post)
nested = sexp_call(
hdr = root_header_sx(ctx)
child = _cart_header_sx(ctx)
page_hdr = _page_cart_header_sx(ctx, page_post)
nested = sx_call(
"cart-header-child-nested",
outer=SexpExpr(child), inner=SexpExpr(page_hdr),
outer=SxExpr(child), inner=SxExpr(page_hdr),
)
header_rows = "(<> " + hdr + " " + nested + ")"
return full_page_sexp(ctx, header_rows=header_rows, content=main)
return full_page_sx(ctx, header_rows=header_rows, content=main)
async def render_page_cart_oob(ctx: dict, page_post: Any,
@@ -610,14 +610,14 @@ async def render_page_cart_oob(ctx: dict, page_post: Any,
ticket_groups: list, total_fn: Any,
cal_total_fn: Any, ticket_total_fn: Any) -> str:
"""OOB response for page cart."""
main = _page_cart_main_panel_sexp(ctx, cart, cal_entries, tickets, ticket_groups,
main = _page_cart_main_panel_sx(ctx, cart, cal_entries, tickets, ticket_groups,
total_fn, cal_total_fn, ticket_total_fn)
child_oob = sexp_call("cart-header-child-oob",
inner=SexpExpr(_page_cart_header_sexp(ctx, page_post)))
cart_hdr_oob = _cart_header_sexp(ctx, oob=True)
root_hdr_oob = root_header_sexp(ctx, oob=True)
child_oob = sx_call("cart-header-child-oob",
inner=SxExpr(_page_cart_header_sx(ctx, page_post)))
cart_hdr_oob = _cart_header_sx(ctx, oob=True)
root_hdr_oob = root_header_sx(ctx, oob=True)
oobs = "(<> " + child_oob + " " + cart_hdr_oob + " " + root_hdr_oob + ")"
return oob_page_sexp(oobs=oobs, content=main)
return oob_page_sx(oobs=oobs, content=main)
# ---------------------------------------------------------------------------
@@ -635,21 +635,21 @@ async def render_orders_page(ctx: dict, orders: list, page: int,
ctx["search_count"] = search_count
list_url = route_prefix() + url_for_fn("orders.list_orders")
rows = _orders_rows_sexp(orders, page, total_pages, url_for_fn, qs_fn)
main = _orders_main_panel_sexp(orders, rows)
rows = _orders_rows_sx(orders, page, total_pages, url_for_fn, qs_fn)
main = _orders_main_panel_sx(orders, rows)
hdr = root_header_sexp(ctx)
auth = _auth_header_sexp(ctx)
orders_hdr = _orders_header_sexp(ctx, list_url)
auth_child = sexp_call(
hdr = root_header_sx(ctx)
auth = _auth_header_sx(ctx)
orders_hdr = _orders_header_sx(ctx, list_url)
auth_child = sx_call(
"cart-auth-header-child",
auth=SexpExpr(auth), orders=SexpExpr(orders_hdr),
auth=SxExpr(auth), orders=SxExpr(orders_hdr),
)
header_rows = "(<> " + hdr + " " + auth_child + ")"
return full_page_sexp(ctx, header_rows=header_rows,
filter=_orders_summary_sexp(ctx),
aside=search_desktop_sexp(ctx),
return full_page_sx(ctx, header_rows=header_rows,
filter=_orders_summary_sx(ctx),
aside=search_desktop_sx(ctx),
content=main)
@@ -657,7 +657,7 @@ async def render_orders_rows(ctx: dict, orders: list, page: int,
total_pages: int, url_for_fn: Any,
qs_fn: Any) -> str:
"""Pagination: just the table rows."""
return _orders_rows_sexp(orders, page, total_pages, url_for_fn, qs_fn)
return _orders_rows_sx(orders, page, total_pages, url_for_fn, qs_fn)
async def render_orders_oob(ctx: dict, orders: list, page: int,
@@ -671,20 +671,20 @@ async def render_orders_oob(ctx: dict, orders: list, page: int,
ctx["search_count"] = search_count
list_url = route_prefix() + url_for_fn("orders.list_orders")
rows = _orders_rows_sexp(orders, page, total_pages, url_for_fn, qs_fn)
main = _orders_main_panel_sexp(orders, rows)
rows = _orders_rows_sx(orders, page, total_pages, url_for_fn, qs_fn)
main = _orders_main_panel_sx(orders, rows)
auth_oob = _auth_header_sexp(ctx, oob=True)
auth_child_oob = sexp_call(
auth_oob = _auth_header_sx(ctx, oob=True)
auth_child_oob = sx_call(
"cart-auth-header-child-oob",
inner=SexpExpr(_orders_header_sexp(ctx, list_url)),
inner=SxExpr(_orders_header_sx(ctx, list_url)),
)
root_oob = root_header_sexp(ctx, oob=True)
root_oob = root_header_sx(ctx, oob=True)
oobs = "(<> " + auth_oob + " " + auth_child_oob + " " + root_oob + ")"
return oob_page_sexp(oobs=oobs,
filter=_orders_summary_sexp(ctx),
aside=search_desktop_sexp(ctx),
return oob_page_sx(oobs=oobs,
filter=_orders_summary_sx(ctx),
aside=search_desktop_sx(ctx),
content=main)
@@ -705,24 +705,24 @@ async def render_order_page(ctx: dict, order: Any,
recheck_url = pfx + url_for_fn("orders.order.order_recheck", order_id=order.id)
pay_url = pfx + url_for_fn("orders.order.order_pay", order_id=order.id)
main = _order_main_sexp(order, calendar_entries)
filt = _order_filter_sexp(order, list_url, recheck_url, pay_url, generate_csrf_token())
main = _order_main_sx(order, calendar_entries)
filt = _order_filter_sx(order, list_url, recheck_url, pay_url, generate_csrf_token())
hdr = root_header_sexp(ctx)
order_row = sexp_call(
hdr = root_header_sx(ctx)
order_row = sx_call(
"menu-row-sx",
id="order-row", level=3, colour="sky",
link_href=detail_url, link_label=f"Order {order.id}", icon="fa fa-gbp",
)
order_child = sexp_call(
order_child = sx_call(
"cart-order-header-child",
auth=SexpExpr(_auth_header_sexp(ctx)),
orders=SexpExpr(_orders_header_sexp(ctx, list_url)),
order=SexpExpr(order_row),
auth=SxExpr(_auth_header_sx(ctx)),
orders=SxExpr(_orders_header_sx(ctx, list_url)),
order=SxExpr(order_row),
)
header_rows = "(<> " + hdr + " " + order_child + ")"
return full_page_sexp(ctx, header_rows=header_rows, filter=filt, content=main)
return full_page_sx(ctx, header_rows=header_rows, filter=filt, content=main)
async def render_order_oob(ctx: dict, order: Any,
@@ -738,66 +738,66 @@ async def render_order_oob(ctx: dict, order: Any,
recheck_url = pfx + url_for_fn("orders.order.order_recheck", order_id=order.id)
pay_url = pfx + url_for_fn("orders.order.order_pay", order_id=order.id)
main = _order_main_sexp(order, calendar_entries)
filt = _order_filter_sexp(order, list_url, recheck_url, pay_url, generate_csrf_token())
main = _order_main_sx(order, calendar_entries)
filt = _order_filter_sx(order, list_url, recheck_url, pay_url, generate_csrf_token())
order_row_oob = sexp_call(
order_row_oob = sx_call(
"menu-row-sx",
id="order-row", level=3, colour="sky",
link_href=detail_url, link_label=f"Order {order.id}", icon="fa fa-gbp",
oob=True,
)
orders_child_oob = sexp_call("cart-orders-header-child-oob",
inner=SexpExpr(order_row_oob))
root_oob = root_header_sexp(ctx, oob=True)
orders_child_oob = sx_call("cart-orders-header-child-oob",
inner=SxExpr(order_row_oob))
root_oob = root_header_sx(ctx, oob=True)
oobs = "(<> " + orders_child_oob + " " + root_oob + ")"
return oob_page_sexp(oobs=oobs, filter=filt, content=main)
return oob_page_sx(oobs=oobs, filter=filt, content=main)
# ---------------------------------------------------------------------------
# Public API: Checkout error
# ---------------------------------------------------------------------------
def _checkout_error_filter_sexp() -> str:
return sexp_call("cart-checkout-error-filter")
def _checkout_error_filter_sx() -> str:
return sx_call("cart-checkout-error-filter")
def _checkout_error_content_sexp(error: str | None, order: Any | None) -> str:
def _checkout_error_content_sx(error: str | None, order: Any | None) -> str:
err_msg = error or "Unexpected error while creating the hosted checkout session."
order_sexp = None
order_sx = None
if order:
order_sexp = sexp_call("cart-checkout-error-order-id", order_id=f"#{order.id}")
order_sx = sx_call("cart-checkout-error-order-id", order_id=f"#{order.id}")
back_url = cart_url("/")
return sexp_call(
return sx_call(
"cart-checkout-error-content",
error_msg=err_msg,
order=SexpExpr(order_sexp) if order_sexp else None,
order=SxExpr(order_sx) if order_sx else None,
back_url=back_url,
)
async def render_checkout_error_page(ctx: dict, error: str | None = None, order: Any | None = None) -> str:
"""Full page: checkout error."""
hdr = root_header_sexp(ctx)
filt = _checkout_error_filter_sexp()
content = _checkout_error_content_sexp(error, order)
return full_page_sexp(ctx, header_rows=hdr, filter=filt, content=content)
hdr = root_header_sx(ctx)
filt = _checkout_error_filter_sx()
content = _checkout_error_content_sx(error, order)
return full_page_sx(ctx, header_rows=hdr, filter=filt, content=content)
# ---------------------------------------------------------------------------
# Page admin (/<page_slug>/admin/)
# ---------------------------------------------------------------------------
def _cart_page_admin_header_sexp(ctx: dict, page_post: Any, *, oob: bool = False,
def _cart_page_admin_header_sx(ctx: dict, page_post: Any, *, oob: bool = False,
selected: str = "") -> str:
"""Build the page-level admin header row -- delegates to shared helper."""
slug = page_post.slug if page_post else ""
ctx = _ensure_post_ctx(ctx, page_post)
return post_admin_header_sexp(ctx, slug, oob=oob, selected=selected)
return post_admin_header_sx(ctx, slug, oob=oob, selected=selected)
def _cart_admin_main_panel_sexp(ctx: dict) -> str:
def _cart_admin_main_panel_sx(ctx: dict) -> str:
"""Admin overview panel -- links to sub-admin pages."""
from quart import url_for
payments_href = url_for("page_admin.payments")
@@ -809,7 +809,7 @@ def _cart_admin_main_panel_sexp(ctx: dict) -> str:
)
def _cart_payments_main_panel_sexp(ctx: dict) -> str:
def _cart_payments_main_panel_sx(ctx: dict) -> str:
"""Render SumUp payment config form."""
from quart import url_for
csrf_token = ctx.get("csrf_token")
@@ -823,7 +823,7 @@ def _cart_payments_main_panel_sexp(ctx: dict) -> str:
placeholder = "--------" if sumup_configured else "sup_sk_..."
input_cls = "w-full px-3 py-1.5 text-sm border border-stone-300 rounded focus:ring-purple-500 focus:border-purple-500"
return sexp_call("cart-payments-panel",
return sx_call("cart-payments-panel",
update_url=update_url, csrf=csrf,
merchant_code=merchant_code, placeholder=placeholder,
input_cls=input_cls, sumup_configured=sumup_configured,
@@ -836,19 +836,19 @@ def _cart_payments_main_panel_sexp(ctx: dict) -> str:
async def render_cart_admin_page(ctx: dict, page_post: Any) -> str:
"""Full page: cart page admin overview."""
content = _cart_admin_main_panel_sexp(ctx)
root_hdr = root_header_sexp(ctx)
post_hdr = await _post_header_sexp(ctx, page_post)
admin_hdr = _cart_page_admin_header_sexp(ctx, page_post)
content = _cart_admin_main_panel_sx(ctx)
root_hdr = root_header_sx(ctx)
post_hdr = await _post_header_sx(ctx, page_post)
admin_hdr = _cart_page_admin_header_sx(ctx, page_post)
header_rows = "(<> " + root_hdr + " " + post_hdr + " " + admin_hdr + ")"
return full_page_sexp(ctx, header_rows=header_rows, content=content)
return full_page_sx(ctx, header_rows=header_rows, content=content)
async def render_cart_admin_oob(ctx: dict, page_post: Any) -> str:
"""OOB response: cart page admin overview."""
content = _cart_admin_main_panel_sexp(ctx)
oobs = _cart_page_admin_header_sexp(ctx, page_post, oob=True)
return oob_page_sexp(oobs=oobs, content=content)
content = _cart_admin_main_panel_sx(ctx)
oobs = _cart_page_admin_header_sx(ctx, page_post, oob=True)
return oob_page_sx(oobs=oobs, content=content)
# ---------------------------------------------------------------------------
@@ -857,21 +857,21 @@ async def render_cart_admin_oob(ctx: dict, page_post: Any) -> str:
async def render_cart_payments_page(ctx: dict, page_post: Any) -> str:
"""Full page: payments config."""
content = _cart_payments_main_panel_sexp(ctx)
root_hdr = root_header_sexp(ctx)
post_hdr = await _post_header_sexp(ctx, page_post)
admin_hdr = _cart_page_admin_header_sexp(ctx, page_post, selected="payments")
content = _cart_payments_main_panel_sx(ctx)
root_hdr = root_header_sx(ctx)
post_hdr = await _post_header_sx(ctx, page_post)
admin_hdr = _cart_page_admin_header_sx(ctx, page_post, selected="payments")
header_rows = "(<> " + root_hdr + " " + post_hdr + " " + admin_hdr + ")"
return full_page_sexp(ctx, header_rows=header_rows, content=content)
return full_page_sx(ctx, header_rows=header_rows, content=content)
async def render_cart_payments_oob(ctx: dict, page_post: Any) -> str:
"""OOB response: payments config."""
content = _cart_payments_main_panel_sexp(ctx)
oobs = _cart_page_admin_header_sexp(ctx, page_post, oob=True, selected="payments")
return oob_page_sexp(oobs=oobs, content=content)
content = _cart_payments_main_panel_sx(ctx)
oobs = _cart_page_admin_header_sx(ctx, page_post, oob=True, selected="payments")
return oob_page_sx(oobs=oobs, content=content)
def render_cart_payments_panel(ctx: dict) -> str:
"""Render the payments config panel for PUT response."""
return _cart_payments_main_panel_sexp(ctx)
return _cart_payments_main_panel_sx(ctx)