email_models.py•3.2 kB
"""
Pydantic models for email operations
"""
from pydantic import BaseModel, Field, EmailStr
from typing import Optional, List, Dict, Any
from datetime import datetime
from enum import Enum
class EmailCategory(str, Enum):
"""Email categories"""
WORK = "work"
PERSONAL = "personal"
JOB_APPLICATION = "job_application"
URGENT = "urgent"
SPAM = "spam"
NEWSLETTER = "newsletter"
SOCIAL = "social"
FINANCIAL = "financial"
OTHER = "other"
class EmailPriority(str, Enum):
"""Email priority levels"""
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
URGENT = "urgent"
class EmailStatus(str, Enum):
"""Email processing status"""
UNREAD = "unread"
READ = "read"
ARCHIVED = "archived"
REPLIED = "replied"
FOLLOW_UP = "follow_up"
class Email(BaseModel):
"""Email data model"""
id: str = Field(..., description="Email ID")
thread_id: str = Field(..., description="Thread ID")
from_email: str = Field(..., description="Sender email")
from_name: Optional[str] = None
to: List[str] = Field(default_factory=list)
cc: List[str] = Field(default_factory=list)
bcc: List[str] = Field(default_factory=list)
subject: str = Field(..., description="Email subject")
body: str = Field(..., description="Email body")
snippet: Optional[str] = None
date: datetime = Field(..., description="Email date")
labels: List[str] = Field(default_factory=list)
category: Optional[EmailCategory] = None
priority: EmailPriority = EmailPriority.MEDIUM
status: EmailStatus = EmailStatus.UNREAD
has_attachments: bool = False
attachments: List[Dict[str, Any]] = Field(default_factory=list)
metadata: Dict[str, Any] = Field(default_factory=dict)
class EmailSummary(BaseModel):
"""Email summary for batch processing"""
total_emails: int
unread_count: int
by_category: Dict[str, int]
by_priority: Dict[str, int]
urgent_emails: List[Email]
action_required: List[Email]
top_senders: List[Dict[str, Any]]
period: str
generated_at: datetime = Field(default_factory=datetime.now)
class EmailFilter(BaseModel):
"""Email filter criteria"""
query: Optional[str] = None
from_email: Optional[str] = None
to_email: Optional[str] = None
subject_contains: Optional[str] = None
category: Optional[EmailCategory] = None
priority: Optional[EmailPriority] = None
has_attachment: Optional[bool] = None
is_unread: Optional[bool] = None
after_date: Optional[datetime] = None
before_date: Optional[datetime] = None
labels: Optional[List[str]] = None
max_results: int = 100
class EmailDraft(BaseModel):
"""Email draft for sending"""
to: List[EmailStr]
subject: str
body: str
cc: Optional[List[EmailStr]] = None
bcc: Optional[List[EmailStr]] = None
reply_to: Optional[str] = None
in_reply_to: Optional[str] = None
html: bool = False
attachments: Optional[List[str]] = None
class EmailAction(BaseModel):
"""Email action to perform"""
email_id: str
action: str # reply, forward, archive, delete, mark_spam, mark_read
data: Optional[Dict[str, Any]] = None