""" Microsoft 365 tenant model for tracking M365 tenants. M365 tenants represent Microsoft 365 tenant configurations for clients including tenant IDs, domains, and CIPP integration. """ from typing import Optional from sqlalchemy import CHAR, ForeignKey, Index, String, Text from sqlalchemy.orm import Mapped, mapped_column from .base import Base, TimestampMixin, UUIDMixin class M365Tenant(Base, UUIDMixin, TimestampMixin): """ Microsoft 365 tenant model for tracking M365 configurations. Tracks Microsoft 365 tenant information including tenant IDs, domain names, admin contacts, and CIPP portal integration. Attributes: client_id: Reference to the client tenant_id: Microsoft tenant ID (UUID) tenant_name: Tenant name (e.g., "dataforth.com") default_domain: Default domain (e.g., "dataforthcorp.onmicrosoft.com") admin_email: Administrator email address cipp_name: Name in CIPP portal notes: Additional notes """ __tablename__ = "m365_tenants" # Foreign keys client_id: Mapped[Optional[str]] = mapped_column( CHAR(36), ForeignKey("clients.id", ondelete="CASCADE"), doc="Reference to the client" ) # Tenant identification tenant_id: Mapped[str] = mapped_column( CHAR(36), nullable=False, unique=True, doc="Microsoft tenant ID (UUID)" ) tenant_name: Mapped[Optional[str]] = mapped_column( String(255), doc="Tenant name (e.g., 'dataforth.com')" ) default_domain: Mapped[Optional[str]] = mapped_column( String(255), doc="Default domain (e.g., 'dataforthcorp.onmicrosoft.com')" ) # Contact information admin_email: Mapped[Optional[str]] = mapped_column( String(255), doc="Administrator email address" ) # CIPP integration cipp_name: Mapped[Optional[str]] = mapped_column( String(255), doc="Name in CIPP portal" ) # Notes notes: Mapped[Optional[str]] = mapped_column( Text, doc="Additional notes" ) # Indexes __table_args__ = ( Index("idx_m365_client", "client_id"), Index("idx_m365_tenant_id", "tenant_id"), ) def __repr__(self) -> str: """String representation of the M365 tenant.""" return f""