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 <noreply@anthropic.com>
This commit is contained in:
2026-01-13 20:37:41 +01:00
parent 44832b3fc9
commit 29a3bf3989

View File

@@ -48,6 +48,11 @@ class ParticipantType(str, enum.Enum):
CUSTOMER = "customer" # Customer model 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): class Conversation(Base, TimestampMixin):
""" """
Represents a threaded conversation between participants. Represents a threaded conversation between participants.
@@ -62,7 +67,7 @@ class Conversation(Base, TimestampMixin):
# Conversation type determines participant structure # Conversation type determines participant structure
conversation_type = Column( conversation_type = Column(
Enum(ConversationType), Enum(ConversationType, values_callable=_enum_values),
nullable=False, nullable=False,
index=True, index=True,
) )
@@ -82,7 +87,7 @@ class Conversation(Base, TimestampMixin):
# Status flags # Status flags
is_closed = Column(Boolean, default=False, nullable=False) is_closed = Column(Boolean, default=False, nullable=False)
closed_at = Column(DateTime, nullable=True) 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) closed_by_id = Column(Integer, nullable=True)
# Last activity tracking for sorting # Last activity tracking for sorting
@@ -135,7 +140,7 @@ class ConversationParticipant(Base, TimestampMixin):
) )
# Polymorphic participant reference # 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) participant_id = Column(Integer, nullable=False, index=True)
# For vendor participants, track which vendor they represent # For vendor participants, track which vendor they represent
@@ -196,7 +201,7 @@ class Message(Base, TimestampMixin):
) )
# Polymorphic sender reference # 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) sender_id = Column(Integer, nullable=False, index=True)
# Message content # Message content
@@ -208,7 +213,7 @@ class Message(Base, TimestampMixin):
# Soft delete for moderation # Soft delete for moderation
is_deleted = Column(Boolean, default=False, nullable=False) is_deleted = Column(Boolean, default=False, nullable=False)
deleted_at = Column(DateTime, nullable=True) 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) deleted_by_id = Column(Integer, nullable=True)
# Relationships # Relationships