89 lines
2.7 KiB
Python
89 lines
2.7 KiB
Python
"""
|
|
Email configuration data transfer objects for type-safe email operations.
|
|
"""
|
|
|
|
from dataclasses import dataclass, field
|
|
from typing import Optional, Dict, Any, List
|
|
from enum import Enum
|
|
|
|
|
|
class EmailTemplate(Enum):
|
|
"""Email template constants."""
|
|
|
|
BRANDED_BASE = "emails/email_template.html"
|
|
INTERVIEW_INVITATION = "emails/interview_invitation.html"
|
|
INTERVIEW_INVITATION_ALT = "interviews/email/interview_invitation.html"
|
|
AGENCY_WELCOME = "recruitment/emails/agency_welcome.html"
|
|
ASSIGNMENT_NOTIFICATION = "recruitment/emails/assignment_notification.html"
|
|
JOB_REMINDER = "emails/job_reminder.html"
|
|
REJECTION_SCREENING = "emails/rejection_screening_draft.html"
|
|
|
|
|
|
class EmailPriority(Enum):
|
|
"""Email priority levels for queue management."""
|
|
|
|
LOW = "low"
|
|
NORMAL = "normal"
|
|
HIGH = "high"
|
|
URGENT = "urgent"
|
|
|
|
|
|
@dataclass
|
|
class EmailConfig:
|
|
"""Configuration for sending a single email."""
|
|
|
|
to_email: str
|
|
subject: str
|
|
template_name: Optional[str] = None
|
|
context: Dict[str, Any] = field(default_factory=dict)
|
|
html_content: Optional[str] = None
|
|
attachments: List = field(default_factory=list)
|
|
sender: Optional[Any] = None
|
|
job: Optional[Any] = None
|
|
priority: EmailPriority = EmailPriority.NORMAL
|
|
cc_emails: List[str] = field(default_factory=list)
|
|
bcc_emails: List[str] = field(default_factory=list)
|
|
reply_to: Optional[str] = None
|
|
|
|
def __post_init__(self):
|
|
"""Validate email configuration."""
|
|
if not self.to_email:
|
|
raise ValueError("to_email is required")
|
|
if not self.subject:
|
|
raise ValueError("subject is required")
|
|
if not self.template_name and not self.html_content:
|
|
raise ValueError("Either template_name or html_content must be provided")
|
|
|
|
|
|
@dataclass
|
|
class BulkEmailConfig:
|
|
"""Configuration for bulk email sending."""
|
|
|
|
subject: str
|
|
template_name: Optional[str] = None
|
|
recipients_data: List[Dict[str, Any]] = field(default_factory=list)
|
|
attachments: List = field(default_factory=list)
|
|
sender: Optional[Any] = None
|
|
job: Optional[Any] = None
|
|
priority: EmailPriority = EmailPriority.NORMAL
|
|
async_send: bool = True
|
|
|
|
def __post_init__(self):
|
|
"""Validate bulk email configuration."""
|
|
if not self.subject:
|
|
raise ValueError("subject is required")
|
|
if not self.recipients_data:
|
|
raise ValueError("recipients_data cannot be empty")
|
|
|
|
|
|
@dataclass
|
|
class EmailResult:
|
|
"""Result of email sending operation."""
|
|
|
|
success: bool
|
|
message: str
|
|
recipient_count: int = 0
|
|
error_details: Optional[str] = None
|
|
task_id: Optional[str] = None
|
|
async_operation: bool = False
|