diff --git a/backend/app/main.py b/backend/app/main.py index 4bfb81a..f40cb6d 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -30,8 +30,6 @@ async def lifespan(app: FastAPI): async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) # Idempotent column additions for schema migrations - await _add_column_if_missing(conn, "schedule_templates", "day_start_time", "TIME NULL") - await _add_column_if_missing(conn, "schedule_templates", "day_end_time", "TIME NULL") await _add_column_if_missing(conn, "schedule_blocks", "duration_minutes", "INT NULL") await _add_column_if_missing(conn, "schedule_blocks", "break_time_enabled", "TINYINT(1) NOT NULL DEFAULT 0") await _add_column_if_missing(conn, "schedule_blocks", "break_time_minutes", "INT NULL") diff --git a/backend/app/models/schedule.py b/backend/app/models/schedule.py index 6cf4140..f299480 100644 --- a/backend/app/models/schedule.py +++ b/backend/app/models/schedule.py @@ -14,8 +14,6 @@ class ScheduleTemplate(TimestampMixin, Base): ) name: Mapped[str] = mapped_column(String(100), nullable=False) is_default: Mapped[bool] = mapped_column(Boolean, default=False) - day_start_time: Mapped[time | None] = mapped_column(Time, nullable=True) - day_end_time: Mapped[time | None] = mapped_column(Time, nullable=True) user: Mapped["User"] = relationship("User", back_populates="schedule_templates") # noqa: F821 child: Mapped["Child | None"] = relationship("Child") # noqa: F821 diff --git a/backend/app/routers/dashboard.py b/backend/app/routers/dashboard.py index 354bb2d..028e04d 100644 --- a/backend/app/routers/dashboard.py +++ b/backend/app/routers/dashboard.py @@ -13,7 +13,7 @@ from app.dependencies import get_db from app.models.child import Child from app.models.morning_routine import MorningRoutineItem from app.models.break_activity import BreakActivityItem -from app.models.schedule import ScheduleBlock, ScheduleTemplate +from app.models.schedule import ScheduleBlock from app.models.subject import Subject # noqa: F401 — needed for selectinload chain from app.models.session import DailySession, TimerEvent from app.schemas.session import DashboardSnapshot @@ -45,8 +45,6 @@ async def get_dashboard(child_id: int, db: AsyncSession = Depends(get_db)): blocks = [] completed_ids = [] block_elapsed_seconds = 0 - day_start_time = None - day_end_time = None if session and session.template_id: blocks_result = await db.execute( @@ -57,14 +55,6 @@ async def get_dashboard(child_id: int, db: AsyncSession = Depends(get_db)): ) blocks = blocks_result.scalars().all() - template_result = await db.execute( - select(ScheduleTemplate).where(ScheduleTemplate.id == session.template_id) - ) - template = template_result.scalar_one_or_none() - if template: - day_start_time = template.day_start_time - day_end_time = template.day_end_time - events_result = await db.execute( select(TimerEvent).where( TimerEvent.session_id == session.id, @@ -101,8 +91,6 @@ async def get_dashboard(child_id: int, db: AsyncSession = Depends(get_db)): completed_block_ids=completed_ids, block_elapsed_seconds=block_elapsed_seconds, is_paused=is_paused, - day_start_time=day_start_time, - day_end_time=day_end_time, morning_routine=morning_routine, break_activities=break_activities, ) diff --git a/backend/app/routers/schedules.py b/backend/app/routers/schedules.py index e3f609b..85d715d 100644 --- a/backend/app/routers/schedules.py +++ b/backend/app/routers/schedules.py @@ -44,8 +44,6 @@ async def create_template( name=body.name, child_id=body.child_id, is_default=body.is_default, - day_start_time=body.day_start_time, - day_end_time=body.day_end_time, ) db.add(template) await db.flush() # get template.id before adding blocks diff --git a/backend/app/routers/sessions.py b/backend/app/routers/sessions.py index 5fa04a4..4e9dd0c 100644 --- a/backend/app/routers/sessions.py +++ b/backend/app/routers/sessions.py @@ -9,7 +9,7 @@ from app.dependencies import get_db, get_current_user from app.models.child import Child from app.models.morning_routine import MorningRoutineItem from app.models.break_activity import BreakActivityItem -from app.models.schedule import ScheduleBlock, ScheduleTemplate +from app.models.schedule import ScheduleBlock 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 @@ -23,8 +23,6 @@ router = APIRouter(prefix="/api/sessions", tags=["sessions"]) async def _broadcast_session(db: AsyncSession, session: DailySession) -> None: """Build a snapshot dict and broadcast it to all connected TVs for this child.""" blocks = [] - day_start_time = None - day_end_time = None if session.template_id: blocks_result = await db.execute( @@ -56,14 +54,6 @@ async def _broadcast_session(db: AsyncSession, session: DailySession) -> None: for b in blocks_result.scalars().all() ] - template_result = await db.execute( - select(ScheduleTemplate).where(ScheduleTemplate.id == session.template_id) - ) - template = template_result.scalar_one_or_none() - if template: - day_start_time = str(template.day_start_time) if template.day_start_time else None - day_end_time = str(template.day_end_time) if template.day_end_time else None - # Gather completed block IDs from timer events events_result = await db.execute( select(TimerEvent).where( @@ -105,8 +95,6 @@ async def _broadcast_session(db: AsyncSession, session: DailySession) -> None: }, "blocks": blocks, "completed_block_ids": completed_ids, - "day_start_time": day_start_time, - "day_end_time": day_end_time, "morning_routine": morning_routine, "break_activities": break_activities, } diff --git a/backend/app/schemas/schedule.py b/backend/app/schemas/schedule.py index 3db0d29..ce6d232 100644 --- a/backend/app/schemas/schedule.py +++ b/backend/app/schemas/schedule.py @@ -47,8 +47,6 @@ class ScheduleTemplateCreate(BaseModel): name: str child_id: int | None = None is_default: bool = False - day_start_time: time | None = None - day_end_time: time | None = None blocks: list[ScheduleBlockCreate] = [] @@ -56,8 +54,6 @@ class ScheduleTemplateUpdate(BaseModel): name: str | None = None child_id: int | None = None is_default: bool | None = None - day_start_time: time | None = None - day_end_time: time | None = None class ScheduleTemplateOut(BaseModel): @@ -65,8 +61,6 @@ class ScheduleTemplateOut(BaseModel): name: str child_id: int | None is_default: bool - day_start_time: time | None - day_end_time: time | None blocks: list[ScheduleBlockOut] = [] model_config = {"from_attributes": True} diff --git a/backend/app/schemas/session.py b/backend/app/schemas/session.py index aea771d..df87085 100644 --- a/backend/app/schemas/session.py +++ b/backend/app/schemas/session.py @@ -1,4 +1,4 @@ -from datetime import date, datetime, time +from datetime import date, datetime from pydantic import BaseModel from app.schemas.schedule import ScheduleBlockOut from app.schemas.child import ChildOut @@ -44,7 +44,5 @@ class DashboardSnapshot(BaseModel): completed_block_ids: list[int] = [] block_elapsed_seconds: int = 0 # seconds already elapsed for the current block is_paused: bool = False # whether the current block's timer is paused - day_start_time: time | None = None - day_end_time: time | None = None morning_routine: list[str] = [] # text items shown on TV during greeting state break_activities: list[str] = [] # text items shown on TV during break time diff --git a/frontend/src/stores/schedule.js b/frontend/src/stores/schedule.js index cc24299..0c87024 100644 --- a/frontend/src/stores/schedule.js +++ b/frontend/src/stores/schedule.js @@ -11,8 +11,6 @@ export const useScheduleStore = defineStore('schedule', () => { const blockStartedAt = ref(null) // Date.now() ms when current counting period started const blockElapsedOffset = ref(0) // seconds already elapsed before blockStartedAt const blockElapsedCache = ref({}) // blockId → total elapsed seconds (survives block switches) - const dayStartTime = ref(null) // "HH:MM:SS" string or null - const dayEndTime = ref(null) // "HH:MM:SS" string or null const morningRoutine = ref([]) // list of text strings shown during greeting state const breakActivities = ref([]) // list of text strings shown during break time // Break timer state (per-block break time at end of block) @@ -45,8 +43,6 @@ export const useScheduleStore = defineStore('schedule', () => { completedBlockIds.value = snapshot.completed_block_ids || [] isPaused.value = snapshot.is_paused || false if (snapshot.child) child.value = snapshot.child - dayStartTime.value = snapshot.day_start_time || null - dayEndTime.value = snapshot.day_end_time || null morningRoutine.value = snapshot.morning_routine || [] breakActivities.value = snapshot.break_activities || [] // Restore elapsed time from server-computed value and seed the per-block cache @@ -86,8 +82,6 @@ export const useScheduleStore = defineStore('schedule', () => { blockStartedAt.value = null blockElapsedOffset.value = 0 blockElapsedCache.value = {} - dayStartTime.value = null - dayEndTime.value = null isBreakMode.value = false breakStartedAt.value = null breakElapsedOffset.value = 0 @@ -322,8 +316,6 @@ export const useScheduleStore = defineStore('schedule', () => { blockStartedAt, blockElapsedOffset, blockElapsedCache, - dayStartTime, - dayEndTime, morningRoutine, breakActivities, isBreakMode, diff --git a/frontend/src/views/AdminView.vue b/frontend/src/views/AdminView.vue index 3bfe5e8..82c373e 100644 --- a/frontend/src/views/AdminView.vue +++ b/frontend/src/views/AdminView.vue @@ -229,24 +229,6 @@