# app/modules/prospecting/schemas/campaign.py """Pydantic schemas for campaign management.""" from datetime import datetime from pydantic import BaseModel, Field class CampaignTemplateCreate(BaseModel): """Schema for creating a campaign template.""" name: str = Field(..., max_length=255) lead_type: str = Field( ..., pattern="^(no_website|bad_website|gmail_only|security_issues|performance_issues|outdated_cms|general)$", ) channel: str = Field("email", pattern="^(email|letter|phone_script)$") language: str = Field("fr", max_length=5) subject_template: str | None = Field(None, max_length=500) body_template: str = Field(...) is_active: bool = True class CampaignTemplateUpdate(BaseModel): """Schema for updating a campaign template.""" name: str | None = Field(None, max_length=255) lead_type: str | None = None channel: str | None = None language: str | None = Field(None, max_length=5) subject_template: str | None = None body_template: str | None = None is_active: bool | None = None class CampaignTemplateResponse(BaseModel): """Schema for campaign template response.""" id: int name: str lead_type: str channel: str language: str subject_template: str | None = None body_template: str is_active: bool created_at: datetime updated_at: datetime class Config: from_attributes = True class CampaignSendCreate(BaseModel): """Schema for sending a campaign.""" template_id: int prospect_ids: list[int] = Field(..., min_length=1) class CampaignPreviewRequest(BaseModel): """Schema for previewing a rendered campaign.""" template_id: int prospect_id: int class CampaignPreviewResponse(BaseModel): """Schema for campaign preview response.""" subject: str | None = None body: str class CampaignSendResponse(BaseModel): """Schema for campaign send record response.""" id: int template_id: int | None = None prospect_id: int channel: str rendered_subject: str | None = None rendered_body: str | None = None status: str sent_at: datetime | None = None sent_by_user_id: int | None = None created_at: datetime class Config: from_attributes = True class CampaignSendListResponse(BaseModel): """List of campaign sends.""" items: list[CampaignSendResponse] total: int class CampaignTemplateDeleteResponse(BaseModel): """Response for template deletion.""" message: str