"""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 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 ""