From 0c4682e4d7897bb558118b254fb2193a86a9e9ef Mon Sep 17 00:00:00 2001 From: giles Date: Fri, 27 Feb 2026 10:30:13 +0000 Subject: [PATCH] Fix stale cart count: commit transaction before cross-service fragment fetch The cart-mini fragment relies on cart calling back to events for calendar/ ticket counts. Without committing first, the callback runs in a separate transaction and misses the just-added entry or ticket adjustment. Co-Authored-By: Claude Opus 4.6 --- events/bp/all_events/routes.py | 5 ++++- events/bp/calendar_entries/routes.py | 18 +++--------------- events/bp/page/routes.py | 5 ++++- 3 files changed, 11 insertions(+), 17 deletions(-) diff --git a/events/bp/all_events/routes.py b/events/bp/all_events/routes.py index c2405f7..b8cc697 100644 --- a/events/bp/all_events/routes.py +++ b/events/bp/all_events/routes.py @@ -125,7 +125,10 @@ def register() -> Blueprint: # Load entry DTO for the widget template entry = await services.calendar.entry_by_id(g.s, entry_id) - # Fetch OOB cart-mini fragment from cart service + # Commit so cross-service calls see the updated tickets + await g.tx.commit() + g.tx = await g.s.begin() + from shared.infrastructure.fragments import fetch_fragment frag_params = {"oob": "1"} if ident["user_id"] is not None: diff --git a/events/bp/calendar_entries/routes.py b/events/bp/calendar_entries/routes.py index 1417ec5..af1c2ee 100644 --- a/events/bp/calendar_entries/routes.py +++ b/events/bp/calendar_entries/routes.py @@ -8,9 +8,6 @@ from quart import ( ) -from sqlalchemy import update, func as sa_func - -from models.calendars import CalendarEntry from .services.entries import ( @@ -206,18 +203,9 @@ def register(): entry.ticket_price = ticket_price entry.ticket_count = ticket_count - # Count pending calendar entries from local session (sees the just-added entry) - user_id = getattr(g, "user", None) and g.user.id - cal_filters = [ - CalendarEntry.deleted_at.is_(None), - CalendarEntry.state == "pending", - ] - if user_id: - cal_filters.append(CalendarEntry.user_id == user_id) - - cal_count = await g.s.scalar( - select(sa_func.count()).select_from(CalendarEntry).where(*cal_filters) - ) or 0 + # Commit so cross-service calls see the new entry + await g.tx.commit() + g.tx = await g.s.begin() from shared.infrastructure.cart_identity import current_cart_identity from shared.infrastructure.fragments import fetch_fragment diff --git a/events/bp/page/routes.py b/events/bp/page/routes.py index d88c7bf..7944df3 100644 --- a/events/bp/page/routes.py +++ b/events/bp/page/routes.py @@ -106,7 +106,10 @@ def register() -> Blueprint: # Load entry DTO for the widget template entry = await services.calendar.entry_by_id(g.s, entry_id) - # Fetch OOB cart-mini fragment from cart service + # Commit so cross-service calls see the updated tickets + await g.tx.commit() + g.tx = await g.s.begin() + from shared.infrastructure.fragments import fetch_fragment frag_params = {"oob": "1"} if ident["user_id"] is not None: