import uuid from enum import StrEnum from typing import TYPE_CHECKING from sqlalchemy import BigInteger, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from src import domain if TYPE_CHECKING: from . import ExternalChannel, creative, user class TargetChannelStatus(StrEnum): ACTIVE = 'active' INACTIVE = 'inactive' ARCHIVED = 'archived' class TargetChannel(domain.Base): telegram_id: Mapped[int] = mapped_column(BigInteger, unique=True, index=True) title: Mapped[str] username: Mapped[str | None] = mapped_column(index=True) status: Mapped[TargetChannelStatus] # Relationship with user user_id: Mapped[uuid.UUID] = mapped_column(ForeignKey('users.id'), index=True) user: Mapped['user.User'] = relationship(back_populates='target_channels') # M2M relationship with external channels external_channels: Mapped[list['ExternalChannel']] = relationship( secondary='target_channel_external_channels', back_populates='target_channels', ) creatives: Mapped[list['creative.Creative']] = relationship(back_populates='target_channel') @property def is_active(self) -> bool: return self.status == domain.TargetChannelStatus.ACTIVE @is_active.setter def is_active(self, value: bool) -> None: self.status = domain.TargetChannelStatus.ACTIVE if value else domain.TargetChannelStatus.INACTIVE