This repository has been archived on 2026-02-24 . You can view files and clone it. You cannot open issues or pull requests or push a commit.
f1b3093d94efe2a237c64a6ceece0b523ae24115
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 52s
Was using cart_url (cross-app) which causes invalid path for HTMX.
Use url_for('tickets.adjust_quantity') — the events-local route.
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.
Architecture
One of five Quart microservices sharing a single PostgreSQL database:
| App | Port | Domain |
|---|---|---|
| blog (coop) | 8000 | Auth, blog, admin, menus, snippets |
| market | 8001 | Product browsing, Suma scraping |
| cart | 8002 | Shopping cart, checkout, orders |
| events | 8003 | Calendars, bookings, tickets |
| federation | 8004 | ActivityPub, fediverse social |
Structure
app.py # Application factory (create_base_app + blueprints)
path_setup.py # Adds project root + app dir to sys.path
config/app-config.yaml # App URLs, feature flags
models/ # Events-domain models
calendars.py # Calendar, CalendarEntry, CalendarSlot,
# TicketType, Ticket, CalendarEntryPost
bp/ # Blueprints
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
services/ # register_domain_services() — wires calendar + market + cart
shared/ # Submodule -> git.rose-ash.com/coop/shared.git
Models
All events-domain models live in models/calendars.py:
| Model | Description |
|---|---|
| Calendar | Container for entries, scoped to a page via container_type + container_id |
| CalendarEntry | A bookable event/time slot. Has state (pending/ordered/provisional), cost, ownership (user_id/session_id), and order_id (plain integer, no FK) |
| 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 entriesshared.services.navigation— site navigation tree
Migrations
This app does not run Alembic migrations on startup. Migrations are managed in the shared/ submodule and run from the blog app's entrypoint.
Running
export DATABASE_URL_ASYNC=postgresql+asyncpg://user:pass@localhost/coop
export REDIS_URL=redis://localhost:6379/0
export SECRET_KEY=your-secret-key
hypercorn app:app --bind 0.0.0.0:8003
Description
Languages
HTML
51%
Python
48.4%
Shell
0.3%
Dockerfile
0.3%