from __future__ import annotations from datetime import datetime from typing import Any, Literal from pydantic import BaseModel, ConfigDict, Field from govoplan_mail.backend.config import ImapConfig, SmtpConfig class MailSmtpTestRequest(SmtpConfig): """SMTP settings supplied directly from the WebUI mail settings form.""" class MailImapTestRequest(ImapConfig): """IMAP settings supplied directly from the WebUI mail settings form.""" enabled: bool = True MailProfileScope = Literal["system", "tenant", "user", "group", "campaign"] class MailCredentialPolicyPayload(BaseModel): model_config = ConfigDict(extra="forbid") inherit: bool | None = None allow_override: bool | None = None class MailProfilePolicyPayload(BaseModel): model_config = ConfigDict(extra="forbid") allowed_profile_ids: list[str] = Field(default_factory=list) allow_user_profiles: bool | None = None allow_group_profiles: bool | None = None allow_campaign_profiles: bool | None = None smtp_credentials: MailCredentialPolicyPayload = Field(default_factory=MailCredentialPolicyPayload) imap_credentials: MailCredentialPolicyPayload = Field(default_factory=MailCredentialPolicyPayload) whitelist: dict[str, list[str]] = Field(default_factory=dict) blacklist: dict[str, list[str]] = Field(default_factory=dict) class MailProfilePolicyUpdateRequest(BaseModel): model_config = ConfigDict(extra="forbid") policy: MailProfilePolicyPayload = Field(default_factory=MailProfilePolicyPayload) class MailProfilePolicyResponse(BaseModel): scope_type: MailProfileScope scope_id: str | None = None policy: dict[str, Any] effective_policy: dict[str, Any] | None = None class MailServerProfileCreateRequest(BaseModel): model_config = ConfigDict(extra="forbid") name: str = Field(min_length=1, max_length=255) slug: str | None = Field(default=None, max_length=100) description: str | None = None is_active: bool = True scope_type: MailProfileScope = "tenant" scope_id: str | None = None smtp: SmtpConfig imap: ImapConfig | None = None class MailServerProfileUpdateRequest(BaseModel): model_config = ConfigDict(extra="forbid") name: str | None = Field(default=None, max_length=255) slug: str | None = Field(default=None, max_length=100) description: str | None = None is_active: bool | None = None smtp: SmtpConfig | None = None imap: ImapConfig | None = None clear_imap: bool = False class MailServerProfileResponse(BaseModel): id: str tenant_id: str | None = None scope_type: MailProfileScope = "tenant" scope_id: str | None = None name: str slug: str description: str | None = None is_active: bool smtp: dict[str, Any] imap: dict[str, Any] | None = None smtp_password_configured: bool = False imap_password_configured: bool = False created_at: datetime updated_at: datetime class MailServerProfileListResponse(BaseModel): profiles: list[MailServerProfileResponse] = Field(default_factory=list) class MailConnectionTestResponse(BaseModel): ok: bool protocol: Literal["smtp", "imap"] host: str | None = None port: int | None = None security: str | None = None message: str details: dict[str, Any] = Field(default_factory=dict) class MailImapFolderResponse(BaseModel): name: str flags: list[str] = Field(default_factory=list) class MailImapFolderListResponse(BaseModel): ok: bool protocol: Literal["imap"] = "imap" host: str | None = None port: int | None = None security: str | None = None message: str folders: list[MailImapFolderResponse] = Field(default_factory=list) detected_sent_folder: str | None = None details: dict[str, Any] = Field(default_factory=dict)