All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 2m39s
When navigating from a deeper page (e.g. day) to a shallower one (e.g. calendar) via HTMX, orphaned header rows from the deeper page persisted in the DOM because OOB swaps only replaced specific child divs, not siblings. Fix by sending empty OOB swaps to clear all header row IDs not present at the current depth. Applied to events (calendars/calendar/day/entry/admin/slots) and market (market_home/browse/product/admin). Also restore app_label in root header. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Events App
Calendar and event booking service for the Rose Ash cooperative platform. Manages calendars, time slots, calendar entries (bookings), tickets, and ticket types.
Structure
app.py # Application factory (create_base_app + blueprints)
path_setup.py # Adds project root + app dir to sys.path
entrypoint.sh # Container entrypoint (Redis flush, start)
bp/
calendars/ # Calendar listing
calendar/ # Single calendar view and admin
calendar_entries/ # Calendar entries listing
calendar_entry/ # Single entry view and admin
day/ # Day view and admin
slots/ # Slot listing
slot/ # Single slot management
ticket_types/ # Ticket type listing
ticket_type/ # Single ticket type management
tickets/ # Ticket listing
ticket_admin/ # Ticket administration
markets/ # Page-scoped marketplace views
payments/ # Payment-related views
fragments/ # container-nav, container-cards fragments
models/ # Re-export stubs (Calendar, CalendarEntry, Ticket, etc.)
services/ # register_domain_services() — wires calendar + market + cart
templates/ # Events-specific templates (override shared/)
Models
All events-domain models live in shared/models/:
| Model | Description |
|---|---|
| Calendar | Container for entries, scoped to a page via container_type + container_id |
| CalendarEntry | A bookable event/time slot with state (pending/ordered/provisional) and cost |
| CalendarSlot | Recurring time bands (day-of-week + time range) within a calendar |
| TicketType | Named ticket categories with price and count |
| Ticket | Individual ticket with unique code, state, and order_id (plain integer, no FK) |
| CalendarEntryPost | Junction linking entries to content via content_type + content_id |
order_id on CalendarEntry and Ticket is a plain integer column — no FK constraint to the orders table. The cart app writes these values via service calls, not directly.
Cross-domain communication
services.market.*— marketplace queries for page viewsservices.cart.*— cart summary for context processorservices.federation.*— AP publishing for new entries
Fragments served
- container-nav — calendar entries + links for blog sidebar
- container-cards — event cards for blog listing pages