from enum import Enum from typing import TYPE_CHECKING, Optional from sqlalchemy import Column, UniqueConstraint from sqlalchemy import Enum as SAEnum from sqlmodel import Field, Relationship, SQLModel if TYPE_CHECKING: from app.models.route import Route class MailEventType(str, Enum): ROUND_ANNOUNCED = "round_announced" ORDER_CONFIRMED = "order_confirmed" PAYMENT_CONFIRMED = "payment_confirmed" class MailTemplateBase(SQLModel): event_type: MailEventType = Field( sa_column=Column( SAEnum( MailEventType, name="mail_event_type", native_enum=False, values_callable=lambda enum_cls: [member.value for member in enum_cls], ), nullable=False, ), ) subject: str body_html: str class MailTemplate(MailTemplateBase, table=True): __tablename__ = "mail_template" __table_args__ = (UniqueConstraint("route_id", "event_type", name="uq_mail_template_route_event"),) id: Optional[int] = Field(default=None, primary_key=True) route_id: int = Field(foreign_key="route.id", ondelete="CASCADE") route: "Route" = Relationship(back_populates="mail_templates") class MailTemplateCreate(MailTemplateBase): route_id: int class MailTemplateUpdate(SQLModel): subject: Optional[str] = None body_html: Optional[str] = None class MailTemplatePublic(MailTemplateBase): id: int route_id: int