from sqlalchemy import Column, Integer, String, Text, DateTime, Enum, ForeignKey, JSON, Boolean from sqlalchemy.sql import func from sqlalchemy.orm import relationship from app.database import Base import enum class Tone(str, enum.Enum): neutral = "neutral" formal = "formal" friendly = "friendly" investor = "investor" pr_bold = "pr_bold" class ContentType(str, enum.Enum): press_release = "press_release" ir_letter = "ir_letter" investor_summary = "investor_summary" class DraftStatus(str, enum.Enum): draft = "draft" pending = "pending" approved = "approved" scheduled = "scheduled" sent = "sent" class Draft(Base): __tablename__ = "drafts" id = Column(Integer, primary_key=True, index=True) source_type = Column(String(20)) # pdf/url/text source_ref = Column(Text) # URL or filename raw_text = Column(Text) content_type = Column(Enum(ContentType), nullable=False) tone = Column(Enum(Tone), nullable=False, default=Tone.neutral) title = Column(String(300)) body_md = Column(Text) # Markdown status = Column(Enum(DraftStatus), nullable=False, default=DraftStatus.draft) created_at = Column(DateTime(timezone=True), server_default=func.now()) updated_at = Column(DateTime(timezone=True), onupdate=func.now()) # AB test subjects (A/B) subject_a = Column(String(300)) subject_b = Column(String(300)) # delivery options deliver_email_list = Column(Text) # comma-separated emails deliver_x = Column(Boolean, default=False) deliver_note = Column(Boolean, default=False) deliveries = relationship("Delivery", back_populates="draft") class DeliveryChannel(str, enum.Enum): email = "email" x = "x" note = "note" class Delivery(Base): __tablename__ = "deliveries" id = Column(Integer, primary_key=True) draft_id = Column(Integer, ForeignKey("drafts.id")) channel = Column(Enum(DeliveryChannel), nullable=False) payload = Column(JSON) result = Column(JSON) created_at = Column(DateTime(timezone=True), server_default=func.now()) draft = relationship("Draft", back_populates="deliveries")