All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 16m38s
Fragment read API is now fully declarative — every handler is a defhandler s-expression dispatched through one shared auto_mount_fragment_handlers() function. Replaces 8 near-identical blueprint files (~35 lines each) with a single function call per service. Events Python handlers (container-cards, account-page) extracted to a standalone module. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
59 lines
1.9 KiB
Python
59 lines
1.9 KiB
Python
"""Python fragment handlers for events.
|
|
|
|
These handlers call domain services and use sx_call() for rendering,
|
|
so they can't be expressed as declarative .sx handlers.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from quart import g, request
|
|
|
|
from shared.services.registry import services
|
|
|
|
|
|
async def container_cards_handler():
|
|
"""Container-cards fragment: entries for blog listing cards.
|
|
|
|
Returns text/html with <!-- card-widget:POST_ID --> comment markers
|
|
so the blog consumer can split per-post fragments.
|
|
"""
|
|
from sx.sx_components import render_fragment_container_cards
|
|
|
|
post_ids_raw = request.args.get("post_ids", "")
|
|
post_slugs_raw = request.args.get("post_slugs", "")
|
|
post_ids = [int(x) for x in post_ids_raw.split(",") if x.strip()]
|
|
post_slugs = [x.strip() for x in post_slugs_raw.split(",") if x.strip()]
|
|
if not post_ids:
|
|
return ""
|
|
|
|
slug_map = {}
|
|
for i, pid in enumerate(post_ids):
|
|
slug_map[pid] = post_slugs[i] if i < len(post_slugs) else ""
|
|
|
|
batch = await services.calendar.confirmed_entries_for_posts(g.s, post_ids)
|
|
return render_fragment_container_cards(batch, post_ids, slug_map)
|
|
|
|
|
|
async def account_page_handler():
|
|
"""Account-page fragment: tickets or bookings panel.
|
|
|
|
Returns text/sx — the account app embeds this as sx source.
|
|
"""
|
|
from sx.sx_components import (
|
|
render_fragment_account_tickets,
|
|
render_fragment_account_bookings,
|
|
)
|
|
|
|
slug = request.args.get("slug", "")
|
|
user_id = request.args.get("user_id", type=int)
|
|
if not user_id:
|
|
return ""
|
|
|
|
if slug == "tickets":
|
|
tickets = await services.calendar.user_tickets(g.s, user_id=user_id)
|
|
return render_fragment_account_tickets(tickets)
|
|
elif slug == "bookings":
|
|
bookings = await services.calendar.user_bookings(g.s, user_id=user_id)
|
|
return render_fragment_account_bookings(bookings)
|
|
return ""
|