refactor(models): remove legacy db.session properties from Conversation (#41847)

This commit is contained in:
Kiveiru3 2026-09-07 03:43:14 +00:00 committed by GitHub
parent 4cb70b7421
commit e7d34f05ba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 14 additions and 53 deletions

View File

@ -1333,10 +1333,6 @@ class Conversation(Base):
return model_config
@property
def summary_or_query(self):
return self.summary_or_query_with_session(session=db.session())
def summary_or_query_with_session(self, *, session: Session) -> str:
if self.summary:
return self.summary
@ -1347,41 +1343,21 @@ class Conversation(Base):
else:
return ""
@property
def annotated(self) -> bool:
return self.annotated_with_session(session=db.session())
def annotated_with_session(self, *, session: Session) -> bool:
return (
session.scalar(select(func.count(MessageAnnotation.id)).where(MessageAnnotation.conversation_id == self.id))
or 0
) > 0
@property
def annotation(self) -> MessageAnnotation | None:
return self.annotation_with_session(session=db.session())
def annotation_with_session(self, *, session: Session) -> MessageAnnotation | None:
return session.scalar(select(MessageAnnotation).where(MessageAnnotation.conversation_id == self.id).limit(1))
@property
def message_count(self) -> int:
return self.message_count_with_session(session=db.session())
def message_count_with_session(self, *, session: Session) -> int:
return session.scalar(select(func.count(Message.id)).where(Message.conversation_id == self.id)) or 0
@property
def user_feedback_stats(self) -> dict[str, int]:
return self.user_feedback_stats_with_session(session=db.session())
def user_feedback_stats_with_session(self, *, session: Session) -> dict[str, int]:
return self._feedback_stats_with_session(session=session, from_source=FeedbackFromSource.USER)
@property
def admin_feedback_stats(self) -> dict[str, int]:
return self.admin_feedback_stats_with_session(session=db.session())
def admin_feedback_stats_with_session(self, *, session: Session) -> dict[str, int]:
return self._feedback_stats_with_session(session=session, from_source=FeedbackFromSource.ADMIN)
@ -1410,10 +1386,6 @@ class Conversation(Base):
return {"like": like, "dislike": dislike}
@property
def status_count(self):
return self.status_count_with_session(session=db.session())
def status_count_with_session(self, *, session: Session) -> dict[str, int] | None:
from models.workflow import WorkflowRun
@ -1468,10 +1440,6 @@ class Conversation(Base):
"paused": status_counts[WorkflowExecutionStatus.PAUSED],
}
@property
def first_message(self) -> Message | None:
return self.first_message_with_session(session=db.session())
def first_message_with_session(self, *, session: Session) -> Message | None:
return session.scalar(
select(Message).where(Message.conversation_id == self.id).order_by(Message.created_at.asc())
@ -1482,10 +1450,6 @@ class Conversation(Base):
with Session(db.engine, expire_on_commit=False) as session:
return session.scalar(select(App).where(App.id == self.app_id))
@property
def from_end_user_session_id(self) -> str | None:
return self.from_end_user_session_id_with_session(session=db.session())
def from_end_user_session_id_with_session(self, *, session: Session) -> str | None:
if self.from_end_user_id:
end_user = session.scalar(select(EndUser).where(EndUser.id == self.from_end_user_id))
@ -1494,10 +1458,6 @@ class Conversation(Base):
return None
@property
def from_account_name(self) -> str | None:
return self.from_account_name_with_session(session=db.session())
def from_account_name_with_session(self, *, session: Session) -> str | None:
if self.from_account_id:
account = session.scalar(select(Account).where(Account.id == self.from_account_id))

View File

@ -1,5 +1,5 @@
"""
Integration tests for Conversation.status_count and Site.generate_code model properties.
Integration tests for Conversation.status_count_with_session and Site.generate_code.
Migrated from unit_tests/models/test_app_models.py TestConversationStatusCount and
test_site_generate_code, replacing db.session.scalars mocks with real PostgreSQL queries.
@ -18,7 +18,7 @@ from models.workflow import Workflow, WorkflowRun, WorkflowRunTriggeredFrom, Wor
class TestConversationStatusCount:
"""Integration tests for Conversation.status_count property."""
"""Integration tests for Conversation.status_count_with_session."""
@pytest.fixture(autouse=True)
def _auto_rollback(self, db_session_with_containers: Session) -> Generator[None, None, None]:
@ -130,7 +130,7 @@ class TestConversationStatusCount:
app = self._create_app(db_session_with_containers, tenant_id, created_by)
conversation = self._create_conversation(db_session_with_containers, app)
result = conversation.status_count
result = conversation.status_count_with_session(session=db_session_with_containers)
assert result is None
@ -145,7 +145,7 @@ class TestConversationStatusCount:
conversation = self._create_conversation(db_session_with_containers, app)
self._create_message(db_session_with_containers, app, conversation, workflow_run_id=None)
result = conversation.status_count
result = conversation.status_count_with_session(session=db_session_with_containers)
assert result is None
@ -162,7 +162,7 @@ class TestConversationStatusCount:
)
self._create_message(db_session_with_containers, app, conversation, workflow_run_id=run.id)
result = conversation.status_count
result = conversation.status_count_with_session(session=db_session_with_containers)
assert result is not None
assert result["success"] == 1
@ -183,7 +183,7 @@ class TestConversationStatusCount:
)
self._create_message(db_session_with_containers, app, conversation, workflow_run_id=run.id)
result = conversation.status_count
result = conversation.status_count_with_session(session=db_session_with_containers)
assert result is not None
assert result["success"] == 0
@ -204,7 +204,7 @@ class TestConversationStatusCount:
)
self._create_message(db_session_with_containers, app, conversation, workflow_run_id=run.id)
result = conversation.status_count
result = conversation.status_count_with_session(session=db_session_with_containers)
assert result is not None
assert result["success"] == 0
@ -230,7 +230,7 @@ class TestConversationStatusCount:
run = self._create_workflow_run(db_session_with_containers, app, workflow, status, created_by)
self._create_message(db_session_with_containers, app, conversation, workflow_run_id=run.id)
result = conversation.status_count
result = conversation.status_count_with_session(session=db_session_with_containers)
assert result is not None
assert result["success"] == 1
@ -255,7 +255,7 @@ class TestConversationStatusCount:
# Message references that run but is in a conversation under app
self._create_message(db_session_with_containers, app, conversation, workflow_run_id=other_run.id)
result = conversation.status_count
result = conversation.status_count_with_session(session=db_session_with_containers)
# The run should be excluded because app_id filter doesn't match
assert result is not None

View File

@ -541,8 +541,9 @@ class TestConversationModel:
# Assert
assert conversation._inputs == inputs
def test_conversation_summary_or_query_with_summary(self):
"""Test summary_or_query property when summary exists."""
@pytest.mark.parametrize("sqlite_session", [(Conversation, Message)], indirect=True)
def test_conversation_summary_or_query_with_summary(self, sqlite_session: Session):
"""Test summary_or_query_with_session when summary exists."""
# Arrange
conversation = Conversation(
app_id=str(uuid4()),
@ -555,14 +556,14 @@ class TestConversationModel:
)
# Act
result = conversation.summary_or_query
result = conversation.summary_or_query_with_session(session=sqlite_session)
# Assert
assert result == "Test summary"
@pytest.mark.parametrize("sqlite_session", [(Conversation, Message)], indirect=True)
def test_conversation_summary_or_query_without_summary(self, sqlite_session: Session):
"""Test summary_or_query property when summary is empty."""
"""Test summary_or_query_with_session when summary is empty."""
# Arrange
conversation = Conversation(
app_id=str(uuid4()),