Auto-mount fragment handlers: eliminate fragment blueprint boilerplate across all 8 services
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>
This commit is contained in:
58
events/bp/fragments/python_handlers.py
Normal file
58
events/bp/fragments/python_handlers.py
Normal file
@@ -0,0 +1,58 @@
|
||||
"""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 ""
|
||||
Reference in New Issue
Block a user