from typing import Optional, List from sqlalchemy import Boolean, ForeignKey, String from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, relationship class Base(DeclarativeBase): pass class MailServer(Base): __tablename__ = 'mail_server' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(100)) description: Mapped[Optional[str]] host: Mapped[str] = mapped_column(String(255)) port: Mapped[int] # TODO: do not store password in plain text in the db! Ideally nor the username. username: Mapped[str] = mapped_column(String(255)) password: Mapped[str] = mapped_column(String(255)) messages: Mapped[List['Message']] = relationship(back_populates='mail_server', cascade='all, delete-orphan') class ContactList(Base): __tablename__ = 'contact_list' id: Mapped[int] = mapped_column(primary_key=True) name: Mapped[str] = mapped_column(String(100)) description: Mapped[Optional[str]] is_live: Mapped[bool] = mapped_column(Boolean, default=False) short_name: Mapped[str] = mapped_column(String(20)) full_name: Mapped[str] = mapped_column(String(255)) email_address: Mapped[str] = mapped_column(String(255)) contact_lists_test: Mapped[List['Message']] = relationship(back_populates='contact_list', cascade='all, delete-orphan') contact_lists_live: Mapped[List['Message']] = relationship(back_populates='contact_list', cascade='all, delete-orphan') class Message(Base): __tablename__ = 'message' id: Mapped[int] = mapped_column(primary_key=True) description: Mapped[str] = mapped_column(String(255)) notes: Mapped[[Optional[str]]] is_complete: Mapped[bool] = mapped_column(Boolean, default=False) mail_server_id: Mapped[int] = mapped_column(ForeignKey('mail_server.id')) mail_server: Mapped['MailServer'] = relationship(back_populates='messages') test_contacts_id: Mapped[int] = mapped_column(ForeignKey('contact_list.id')) test_contacts: Mapped['ContactList'] = relationship(back_populates='contact_lists_test') live_contacts_id: Mapped[int] = mapped_column(ForeignKey('contact_list.id')) live_contacts: Mapped['ContactList'] = relationship(back_populates='contact_lists_live') sent: Mapped[Optional[str]] from_name: Mapped[str] = mapped_column(String(255)) from_address: Mapped[str] = mapped_column(String(255)) subject_line: Mapped[str] = mapped_column(String(255)) message_body: Mapped[str]