98 lines
5.5 KiB
Python
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="")
|