The cart app has its own _cart.html that overrides the shared one.
The shared copy was fixed but this one still had hx-get on the
cross-origin login link.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cart was soft-deleted when the SumUp checkout was created, before the
user paid. If they navigated back, their cart was empty.
Move clear_cart_for_order into check_sumup_status so it only runs
when the order status transitions to "paid".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
StubFederationService silently no-ops federation events when
cart's event processor wins the race to pick them up.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
On boot, check SumUp API for any orders stuck in 'pending' that have
a checkout ID. This handles missed webhooks (service down, CSRF
rejection, etc). Runs once via before_serving hook, limited to 50
orders older than 2 minutes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
SumUp POSTs to /checkout/webhook/ externally with no session,
causing CSRF rejection. Mark endpoint as exempt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Product prices are float from DB but calendar/ticket totals are Decimal,
causing TypeError when summed in cart_context. Wrap prices in Decimal().
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>
ticket_total() returned float while total() returns Decimal, causing
a crash when summing cart totals. Standardise all total functions to
return Decimal.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Cart page groups tickets by entry+type instead of listing individually
- Each group shows event name, type, date, qty with +/- buttons, line total
- New POST /cart/ticket-quantity/ route for adjusting from cart page
- Summary includes ticket quantities in Items count
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Delete bp/cart/api.py (dead internal API endpoint)
- Remove registration from bp/__init__.py and app.py
- Update shared submodule
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Tickets now appear as cart line items, are included in checkout totals,
confirmed on payment, and displayed on the checkout return page.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
A page can have multiple markets — the overview now groups cart items
by market_place_id instead of page. Each card shows the market name
as heading with the page title below it.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- POST /delete/<product_id>/ removes the cart item entirely
- POST /quantity/ now clamps at 0 instead of deleting
- cart_delete_url Jinja global registered for template
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds POST /quantity/<product_id>/ to set cart item quantity (or remove at 0),
and registers cart_quantity_url Jinja global so the shared template uses it.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
resolve_page_config() now reads entry.calendar_container_id from the
CalendarEntryDTO instead of fetching the Calendar ORM model. Fixes
stale CalendarEntry type hints to CalendarEntryDTO. Updates shared
submodule.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>