Didactopus/src/didactopus/orm.py

98 lines
5.5 KiB
Python

from sqlalchemy import String, Integer, Float, ForeignKey, Text, Boolean
from sqlalchemy.orm import Mapped, mapped_column
from .db import Base
class UserORM(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
username: Mapped[str] = mapped_column(String(100), unique=True, index=True)
password_hash: Mapped[str] = mapped_column(String(255))
role: Mapped[str] = mapped_column(String(50), default="learner")
is_active: Mapped[bool] = mapped_column(Boolean, default=True)
class PackORM(Base):
__tablename__ = "packs"
id: Mapped[str] = mapped_column(String(100), primary_key=True)
owner_user_id: Mapped[int | None] = mapped_column(ForeignKey("users.id"), nullable=True)
policy_lane: Mapped[str] = mapped_column(String(50), default="personal")
title: Mapped[str] = mapped_column(String(255))
subtitle: Mapped[str] = mapped_column(Text, default="")
level: Mapped[str] = mapped_column(String(100), default="novice-friendly")
data_json: Mapped[str] = mapped_column(Text)
is_published: Mapped[bool] = mapped_column(Boolean, default=False)
class LearnerORM(Base):
__tablename__ = "learners"
id: Mapped[str] = mapped_column(String(100), primary_key=True)
owner_user_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True)
display_name: Mapped[str] = mapped_column(String(255), default="")
class MasteryRecordORM(Base):
__tablename__ = "mastery_records"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
learner_id: Mapped[str] = mapped_column(ForeignKey("learners.id"), index=True)
concept_id: Mapped[str] = mapped_column(String(100), index=True)
dimension: Mapped[str] = mapped_column(String(100), default="mastery")
score: Mapped[float] = mapped_column(Float, default=0.0)
confidence: Mapped[float] = mapped_column(Float, default=0.0)
evidence_count: Mapped[int] = mapped_column(Integer, default=0)
last_updated: Mapped[str] = mapped_column(String(100), default="")
class KnowledgeCandidateORM(Base):
__tablename__ = "knowledge_candidates"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
source_type: Mapped[str] = mapped_column(String(50), default="learner_export")
source_artifact_id: Mapped[int | None] = mapped_column(Integer, nullable=True)
learner_id: Mapped[str] = mapped_column(String(100), index=True)
pack_id: Mapped[str] = mapped_column(String(100), index=True)
candidate_kind: Mapped[str] = mapped_column(String(100), index=True)
title: Mapped[str] = mapped_column(String(255))
summary: Mapped[str] = mapped_column(Text, default="")
structured_payload_json: Mapped[str] = mapped_column(Text, default="{}")
evidence_summary: Mapped[str] = mapped_column(Text, default="")
confidence_hint: Mapped[float] = mapped_column(Float, default=0.0)
novelty_score: Mapped[float] = mapped_column(Float, default=0.0)
synthesis_score: Mapped[float] = mapped_column(Float, default=0.0)
triage_lane: Mapped[str] = mapped_column(String(50), default="archive")
current_status: Mapped[str] = mapped_column(String(50), default="captured")
created_at: Mapped[str] = mapped_column(String(100), default="")
class ReviewRecordORM(Base):
__tablename__ = "review_records"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
candidate_id: Mapped[int] = mapped_column(ForeignKey("knowledge_candidates.id"), index=True)
reviewer_id: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True)
review_kind: Mapped[str] = mapped_column(String(50), default="human_review")
verdict: Mapped[str] = mapped_column(String(100), default="")
rationale: Mapped[str] = mapped_column(Text, default="")
requested_changes: Mapped[str] = mapped_column(Text, default="")
created_at: Mapped[str] = mapped_column(String(100), default="")
class PromotionRecordORM(Base):
__tablename__ = "promotion_records"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
candidate_id: Mapped[int] = mapped_column(ForeignKey("knowledge_candidates.id"), index=True)
promotion_target: Mapped[str] = mapped_column(String(50), index=True)
target_object_id: Mapped[str] = mapped_column(String(100), default="")
promotion_status: Mapped[str] = mapped_column(String(50), default="draft")
promoted_by: Mapped[int] = mapped_column(ForeignKey("users.id"), index=True)
created_at: Mapped[str] = mapped_column(String(100), default="")
class SynthesisCandidateORM(Base):
__tablename__ = "synthesis_candidates"
id: Mapped[int] = mapped_column(Integer, primary_key=True)
source_concept_id: Mapped[str] = mapped_column(String(100), index=True)
target_concept_id: Mapped[str] = mapped_column(String(100), index=True)
source_pack_id: Mapped[str] = mapped_column(String(100), index=True)
target_pack_id: Mapped[str] = mapped_column(String(100), index=True)
synthesis_kind: Mapped[str] = mapped_column(String(100), default="cross_pack_similarity")
score_total: Mapped[float] = mapped_column(Float, default=0.0)
score_semantic: Mapped[float] = mapped_column(Float, default=0.0)
score_structural: Mapped[float] = mapped_column(Float, default=0.0)
score_trajectory: Mapped[float] = mapped_column(Float, default=0.0)
score_review_history: Mapped[float] = mapped_column(Float, default=0.0)
explanation: Mapped[str] = mapped_column(Text, default="")
evidence_json: Mapped[str] = mapped_column(Text, default="{}")
current_status: Mapped[str] = mapped_column(String(50), default="proposed")
created_at: Mapped[str] = mapped_column(String(100), default="")