Files
ss-tools/backend/src/models/dataset_review_pkg/_clarification_models.py
2026-05-13 14:15:33 +03:00

121 lines
5.1 KiB
Python

# #region DatasetReviewClarificationModels [C:3] [TYPE Module] [SEMANTICS sqlalchemy, dataset, review, clarification, model]
# @BRIEF Clarification session, question, option, and answer models for guided review flow.
# @LAYER: Domain
# @RELATION DEPENDS_ON -> [DatasetReviewEnums:Module]
# @RELATION DEPENDS_ON -> [MappingModels]
# @INVARIANT: Only one active clarification question may exist at a time per session.
import uuid
from datetime import datetime
from sqlalchemy import (
Boolean,
Column,
String,
Integer,
Text,
DateTime,
ForeignKey,
Enum as SQLEnum,
)
from sqlalchemy.orm import relationship
from src.models.mapping import Base
from src.models.dataset_review_pkg._enums import (
ClarificationStatus,
QuestionState,
AnswerKind,
)
# #region ClarificationSession [C:2] [TYPE Class]
# @BRIEF One clarification session aggregate owning questions and tracking resolution progress.
# @RELATION DEPENDS_ON -> [DatasetReviewSession]
class ClarificationSession(Base):
__tablename__ = "clarification_sessions"
clarification_session_id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
session_id = Column(String, ForeignKey("dataset_review_sessions.session_id"), nullable=False)
status = Column(SQLEnum(ClarificationStatus), nullable=False, default=ClarificationStatus.PENDING)
current_question_id = Column(String, nullable=True)
resolved_count = Column(Integer, nullable=False, default=0)
remaining_count = Column(Integer, nullable=False, default=0)
summary_delta = Column(Text, nullable=True)
started_at = Column(DateTime, default=datetime.utcnow, nullable=False)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
completed_at = Column(DateTime, nullable=True)
session = relationship("DatasetReviewSession", back_populates="clarification_sessions")
questions = relationship("ClarificationQuestion", back_populates="clarification_session", cascade="all, delete-orphan")
# #endregion ClarificationSession
# #region ClarificationQuestion [C:2] [TYPE Class]
# @BRIEF One clarification question with priority ordering, options, and state machine.
# @RELATION DEPENDS_ON -> [ClarificationSession]
class ClarificationQuestion(Base):
__tablename__ = "clarification_questions"
question_id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
clarification_session_id = Column(String, ForeignKey("clarification_sessions.clarification_session_id"), nullable=False)
topic_ref = Column(String, nullable=False)
question_text = Column(Text, nullable=False)
why_it_matters = Column(Text, nullable=False)
current_guess = Column(Text, nullable=True)
priority = Column(Integer, nullable=False, default=0)
state = Column(SQLEnum(QuestionState), nullable=False, default=QuestionState.OPEN)
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
clarification_session = relationship("ClarificationSession", back_populates="questions")
options = relationship("ClarificationOption", back_populates="question", cascade="all, delete-orphan")
answer = relationship("ClarificationAnswer", back_populates="question", uselist=False, cascade="all, delete-orphan")
# #endregion ClarificationQuestion
# #region ClarificationOption [C:1] [TYPE Class]
# @BRIEF One selectable option for a clarification question with recommendation flag.
# @RELATION DEPENDS_ON -> [ClarificationQuestion]
class ClarificationOption(Base):
__tablename__ = "clarification_options"
option_id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
question_id = Column(String, ForeignKey("clarification_questions.question_id"), nullable=False)
label = Column(String, nullable=False)
value = Column(String, nullable=False)
is_recommended = Column(Boolean, nullable=False, default=False)
display_order = Column(Integer, nullable=False, default=0)
question = relationship("ClarificationQuestion", back_populates="options")
# #endregion ClarificationOption
# #region ClarificationAnswer [C:2] [TYPE Class]
# @BRIEF One persisted clarification answer with impact summary and feedback tracking.
# @RELATION DEPENDS_ON -> [ClarificationQuestion]
class ClarificationAnswer(Base):
__tablename__ = "clarification_answers"
answer_id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
question_id = Column(String, ForeignKey("clarification_questions.question_id"), nullable=False, unique=True)
answer_kind = Column(SQLEnum(AnswerKind), nullable=False)
answer_value = Column(Text, nullable=True)
answered_by_user_id = Column(String, nullable=False)
impact_summary = Column(Text, nullable=True)
user_feedback = Column(Text, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
question = relationship("ClarificationQuestion", back_populates="answer")
# #endregion ClarificationAnswer
# #endregion DatasetReviewClarificationModels