New /<slug>/ route shows upcoming confirmed events across all calendars
for a container. Features list/tile view toggle, date-grouped cards,
ticket +/- cart widgets, and infinite scroll pagination.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Day view and entry detail now load and render registered container_nav
widgets (e.g. market links) from the same container page — matching how
blog post pages work. Calendar-domain widgets are skipped since we're
already on a calendar page. Adds /w/<widget_domain>/ paginate route for
infinite scroll support.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace emit_event("calendar_entry.created") with direct try_publish().
Update shared submodule.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Emit calendar_entry.created events when entries are added
- Updated shared with federation handlers, delivery, anchoring
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Register StubFederationService in services/__init__.py
- Add federation to CI sibling list
- Add federation URL to app-config.yaml
- Update shared submodule with federation models/contracts/services
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The mini macro was imported without context, so cart_count was invisible
to the macro. Pass count explicitly in _adjust_response.html and add
'with context' to _buy_result.html. Update shared submodule.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Pass cart_count directly to the template instead of relying on the
context processor, which may not resolve correctly for the /tickets/
URL prefix.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The OOB swap was replacing the cart display with empty/wrong content.
Cart count updates naturally on next page navigation instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Entry page shows tickets sold count, remaining, and "in basket" count
- Replace numeric input + Buy button with add-to-basket / +/- controls
- New POST /tickets/adjust/ route creates/cancels tickets to target count
- Keep buy form active after adding (no confirmation replacement)
- New service functions: get_sold_ticket_count, get_user_reserved_count,
cancel_latest_reserved_ticket
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The buy_tickets response now includes an OOB swap of #cart-mini
so the cart badge count updates immediately when tickets are reserved.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Calendar entries route now uses services.cart.cart_summary() instead of
internal HTTP API call to cart app. Market CRUD delegates to
services.market.create_marketplace() / soft_delete_marketplace().
Updates shared submodule.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The services singleton was used in before_request closures but the
import was removed when refactoring to domain_services_fn.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The glue layer's models (MenuNode, ContainerRelation), services
(navigation, relationships), and event handlers have been absorbed
into shared/. The glue submodule caused duplicate SQLAlchemy table
registration for 'menu_nodes'.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace direct Post, MarketPlace, Calendar model queries and HTTP API
calls with typed service calls. Events registers all 4 services via
domain_services_fn with has() guards.
Key changes:
- app.py: use domain_services_fn, Post/Calendar/MarketPlace queries
→ services.blog/calendar/market, HTTP cart API → services.cart
- calendars/markets services: Post → services.blog
- post_associations: Post → services.blog, direct queries → services
- markets routes: remove unused MarketPlace import
- glue imports → shared imports throughout
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Context processor now sums product + calendar counts from cart API
- add_entry route returns OOB cart-mini swap with correct count,
querying pending entries from local session (sees uncommitted entry)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>