Add subject options and redesign TV dashboard layout
Subject options: - New subject_options table (auto-created on startup) - SubjectOut now includes options list; all eager-loading chains updated - Admin: Options panel per subject with add, inline edit, and delete - WS broadcast and dashboard API include options in block subject data TV dashboard: - Three equal columns: Timer | Activities | Schedule - Activities column shows current subject's options in large readable text - Activities area has subject-colored border and tinted background - Subject name and label displayed correctly using embedded subject data Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -8,6 +8,7 @@ from sqlalchemy.orm import selectinload
|
||||
from app.dependencies import get_db, get_current_user
|
||||
from app.models.child import Child
|
||||
from app.models.schedule import ScheduleBlock, ScheduleTemplate
|
||||
from app.models.subject import Subject # noqa: F401 — needed for selectinload chain
|
||||
from app.models.session import DailySession, TimerEvent
|
||||
from app.models.user import User
|
||||
from app.schemas.session import DailySessionOut, SessionStart, TimerAction
|
||||
@@ -26,12 +27,21 @@ async def _broadcast_session(db: AsyncSession, session: DailySession) -> None:
|
||||
blocks_result = await db.execute(
|
||||
select(ScheduleBlock)
|
||||
.where(ScheduleBlock.template_id == session.template_id)
|
||||
.options(selectinload(ScheduleBlock.subject).selectinload(Subject.options))
|
||||
.order_by(ScheduleBlock.order_index)
|
||||
)
|
||||
blocks = [
|
||||
{
|
||||
"id": b.id,
|
||||
"subject_id": b.subject_id,
|
||||
"subject": {
|
||||
"id": b.subject.id,
|
||||
"name": b.subject.name,
|
||||
"color": b.subject.color,
|
||||
"icon": b.subject.icon,
|
||||
"options": [{"id": o.id, "text": o.text, "order_index": o.order_index}
|
||||
for o in b.subject.options],
|
||||
} if b.subject else None,
|
||||
"time_start": str(b.time_start),
|
||||
"time_end": str(b.time_end),
|
||||
"duration_minutes": b.duration_minutes,
|
||||
|
||||
Reference in New Issue
Block a user