from datetime import datetime from fansifter_common.adapters.db.types import ChoiceType from fansifter_common.utils import timezone from sqlalchemy.orm import Mapped, mapped_column from dmp.adapters.db import ReportingModel from dmp.audiences.types import FanDataListId from dmp.fandata.enums import AcquisitionChannel from dmp.rosters.exceptions import FanDataListIdIsRequiredError class CrmCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "crm_campaign_id_dbt" id: Mapped[str] = mapped_column(primary_key=True) vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str | None] custom_list_id: Mapped[str | None] name: Mapped[str] url: Mapped[str | None] acquisition_channel: Mapped[AcquisitionChannel] = mapped_column( ChoiceType(AcquisitionChannel) ) created_at: Mapped[datetime] = mapped_column(default_factory=timezone.now) @property def fandata_list_id(self) -> FanDataListId: if self.global_participant_id is not None: return FanDataListId.from_artist_id(self.global_participant_id) elif self.custom_list_id is not None: return FanDataListId.from_custom_list_id(self.custom_list_id) else: raise FanDataListIdIsRequiredError class CrmCampaignIdFanDbt(ReportingModel, kw_only=True): __tablename__ = "crm_campaign_id_fan_dbt" id: Mapped[str] = mapped_column(primary_key=True) fan_id: Mapped[str] = mapped_column(primary_key=True) vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str | None] custom_list_id: Mapped[str | None]