From 29a3bf3989d0a8be006bb58e128fd7802a9a41ae Mon Sep 17 00:00:00 2001 From: Samir Boulahtit Date: Tue, 13 Jan 2026 20:37:41 +0100 Subject: [PATCH] fix: add values_callable to SQLAlchemy Enum columns Add _enum_values helper and values_callable parameter to Enum columns in message models to ensure proper enum value extraction for database operations. Co-Authored-By: Claude Opus 4.5 --- models/database/message.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/models/database/message.py b/models/database/message.py index 348dd906..2ed2fecc 100644 --- a/models/database/message.py +++ b/models/database/message.py @@ -48,6 +48,11 @@ class ParticipantType(str, enum.Enum): CUSTOMER = "customer" # Customer model +def _enum_values(enum_class): + """Extract enum values for SQLAlchemy Enum column.""" + return [e.value for e in enum_class] + + class Conversation(Base, TimestampMixin): """ Represents a threaded conversation between participants. @@ -62,7 +67,7 @@ class Conversation(Base, TimestampMixin): # Conversation type determines participant structure conversation_type = Column( - Enum(ConversationType), + Enum(ConversationType, values_callable=_enum_values), nullable=False, index=True, ) @@ -82,7 +87,7 @@ class Conversation(Base, TimestampMixin): # Status flags is_closed = Column(Boolean, default=False, nullable=False) closed_at = Column(DateTime, nullable=True) - closed_by_type = Column(Enum(ParticipantType), nullable=True) + closed_by_type = Column(Enum(ParticipantType, values_callable=_enum_values), nullable=True) closed_by_id = Column(Integer, nullable=True) # Last activity tracking for sorting @@ -135,7 +140,7 @@ class ConversationParticipant(Base, TimestampMixin): ) # Polymorphic participant reference - participant_type = Column(Enum(ParticipantType), nullable=False) + participant_type = Column(Enum(ParticipantType, values_callable=_enum_values), nullable=False) participant_id = Column(Integer, nullable=False, index=True) # For vendor participants, track which vendor they represent @@ -196,7 +201,7 @@ class Message(Base, TimestampMixin): ) # Polymorphic sender reference - sender_type = Column(Enum(ParticipantType), nullable=False) + sender_type = Column(Enum(ParticipantType, values_callable=_enum_values), nullable=False) sender_id = Column(Integer, nullable=False, index=True) # Message content @@ -208,7 +213,7 @@ class Message(Base, TimestampMixin): # Soft delete for moderation is_deleted = Column(Boolean, default=False, nullable=False) deleted_at = Column(DateTime, nullable=True) - deleted_by_type = Column(Enum(ParticipantType), nullable=True) + deleted_by_type = Column(Enum(ParticipantType, values_callable=_enum_values), nullable=True) deleted_by_id = Column(Integer, nullable=True) # Relationships