feat: decouple events from shared_lib, add app-owned models

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>
This commit is contained in:
giles
2026-02-11 12:46:36 +00:00
parent 95d954fdb6
commit 154f968296
37 changed files with 506 additions and 93 deletions

16
app.py
View File

@@ -7,9 +7,9 @@ from quart import g, abort
from jinja2 import FileSystemLoader, ChoiceLoader
from sqlalchemy import select
from shared.factory import create_base_app
from shared.infrastructure.factory import create_base_app
from suma_browser.app.bp import register_calendars, register_markets, register_payments
from bp import register_calendars, register_markets, register_payments
async def events_context() -> dict:
@@ -19,8 +19,8 @@ async def events_context() -> dict:
- menu_items: fetched from coop internal API
- cart_count/cart_total: fetched from cart internal API
"""
from shared.context import base_context
from shared.internal_api import get as api_get, dictobj
from shared.infrastructure.context import base_context
from shared.infrastructure.internal_api import get as api_get, dictobj
ctx = await base_context()
@@ -41,9 +41,9 @@ async def events_context() -> dict:
def create_app() -> "Quart":
from models.ghost_content import Post
from blog.models.ghost_content import Post
from models.calendars import Calendar
from models.market_place import MarketPlace
from market.models.market_place import MarketPlace
app = create_base_app("events", context_fn=events_context)
@@ -118,14 +118,14 @@ def create_app() -> "Quart":
calendars = (
await g.s.execute(
select(Calendar)
.where(Calendar.post_id == post_id, Calendar.deleted_at.is_(None))
.where(Calendar.container_type == "page", Calendar.container_id == post_id, Calendar.deleted_at.is_(None))
.order_by(Calendar.name.asc())
)
).scalars().all()
markets = (
await g.s.execute(
select(MarketPlace)
.where(MarketPlace.post_id == post_id, MarketPlace.deleted_at.is_(None))
.where(MarketPlace.container_type == "page", MarketPlace.container_id == post_id, MarketPlace.deleted_at.is_(None))
.order_by(MarketPlace.name.asc())
)
).scalars().all()