Files
2026-07-17 17:45:56 +08:00

59 lines
2.3 KiB
Python

from __future__ import annotations
from .grader import FeatureGrader
from .lesson import build_lesson_steps
from .models import LearningSession, SessionMode, SkillStep, StandardAnswer, StepCompareResult
class SessionStore:
def __init__(self) -> None:
self._items: dict[str, LearningSession] = {}
def start(self, mode: SessionMode, standard: StandardAnswer) -> LearningSession:
session = LearningSession(
mode=mode,
standard_id=standard.standard_id,
title=standard.title,
lesson_steps=build_lesson_steps(standard),
)
self._items[session.session_id] = session
return session
def require(self, session_id: str) -> LearningSession:
if session_id not in self._items:
raise KeyError(f"session not found: {session_id}")
return self._items[session_id]
class LearningService:
def __init__(self, store: SessionStore, grader: FeatureGrader) -> None:
self.store = store
self.grader = grader
def submit_teaching_observation(self, session_id: str, observed: list[SkillStep]) -> StepCompareResult:
session = self.store.require(session_id)
session.observed_steps.extend(observed)
expected = session.lesson_steps[session.current_step_index] if session.current_step_index < len(session.lesson_steps) else None
if expected is None:
session.status = "completed"
result = StepCompareResult(ok=True, score=100, feedback_text="教学步骤已经完成。")
session.reports.append(result)
return result
actual = observed[-1] if observed else None
result = self.grader.compare_step(expected, actual)
session.reports.append(result)
if result.ok:
session.current_step_index += 1
if session.current_step_index >= len(session.lesson_steps):
session.status = "completed"
return result
def submit_test(self, session_id: str, observed: list[SkillStep]):
session = self.store.require(session_id)
session.observed_steps = observed
report = self.grader.grade_sequence(session.lesson_steps, observed)
session.final_report = report
session.status = "completed"
return report