174 lines
5.0 KiB
Python
174 lines
5.0 KiB
Python
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)
|
|
|
|
class MailMailboxAttachmentResponse(BaseModel):
|
|
filename: str | None = None
|
|
content_type: str
|
|
size_bytes: int
|
|
|
|
|
|
class MailMailboxMessageSummaryResponse(BaseModel):
|
|
uid: str
|
|
folder: str
|
|
subject: str | None = None
|
|
from_header: str | None = None
|
|
to_header: str | None = None
|
|
cc_header: str | None = None
|
|
date: str | None = None
|
|
message_id: str | None = None
|
|
flags: list[str] = Field(default_factory=list)
|
|
size_bytes: int | None = None
|
|
body_preview: str | None = None
|
|
attachment_count: int = 0
|
|
|
|
|
|
class MailMailboxMessageDetailResponse(MailMailboxMessageSummaryResponse):
|
|
body_text: str | None = None
|
|
body_html: str | None = None
|
|
headers: dict[str, str] = Field(default_factory=dict)
|
|
attachments: list[MailMailboxAttachmentResponse] = Field(default_factory=list)
|
|
|
|
|
|
class MailMailboxMessageListResponse(BaseModel):
|
|
profile_id: str
|
|
folder: str
|
|
host: str | None = None
|
|
port: int | None = None
|
|
security: str | None = None
|
|
messages: list[MailMailboxMessageSummaryResponse] = Field(default_factory=list)
|
|
|
|
|
|
class MailMailboxMessageResponse(BaseModel):
|
|
profile_id: str
|
|
folder: str
|
|
host: str | None = None
|
|
port: int | None = None
|
|
security: str | None = None
|
|
message: MailMailboxMessageDetailResponse
|
|
|