elkay: lesson.py and teacher link
Browse files- phase/Student_view/teacherlink.py +27 -7
- utils/api.py +21 -1
phase/Student_view/teacherlink.py
CHANGED
|
@@ -70,6 +70,18 @@ def _student_assignments_for_class(student_id: int, class_id: int):
|
|
| 70 |
except Exception:
|
| 71 |
return []
|
| 72 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
# --- UI ---
|
| 74 |
|
| 75 |
def show_code():
|
|
@@ -204,16 +216,24 @@ def show_code():
|
|
| 204 |
with c1:
|
| 205 |
# pass lesson & assignment to the Lessons page
|
| 206 |
if st.button("▶️ Start Lesson", key=f"start_lesson_{r.get('assignment_id')}"):
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 211 |
st.session_state.lesson_route = {
|
| 212 |
"source": "teacher",
|
| 213 |
-
"lesson_id":
|
| 214 |
-
"assignment_id":
|
| 215 |
}
|
| 216 |
-
|
| 217 |
st.session_state.current_page = "Lessons"
|
| 218 |
st.rerun()
|
| 219 |
with c2:
|
|
|
|
| 70 |
except Exception:
|
| 71 |
return []
|
| 72 |
|
| 73 |
+
def _mark_assignment_started(student_id: int, assignment_id: int):
|
| 74 |
+
if USE_LOCAL_DB and hasattr(dbapi, "mark_assignment_started"):
|
| 75 |
+
return dbapi.mark_assignment_started(student_id, assignment_id)
|
| 76 |
+
return api.mark_assignment_started(student_id, assignment_id)
|
| 77 |
+
|
| 78 |
+
def _set_assignment_progress(student_id: int, assignment_id: int, current_pos: int = 1, progress: float = 0.05):
|
| 79 |
+
# optional nudge so the bar is not 0
|
| 80 |
+
if USE_LOCAL_DB and hasattr(dbapi, "set_assignment_progress"):
|
| 81 |
+
return dbapi.set_assignment_progress(student_id, assignment_id, current_pos, progress)
|
| 82 |
+
return api.set_assignment_progress(student_id, assignment_id, current_pos, progress)
|
| 83 |
+
|
| 84 |
+
|
| 85 |
# --- UI ---
|
| 86 |
|
| 87 |
def show_code():
|
|
|
|
| 216 |
with c1:
|
| 217 |
# pass lesson & assignment to the Lessons page
|
| 218 |
if st.button("▶️ Start Lesson", key=f"start_lesson_{r.get('assignment_id')}"):
|
| 219 |
+
lesson_id = int(r.get("lesson_id"))
|
| 220 |
+
assignment_id = int(r.get("assignment_id"))
|
| 221 |
+
|
| 222 |
+
# Tell backend we started
|
| 223 |
+
try:
|
| 224 |
+
_mark_assignment_started(student_id, assignment_id)
|
| 225 |
+
_set_assignment_progress(student_id, assignment_id, current_pos=1, progress=0.05)
|
| 226 |
+
except Exception as e:
|
| 227 |
+
st.warning(f"Could not mark as started yet. Continuing anyway. {e}")
|
| 228 |
+
|
| 229 |
+
# Route intent
|
| 230 |
+
st.session_state.selected_lesson = lesson_id
|
| 231 |
+
st.session_state.selected_assignment = assignment_id
|
| 232 |
st.session_state.lesson_route = {
|
| 233 |
"source": "teacher",
|
| 234 |
+
"lesson_id": lesson_id,
|
| 235 |
+
"assignment_id": assignment_id,
|
| 236 |
}
|
|
|
|
| 237 |
st.session_state.current_page = "Lessons"
|
| 238 |
st.rerun()
|
| 239 |
with c2:
|
utils/api.py
CHANGED
|
@@ -318,6 +318,14 @@ def delete_lesson(lesson_id: int, teacher_id: int):
|
|
| 318 |
d = _req("DELETE", f"/lessons/{lesson_id}", json={"teacher_id": teacher_id}).json()
|
| 319 |
return bool(d.get("ok", True)), d.get("message", "")
|
| 320 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 321 |
# Quizzes
|
| 322 |
def list_quizzes_by_teacher(teacher_id: int):
|
| 323 |
return _json_or_raise(_req("GET", f"/teachers/{teacher_id}/quizzes"))
|
|
@@ -657,4 +665,16 @@ def tutor_explain(lesson_id: int, level_slug: str, wrong: list[dict]):
|
|
| 657 |
"wrong": wrong
|
| 658 |
}, timeout=60)
|
| 659 |
r.raise_for_status()
|
| 660 |
-
return r.json()["feedback"]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 318 |
d = _req("DELETE", f"/lessons/{lesson_id}", json={"teacher_id": teacher_id}).json()
|
| 319 |
return bool(d.get("ok", True)), d.get("message", "")
|
| 320 |
|
| 321 |
+
def mark_assignment_started(student_id: int, assignment_id: int):
|
| 322 |
+
return _req("POST", f"/assignments/{assignment_id}/start").json()
|
| 323 |
+
|
| 324 |
+
def set_assignment_progress(student_id: int, assignment_id: int, current_pos: int, progress: float):
|
| 325 |
+
return _req("PATCH", f"/assignments/{assignment_id}/progress",
|
| 326 |
+
json={"current_pos": current_pos, "progress": progress}).json()
|
| 327 |
+
|
| 328 |
+
|
| 329 |
# Quizzes
|
| 330 |
def list_quizzes_by_teacher(teacher_id: int):
|
| 331 |
return _json_or_raise(_req("GET", f"/teachers/{teacher_id}/quizzes"))
|
|
|
|
| 665 |
"wrong": wrong
|
| 666 |
}, timeout=60)
|
| 667 |
r.raise_for_status()
|
| 668 |
+
return r.json()["feedback"]
|
| 669 |
+
|
| 670 |
+
@app.post("/assignments/{assignment_id}/start")
|
| 671 |
+
def start_assignment(assignment_id: int, student=Depends(auth_student)):
|
| 672 |
+
db.mark_assignment_started(student.id, assignment_id)
|
| 673 |
+
return {"ok": True}
|
| 674 |
+
|
| 675 |
+
@app.patch("/assignments/{assignment_id}/progress")
|
| 676 |
+
def update_progress(assignment_id: int, payload: dict, student=Depends(auth_student)):
|
| 677 |
+
db.set_assignment_progress(student.id, assignment_id,
|
| 678 |
+
payload.get("current_pos", 0),
|
| 679 |
+
payload.get("progress", 0.0))
|
| 680 |
+
return {"ok": True}
|