Previous runs left self-copies (e.g. events/events/) that caused
'Table already defined' errors. Split into two loops: first rm -rf
all sibling dirs, then copy only non-self siblings.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each app has its own models/ at the root (imported as bare `models.X`).
The CI copy was also creating {app}/models/ (imported as `{app}.models.X`),
causing SQLAlchemy to see the same table defined twice.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The cp approach failed when sibling repos were mid-update from
their own CI runs. git archive reads directly from git objects,
and git fetch ensures origin/decoupling is available even if the
sibling working tree is on a different branch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phases 1-3 split models by domain ownership, but cross-app imports
still exist (e.g. cart imports market.models.CartItem). In Docker
each app only has its own code. The CI step now copies sibling app
model packages into the build context before docker build.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Phase 1-3 of decoupling:
- path_setup.py adds project root to sys.path
- Events-owned models in events/models/ (calendars with all related models)
- All imports updated: shared.infrastructure, shared.db, shared.browser, etc.
- Calendar uses container_type/container_id instead of post_id FK
- CalendarEntryPost uses content_type/content_id (generic content refs)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add post-admin-header-child row to calendars, calendar, markets,
and payments index templates so the admin nav bar persists
- Create events-app-specific post/admin nav and header templates
using coop_url() for blog endpoints instead of url_for()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- New markets blueprint at /<slug>/markets/ with create/delete
- New payments blueprint at /<slug>/payments/ with SumUp config
- Register both in events app with context processor for markets
- Remove PageConfig feature flag check from calendar creation
(feature toggles replaced by direct management pages)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Calendar creation now requires the parent post to be a page (is_page=True)
with the calendar feature enabled in its PageConfig. Update shared_lib
submodule with PageConfig model.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace url_for('blog.post.post_detail', ...) and
url_for('blog.post.admin.entries', ...) with coop_url() for
cross-service links back to the blog app.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Calendar nav: fix Slots link URL, add admin cog for admins
- Calendar header: add left padding to calendar name
- Post nav: add settings cog linking to blog admin
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
App templates must override shared templates so calendar pages
can skip the post-specific meta block.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Calendar templates extend post/index.html which includes _meta.html
expecting a `post` variable. In standalone events mode there's no
post — override with empty meta block.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
app.py is a top-level module, not inside a package, so relative
imports (from .bp...) fail at runtime.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ticket purchase:
- tickets blueprint with routes for my tickets list, ticket detail with QR
- Buy tickets form on entry detail page (HTMX-powered)
- Ticket services: create, query, availability checking
Admin check-in:
- ticket_admin blueprint with dashboard, lookup, and check-in routes
- QR scanner/lookup interface with real-time search
- Per-entry ticket list view
- Check-in transitions ticket state to checked_in
Internal API:
- GET /internal/events/tickets endpoint for cross-app queries
- POST /internal/events/tickets/<code>/checkin for programmatic check-in
Template fixes:
- All templates updated: blog.post.calendars.* → calendars.*
- Removed slug=post.slug parameters (standalone events service)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract events/calendar functionality into standalone microservice:
- app.py and events_api.py from apps/events/
- Calendar blueprints (calendars, calendar, calendar_entries, calendar_entry, day, slots, slot, ticket_types, ticket_type)
- Templates for all calendar/event views including admin
- Dockerfile (APP_MODULE=app:app, IMAGE=events)
- entrypoint.sh (no Alembic - migrations managed by blog app)
- Gitea CI workflow for build and deploy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>