From e8ee40d42ba9a53340860fbc1cf02c85eb996604 Mon Sep 17 00:00:00 2001 From: al Date: Fri, 13 Feb 2026 00:53:19 -0500 Subject: [PATCH] fix: use TEMPLATES_DIR env var for Jinja2 templates in Docker Create shared templates.py module that reads TEMPLATES_DIR env var (defaulting to "templates" for local dev). Update all files to import from the shared module. Co-Authored-By: Claude Opus 4.6 --- py/apps/py-app/src/server/events/widgets.py | 3 +-- py/apps/py-app/src/server/handlers/component.py | 3 +-- py/apps/py-app/src/server/handlers/page.py | 3 +-- py/apps/py-app/src/server/pages/admin/chat.py | 3 +-- py/apps/py-app/src/server/pages/admin/cron_jobs.py | 3 +-- py/apps/py-app/src/server/pages/admin/dashboard.py | 3 +-- py/apps/py-app/src/server/pages/admin/users.py | 3 +-- py/apps/py-app/src/server/pages/admin/widgets.py | 3 +-- py/apps/py-app/src/server/pages/app/widgets.py | 3 +-- py/apps/py-app/src/server/templates.py | 5 +++++ 10 files changed, 14 insertions(+), 18 deletions(-) create mode 100644 py/apps/py-app/src/server/templates.py diff --git a/py/apps/py-app/src/server/events/widgets.py b/py/apps/py-app/src/server/events/widgets.py index a76fb5e..99ea334 100644 --- a/py/apps/py-app/src/server/events/widgets.py +++ b/py/apps/py-app/src/server/events/widgets.py @@ -24,7 +24,6 @@ from typing import AsyncGenerator from fastapi import APIRouter, Depends, Request -from fastapi.templating import Jinja2Templates from redis.asyncio import Redis from sse_starlette.sse import EventSourceResponse @@ -40,9 +39,9 @@ require_admin_user, require_logged_in_user, ) +from src.server.templates import templates router = APIRouter() -templates = Jinja2Templates(directory="templates") async def publish_widget_event( diff --git a/py/apps/py-app/src/server/handlers/component.py b/py/apps/py-app/src/server/handlers/component.py index b9269b8..fe77ce5 100644 --- a/py/apps/py-app/src/server/handlers/component.py +++ b/py/apps/py-app/src/server/handlers/component.py @@ -1,10 +1,9 @@ from fastapi import Request from fastapi.responses import HTMLResponse, JSONResponse -from fastapi.templating import Jinja2Templates from pydantic import BaseModel from typing import Any, Dict -templates = Jinja2Templates(directory="templates") +from src.server.templates import templates class ComponentResponseHandler: diff --git a/py/apps/py-app/src/server/handlers/page.py b/py/apps/py-app/src/server/handlers/page.py index 5da6f8c..7bd59ed 100644 --- a/py/apps/py-app/src/server/handlers/page.py +++ b/py/apps/py-app/src/server/handlers/page.py @@ -1,9 +1,8 @@ from fastapi import Request -from fastapi.templating import Jinja2Templates from fastapi.responses import HTMLResponse from typing import Dict, Any -templates = Jinja2Templates(directory="templates") +from src.server.templates import templates class PageResponse: diff --git a/py/apps/py-app/src/server/pages/admin/chat.py b/py/apps/py-app/src/server/pages/admin/chat.py index 6a1c695..ca6da64 100644 --- a/py/apps/py-app/src/server/pages/admin/chat.py +++ b/py/apps/py-app/src/server/pages/admin/chat.py @@ -4,7 +4,6 @@ from fastapi import APIRouter, Depends, Request, Form, HTTPException from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse -from fastapi.templating import Jinja2Templates from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from redis.asyncio import Redis @@ -37,9 +36,9 @@ from src.server.deps import async_db, logger, redis, require_admin_user from src.tasks.jobs.complete_thread import complete_thread_task +from src.server.templates import templates router = APIRouter() -templates = Jinja2Templates(directory="templates") async def dispatch_completion(user_id: str, completion_id: str) -> None: diff --git a/py/apps/py-app/src/server/pages/admin/cron_jobs.py b/py/apps/py-app/src/server/pages/admin/cron_jobs.py index 74f8c53..057e827 100644 --- a/py/apps/py-app/src/server/pages/admin/cron_jobs.py +++ b/py/apps/py-app/src/server/pages/admin/cron_jobs.py @@ -2,7 +2,6 @@ from fastapi import APIRouter, Depends, Query, Request from fastapi.responses import HTMLResponse -from fastapi.templating import Jinja2Templates from sqlalchemy import func, select from sqlalchemy.ext.asyncio import AsyncSession @@ -10,9 +9,9 @@ from py_core.database.models.cron_job_run import CronJobRun, CronJobRunStatus from src.server.deps import async_db, require_admin_user +from src.server.templates import templates router = APIRouter() -templates = Jinja2Templates(directory="templates") ITEMS_PER_PAGE = 20 diff --git a/py/apps/py-app/src/server/pages/admin/dashboard.py b/py/apps/py-app/src/server/pages/admin/dashboard.py index d100f4f..35b7176 100644 --- a/py/apps/py-app/src/server/pages/admin/dashboard.py +++ b/py/apps/py-app/src/server/pages/admin/dashboard.py @@ -4,7 +4,6 @@ from fastapi import APIRouter, Depends, Request from fastapi.responses import HTMLResponse -from fastapi.templating import Jinja2Templates from redis.asyncio import Redis from sqlalchemy import func, select, text from sqlalchemy.ext.asyncio import AsyncSession @@ -14,9 +13,9 @@ from py_core.observability import Logger from src.server.deps import async_db, logger, redis, require_admin_user +from src.server.templates import templates router = APIRouter() -templates = Jinja2Templates(directory="templates") @router.get("/", response_class=HTMLResponse) diff --git a/py/apps/py-app/src/server/pages/admin/users.py b/py/apps/py-app/src/server/pages/admin/users.py index 05619a1..49fae46 100644 --- a/py/apps/py-app/src/server/pages/admin/users.py +++ b/py/apps/py-app/src/server/pages/admin/users.py @@ -2,7 +2,6 @@ from fastapi import APIRouter, Depends, HTTPException, Query, Request from fastapi.responses import HTMLResponse -from fastapi.templating import Jinja2Templates from sqlalchemy.ext.asyncio import AsyncSession from py_core.database.models import User @@ -11,9 +10,9 @@ from src.server.deps import async_db, logger, require_admin_user from src.tasks.jobs.send_welcome_notification import send_welcome_notification +from src.server.templates import templates router = APIRouter() -templates = Jinja2Templates(directory="templates") USERS_PER_PAGE = 20 diff --git a/py/apps/py-app/src/server/pages/admin/widgets.py b/py/apps/py-app/src/server/pages/admin/widgets.py index 824ba81..1c11d2e 100644 --- a/py/apps/py-app/src/server/pages/admin/widgets.py +++ b/py/apps/py-app/src/server/pages/admin/widgets.py @@ -2,7 +2,6 @@ from fastapi import APIRouter, Depends, HTTPException, Query, Request, Form from fastapi.responses import HTMLResponse -from fastapi.templating import Jinja2Templates from sqlalchemy.ext.asyncio import AsyncSession from py_core.database.models import User, Widget, WidgetStatus @@ -17,9 +16,9 @@ WidgetUpdatedEvent, ) from redis.asyncio import Redis +from src.server.templates import templates router = APIRouter() -templates = Jinja2Templates(directory="templates") WIDGETS_PER_PAGE = 20 diff --git a/py/apps/py-app/src/server/pages/app/widgets.py b/py/apps/py-app/src/server/pages/app/widgets.py index 10f47f7..06981fb 100644 --- a/py/apps/py-app/src/server/pages/app/widgets.py +++ b/py/apps/py-app/src/server/pages/app/widgets.py @@ -6,7 +6,6 @@ from fastapi import APIRouter, Depends, HTTPException, Query, Request, Form from fastapi.responses import HTMLResponse -from fastapi.templating import Jinja2Templates from sqlalchemy.ext.asyncio import AsyncSession from redis.asyncio import Redis @@ -21,9 +20,9 @@ from src.server.deps import async_db, logger, redis, require_logged_in_user from src.tasks.jobs.process_widget import process_widget_task +from src.server.templates import templates router = APIRouter() -templates = Jinja2Templates(directory="templates") WIDGETS_PER_PAGE = 10 APP_LAYOUT = "layouts/app.html" diff --git a/py/apps/py-app/src/server/templates.py b/py/apps/py-app/src/server/templates.py new file mode 100644 index 0000000..5d1588c --- /dev/null +++ b/py/apps/py-app/src/server/templates.py @@ -0,0 +1,5 @@ +import os +from starlette.templating import Jinja2Templates + +templates_dir = os.getenv("TEMPLATES_DIR", "templates") +templates = Jinja2Templates(directory=templates_dir)