Spaces:
Sleeping
Sleeping
| 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") | |