41 lines
1.9 KiB
Python
41 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
import uuid
|
|
from typing import Any
|
|
|
|
from sqlalchemy import Boolean, ForeignKey, Index, JSON, String, Text, UniqueConstraint
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
|
|
from govoplan_core.db.base import Base, TimestampMixin
|
|
|
|
|
|
def new_uuid() -> str:
|
|
return str(uuid.uuid4())
|
|
|
|
|
|
class MailServerProfile(Base, TimestampMixin):
|
|
__tablename__ = "mail_server_profiles"
|
|
__table_args__ = (
|
|
UniqueConstraint("tenant_id", "slug", name="uq_mail_server_profiles_tenant_slug"),
|
|
Index("ix_mail_server_profiles_scope", "scope_type", "scope_id"),
|
|
)
|
|
|
|
id: Mapped[str] = mapped_column(String(36), primary_key=True, default=new_uuid)
|
|
tenant_id: Mapped[str | None] = mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), nullable=True, index=True)
|
|
scope_type: Mapped[str] = mapped_column(String(20), default="tenant", nullable=False, index=True)
|
|
scope_id: Mapped[str | None] = mapped_column(String(36), nullable=True, index=True)
|
|
name: Mapped[str] = mapped_column(String(255), nullable=False)
|
|
slug: Mapped[str] = mapped_column(String(100), nullable=False)
|
|
description: Mapped[str | None] = mapped_column(Text)
|
|
is_active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False, index=True)
|
|
smtp_config: Mapped[dict[str, Any]] = mapped_column(JSON, default=dict, nullable=False)
|
|
smtp_password_encrypted: Mapped[str | None] = mapped_column(Text)
|
|
imap_config: Mapped[dict[str, Any] | None] = mapped_column(JSON, nullable=True)
|
|
imap_password_encrypted: Mapped[str | None] = mapped_column(Text)
|
|
created_by_user_id: Mapped[str | None] = mapped_column(ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
|
|
updated_by_user_id: Mapped[str | None] = mapped_column(ForeignKey("users.id", ondelete="SET NULL"), nullable=True, index=True)
|
|
|
|
tenant: Mapped["Tenant"] = relationship()
|
|
|
|
|