feat(027): Final Phase T038-T043 implementation
- T038: SessionEvent logger and persistence logic - Added SessionEventLogger service with explicit audit event persistence - Added SessionEvent model with events relationship on DatasetReviewSession - Integrated event logging into orchestrator flows and API mutation endpoints - T039: Semantic source version propagation - Added source_version column to SemanticFieldEntry - Added propagate_source_version_update() to SemanticResolver - Preserves locked/manual field invariants during propagation - T040: Batch approval API and UI actions - Added batch semantic approval endpoint (/fields/semantic/approve-batch) - Added batch mapping approval endpoint (/mappings/approve-batch) - Added batch approval actions to SemanticLayerReview and ExecutionMappingReview components - Aligned batch semantics with single-item approval contracts - T041: Superset compatibility matrix tests - Added test_superset_matrix.py with preview and SQL Lab fallback coverage - Tests verify client method preference and matrix fallback behavior - T042: RBAC audit sweep on session-mutation endpoints - Added _require_owner_mutation_scope() helper - Applied owner guards to update_session, delete_session, and all mutation endpoints - Ensured no bypass of existing permission checks - T043: i18n coverage for dataset-review UI - Added workspace state labels (empty/importing/review) to en.json and ru.json - Added batch action labels for semantics and mappings - Fixed workspace state comparison to lowercase strings - Removed hardcoded workspace state display strings Signed-off-by: Implementation Specialist <impl@ss-tools>
This commit is contained in:
@@ -132,6 +132,7 @@ class DatasetReviewSession(Base):
|
||||
previews = relationship("CompiledPreview", back_populates="session", cascade="all, delete-orphan")
|
||||
run_contexts = relationship("DatasetRunContext", back_populates="session", cascade="all, delete-orphan")
|
||||
export_artifacts = relationship("ExportArtifact", back_populates="session", cascade="all, delete-orphan")
|
||||
events = relationship("SessionEvent", back_populates="session", cascade="all, delete-orphan")
|
||||
# [/DEF:DatasetReviewSession:Class]
|
||||
|
||||
# [DEF:BusinessSummarySource:Class]
|
||||
@@ -303,6 +304,7 @@ class SemanticFieldEntry(Base):
|
||||
display_format = Column(String, nullable=True)
|
||||
provenance = Column(SQLEnum(FieldProvenance), nullable=False, default=FieldProvenance.UNRESOLVED)
|
||||
source_id = Column(String, nullable=True)
|
||||
source_version = Column(String, nullable=True)
|
||||
confidence_rank = Column(Integer, nullable=True)
|
||||
is_locked = Column(Boolean, nullable=False, default=False)
|
||||
has_conflict = Column(Boolean, nullable=False, default=False)
|
||||
@@ -567,6 +569,7 @@ class ClarificationAnswer(Base):
|
||||
answer_value = Column(Text, nullable=True)
|
||||
answered_by_user_id = Column(String, nullable=False)
|
||||
impact_summary = Column(Text, nullable=True)
|
||||
user_feedback = Column(String, nullable=True) # up, down, null
|
||||
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|
||||
|
||||
question = relationship("ClarificationQuestion", back_populates="answer")
|
||||
@@ -627,6 +630,24 @@ class DatasetRunContext(Base):
|
||||
session = relationship("DatasetReviewSession", back_populates="run_contexts")
|
||||
# [/DEF:DatasetRunContext:Class]
|
||||
|
||||
# [DEF:SessionEvent:Class]
|
||||
class SessionEvent(Base):
|
||||
__tablename__ = "session_events"
|
||||
|
||||
session_event_id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
|
||||
session_id = Column(String, ForeignKey("dataset_review_sessions.session_id"), nullable=False)
|
||||
actor_user_id = Column(String, ForeignKey("users.id"), nullable=False)
|
||||
event_type = Column(String, nullable=False)
|
||||
event_summary = Column(Text, nullable=False)
|
||||
current_phase = Column(String, nullable=True)
|
||||
readiness_state = Column(String, nullable=True)
|
||||
event_details = Column(JSON, nullable=False, default=dict)
|
||||
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|
||||
|
||||
session = relationship("DatasetReviewSession", back_populates="events")
|
||||
actor = relationship("User")
|
||||
# [/DEF:SessionEvent:Class]
|
||||
|
||||
# [DEF:ArtifactType:Class]
|
||||
class ArtifactType(str, enum.Enum):
|
||||
DOCUMENTATION = "documentation"
|
||||
|
||||
Reference in New Issue
Block a user