feat: add versioned backend scoring workflow

This commit is contained in:
2026-09-25 11:11:18 +08:00
parent 146d5566cf
commit eece55d08d
20 changed files with 2063 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
from sqlalchemy import delete, select
from .models import (CourseObjective, GraduationIndicator, RubricCriterion,
RubricScoreLevel, TopicDirection)
def sync_course_entities(db, version):
db.execute(delete(CourseObjective).where(CourseObjective.course_version_id == version.id))
db.execute(delete(GraduationIndicator).where(GraduationIndicator.course_version_id == version.id))
db.execute(delete(TopicDirection).where(TopicDirection.course_version_id == version.id))
for value in version.objectives:
db.add(CourseObjective(course_version_id=version.id, code=str(value["code"]), name=value["name"],
description=value.get("description", ""), indicator_codes=value.get("indicators", [])))
for value in version.indicators:
db.add(GraduationIndicator(course_version_id=version.id, code=str(value["code"]), description=value["description"]))
for value in version.directions:
db.add(TopicDirection(course_version_id=version.id, name=value["name"], examples=value.get("examples", [])))
db.flush()
def sync_rubric_entities(db, rubric):
ids = db.scalars(select(RubricCriterion.id).where(RubricCriterion.rubric_version_id == rubric.id)).all()
if ids:
db.execute(delete(RubricScoreLevel).where(RubricScoreLevel.rubric_criterion_id.in_(ids)))
db.execute(delete(RubricCriterion).where(RubricCriterion.rubric_version_id == rubric.id))
for value in rubric.criteria:
item = RubricCriterion(rubric_version_id=rubric.id, criterion_id=value["criterion_id"],
category=value["category"], name=value["name"], description=value["description"],
max_score=value["max_score"], linked_objectives=value.get("linked_objectives", []),
linked_outcomes=value.get("linked_outcomes", []), required_evidence=value.get("required_evidence", []))
db.add(item)
db.flush()
for level in value.get("score_levels", []):
db.add(RubricScoreLevel(rubric_criterion_id=item.id, min_score=level["min"],
max_score=level["max"], description=level["description"]))
db.flush()