Compare commits
No commits in common. "agent/g1-homework-t_91c5f09c" and "master" have entirely different histories.
agent/g1-h
...
master
@ -1,14 +0,0 @@
|
||||
-- G1: Homework as a first-class lesson/planner field.
|
||||
-- Apply to DEV Supabase only before promoting app/api changes.
|
||||
|
||||
alter table if exists public.taught_lessons
|
||||
add column if not exists homework text not null default '';
|
||||
|
||||
alter table if exists public.planned_lessons
|
||||
add column if not exists homework text not null default '';
|
||||
|
||||
comment on column public.taught_lessons.homework is
|
||||
'Teacher-authored homework for this taught lesson; surfaced in lesson/timetable views.';
|
||||
|
||||
comment on column public.planned_lessons.homework is
|
||||
'Default homework carried by a lesson plan and copied to a taught lesson when delivered.';
|
||||
@ -53,7 +53,6 @@ class PlannedLessonNode(CCBaseNode):
|
||||
subject: str
|
||||
teacher_code: str
|
||||
planning_status: str
|
||||
homework: Optional[str] = None
|
||||
topic_code: Optional[str] = None
|
||||
topic_name: Optional[str] = None
|
||||
lesson_code: Optional[str] = None
|
||||
|
||||
@ -83,7 +83,6 @@ class CreatePlanRequest(BaseModel):
|
||||
estimated_duration_minutes: Optional[int] = None
|
||||
objectives: Optional[List[Dict[str, Any]]] = None
|
||||
activities: Optional[List[Dict[str, Any]]] = None
|
||||
homework: Optional[str] = None
|
||||
status: Optional[str] = "draft"
|
||||
tags: Optional[List[str]] = None
|
||||
topic_code: Optional[str] = None
|
||||
@ -100,7 +99,6 @@ class UpdatePlanRequest(BaseModel):
|
||||
estimated_duration_minutes: Optional[int] = None
|
||||
objectives: Optional[List[Dict[str, Any]]] = None
|
||||
activities: Optional[List[Dict[str, Any]]] = None
|
||||
homework: Optional[str] = None
|
||||
status: Optional[str] = None
|
||||
tags: Optional[List[str]] = None
|
||||
topic_code: Optional[str] = None
|
||||
@ -251,7 +249,6 @@ async def create_plan(
|
||||
"status": body.status or "draft",
|
||||
"objectives": body.objectives or [],
|
||||
"activities": body.activities or [],
|
||||
"homework": body.homework or "",
|
||||
"tags": body.tags or [],
|
||||
}
|
||||
for field in (
|
||||
@ -365,7 +362,7 @@ async def update_plan(
|
||||
updates: Dict[str, Any] = {}
|
||||
for field in (
|
||||
"title", "class_id", "subject", "year_group", "estimated_duration_minutes",
|
||||
"objectives", "activities", "homework", "status", "tags", "topic_code",
|
||||
"objectives", "activities", "status", "tags", "topic_code",
|
||||
"whiteboard_room_id", "course_id", "sequence_number",
|
||||
):
|
||||
val = getattr(body, field)
|
||||
@ -428,7 +425,7 @@ async def deliver_plan(
|
||||
|
||||
plan_res = (
|
||||
sb.supabase.table("planned_lessons")
|
||||
.select("id, whiteboard_room_id, homework")
|
||||
.select("id, whiteboard_room_id")
|
||||
.eq("id", plan_id)
|
||||
.eq("institute_id", institute_id)
|
||||
.single()
|
||||
@ -459,19 +456,6 @@ async def deliver_plan(
|
||||
|
||||
res = sb.supabase.table("lesson_deliveries").insert(row).execute()
|
||||
delivery = (res.data or [{}])[0]
|
||||
|
||||
# If the plan has default homework and was delivered into a taught lesson,
|
||||
# copy it onto the lesson so homework appears in daily/timetable views.
|
||||
plan_homework = plan_res.data.get("homework")
|
||||
if body.taught_lesson_id and plan_homework is not None:
|
||||
try:
|
||||
sb.supabase.table("taught_lessons").update({
|
||||
"homework": plan_homework,
|
||||
"updated_at": datetime.utcnow().isoformat(),
|
||||
}).eq("id", body.taught_lesson_id).eq("teacher_id", user_id).execute()
|
||||
except Exception as e:
|
||||
logger.warning(f"Could not copy homework to taught_lesson {body.taught_lesson_id}: {e}")
|
||||
|
||||
logger.info(f"Lesson delivery created: {delivery.get('id')} for plan {plan_id} by {user_id}")
|
||||
return delivery
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@ Taught Lessons Router — materialization and lesson CRUD.
|
||||
POST /materialize — slot template × academic_periods → taught_lessons rows
|
||||
GET /lessons — teacher's lessons for a date range
|
||||
GET /lessons/{id} — single lesson detail
|
||||
PATCH /lessons/{id} — update lesson_plan, homework, notes, status (teacher-owned)
|
||||
PATCH /lessons/{id} — update lesson_plan, notes, status (teacher-owned)
|
||||
"""
|
||||
import os
|
||||
from collections import defaultdict
|
||||
@ -44,7 +44,6 @@ def _require_institute(user_id: str) -> str:
|
||||
|
||||
class UpdateLessonRequest(BaseModel):
|
||||
lesson_plan: Optional[Dict[str, Any]] = None
|
||||
homework: Optional[str] = None
|
||||
notes: Optional[str] = None
|
||||
status: Optional[str] = None # planned | in_progress | completed | cancelled | substituted
|
||||
|
||||
@ -311,7 +310,7 @@ async def get_lessons(
|
||||
lessons = (
|
||||
sb.supabase.table("taught_lessons")
|
||||
.select(
|
||||
"id,date,period_code,week_cycle,day_of_week,status,lesson_plan,homework,notes,whiteboard_room_id,"
|
||||
"id,date,period_code,week_cycle,day_of_week,status,lesson_plan,notes,whiteboard_room_id,"
|
||||
"class_id,academic_period_id"
|
||||
)
|
||||
.eq("teacher_id", user_id)
|
||||
@ -419,15 +418,13 @@ async def update_lesson(
|
||||
body: UpdateLessonRequest,
|
||||
credentials: dict = Depends(SupabaseBearer()),
|
||||
) -> Dict[str, Any]:
|
||||
"""Teacher updates their own lesson content: plan, homework, notes, status."""
|
||||
"""Teacher updates their own lesson content: plan, notes, status."""
|
||||
user_id = credentials.get("sub", "")
|
||||
sb = _sb()
|
||||
|
||||
updates: Dict[str, Any] = {}
|
||||
if body.lesson_plan is not None:
|
||||
updates["lesson_plan"] = body.lesson_plan
|
||||
if body.homework is not None:
|
||||
updates["homework"] = body.homework
|
||||
if body.notes is not None:
|
||||
updates["notes"] = body.notes
|
||||
if body.status is not None:
|
||||
@ -511,7 +508,7 @@ async def get_student_lessons(
|
||||
lessons = (
|
||||
sb.supabase.table("taught_lessons")
|
||||
.select(
|
||||
"id,date,period_code,week_cycle,day_of_week,status,lesson_plan,homework,notes,whiteboard_room_id,"
|
||||
"id,date,period_code,week_cycle,day_of_week,status,lesson_plan,notes,whiteboard_room_id,"
|
||||
"class_id,academic_period_id,teacher_id"
|
||||
)
|
||||
.in_("class_id", class_ids)
|
||||
|
||||
@ -675,7 +675,7 @@ def _sync_taught_lessons_to_neo4j(
|
||||
"""
|
||||
lessons = (
|
||||
sb.supabase.table("taught_lessons")
|
||||
.select("id,neo4j_node_id,academic_period_id,teacher_id,date,period_code,week_cycle,day_of_week,status,homework")
|
||||
.select("id,neo4j_node_id,academic_period_id,teacher_id,date,period_code,week_cycle,day_of_week,status")
|
||||
.eq("institute_id", institute_id)
|
||||
.execute()
|
||||
.data or []
|
||||
@ -728,7 +728,6 @@ def _sync_taught_lessons_to_neo4j(
|
||||
SET tl.date = date($date), tl.period_code = $pcode,
|
||||
tl.week_cycle = $wc, tl.day_of_week = $dow,
|
||||
tl.status = $status,
|
||||
tl.homework = $homework,
|
||||
tl.node_storage_path = $path
|
||||
""",
|
||||
id=tl_id,
|
||||
@ -737,7 +736,6 @@ def _sync_taught_lessons_to_neo4j(
|
||||
wc=lesson.get("week_cycle", ""),
|
||||
dow=lesson.get("day_of_week", ""),
|
||||
status=lesson.get("status", "planned"),
|
||||
homework=lesson.get("homework") or "",
|
||||
path=f"taught_lessons/{tl_id}",
|
||||
)
|
||||
count += 1
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user