import datetime import decimal from typing import Any from fansifter_common.adapters.db.types import ChoiceType from sqlalchemy import VARCHAR from sqlalchemy.dialects.postgresql import ARRAY, JSON from sqlalchemy.orm import Mapped, MappedAsDataclass, mapped_column from dmp.adapters.db import ReportingModel from dmp.fandata.enums import ( AcquisitionChannel, AgeRange, BirthMonth, DigitalServiceProvider, FanSegment, Gender, Genre, HeavyRotation, HeavyRotationTmp, SegmentCategory, ) class HasFansCountMixin(MappedAsDataclass): fans_count: Mapped[int] fans_count_7_days_ago: Mapped[int] fans_count_28_days_ago: Mapped[int] fans_count_6_month_ago: Mapped[int] fans_count_1_year_ago: Mapped[int] @property def fans_count_7_days_change(self) -> int: return self.fans_count - self.fans_count_7_days_ago @property def fans_count_28_days_change(self) -> int: return self.fans_count - self.fans_count_28_days_ago @property def fans_count_6_month_change(self) -> int: return self.fans_count - self.fans_count_6_month_ago @property def fans_count_1_year_change(self) -> int: return self.fans_count - self.fans_count_1_year_ago @property def fans_count_7_days_percent_change(self) -> float: if self.fans_count_7_days_ago != 0: return round( self.fans_count_7_days_change / self.fans_count_7_days_ago, 3, ) if self.fans_count == 0: return 0 else: return 1.000 @property def fans_count_28_days_percent_change(self) -> float: if self.fans_count_28_days_ago != 0: return round( self.fans_count_28_days_change / self.fans_count_28_days_ago, 3, ) if self.fans_count == 0: return 0 else: return 1.000 @property def fans_count_6_month_percent_change(self) -> float: if self.fans_count_6_month_ago != 0: return round( self.fans_count_6_month_change / self.fans_count_6_month_ago, 3, ) if self.fans_count == 0: return 0 else: return 1.000 @property def fans_count_1_year_percent_change(self) -> float: if self.fans_count_1_year_ago != 0: return round( self.fans_count_1_year_change / self.fans_count_1_year_ago, 3, ) if self.fans_count == 0: return 0 else: return 1.000 class AccountArtistFullFanDataAccessDbt(ReportingModel, kw_only=True): __tablename__ = "account_artist_full_fan_data_access_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) provider_vendor_id: Mapped[int | None] class ArtistMaxSpendDbt(ReportingModel, kw_only=True): __tablename__ = "artist_max_spend_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) max_spend: Mapped[decimal.Decimal] class AudienceFiltersCustomListAdCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "audience_filters_custom_list_ad_campaign_dbt" 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) custom_list_id: Mapped[str] = mapped_column(primary_key=True) dsp: Mapped[list[DigitalServiceProvider] | None] = mapped_column( ARRAY(ChoiceType(DigitalServiceProvider)) ) genre_list: Mapped[list[Genre] | None] = mapped_column(ARRAY(ChoiceType(Genre))) fan_language_list: Mapped[list[str] | None] = mapped_column(ARRAY(VARCHAR)) country_iso2: Mapped[str | None] region_code: Mapped[str | None] region: Mapped[str | None] city_id: Mapped[str | None] city_coordinates: Mapped[dict[str, Any] | None] = mapped_column(JSON) last_event_date: Mapped[datetime.datetime] birth_month: Mapped[BirthMonth | None] = mapped_column(ChoiceType(BirthMonth)) class AudienceFiltersCustomListEmailCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "audience_filters_custom_list_email_campaign_dbt" 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) custom_list_id: Mapped[str | None] = mapped_column(primary_key=True) dsp: Mapped[list[DigitalServiceProvider] | None] = mapped_column( ARRAY(ChoiceType(DigitalServiceProvider)) ) genre_list: Mapped[list[Genre] | None] = mapped_column(ARRAY(ChoiceType(Genre))) fan_language_list: Mapped[list[str] | None] = mapped_column(ARRAY(VARCHAR)) country_iso2: Mapped[str | None] region_code: Mapped[str | None] region: Mapped[str | None] city_id: Mapped[str | None] city_coordinates: Mapped[dict[str, Any] | None] = mapped_column(JSON) last_event_date: Mapped[datetime.datetime] last_email_event_date: Mapped[datetime.datetime | None] birth_month: Mapped[BirthMonth | None] = mapped_column(ChoiceType(BirthMonth)) class AudienceFiltersAdCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "audience_filters_ad_campaign_dbt" 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] = mapped_column(primary_key=True) dsp: Mapped[list[DigitalServiceProvider] | None] = mapped_column( ARRAY(ChoiceType(DigitalServiceProvider)) ) genre_list: Mapped[list[Genre] | None] = mapped_column(ARRAY(ChoiceType(Genre))) fan_language_list: Mapped[list[str] | None] = mapped_column(ARRAY(VARCHAR)) country_iso2: Mapped[str | None] region_code: Mapped[str | None] region: Mapped[str | None] city_id: Mapped[str | None] city_coordinates: Mapped[dict[str, Any] | None] = mapped_column(JSON) total_spend: Mapped[decimal.Decimal | None] last_event_date: Mapped[datetime.datetime] segment_name: Mapped[FanSegment | None] = mapped_column(ChoiceType(FanSegment)) heavy_rotation: Mapped[HeavyRotationTmp] = mapped_column( ChoiceType(HeavyRotationTmp) ) is_primary_fan: Mapped[bool] birth_month: Mapped[BirthMonth | None] = mapped_column(ChoiceType(BirthMonth)) class AudienceFiltersEmailCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "audience_filters_email_campaign_dbt" 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] = mapped_column(primary_key=True) dsp: Mapped[list[DigitalServiceProvider] | None] = mapped_column( ARRAY(ChoiceType(DigitalServiceProvider)) ) genre_list: Mapped[list[Genre] | None] = mapped_column(ARRAY(ChoiceType(Genre))) fan_language_list: Mapped[list[str] | None] = mapped_column(ARRAY(VARCHAR)) country_iso2: Mapped[str | None] region_code: Mapped[str | None] region: Mapped[str | None] city_id: Mapped[str | None] city_coordinates: Mapped[dict[str, Any] | None] = mapped_column(JSON) total_spend: Mapped[decimal.Decimal | None] last_event_date: Mapped[datetime.datetime] last_email_event_date: Mapped[datetime.datetime | None] segment_name: Mapped[FanSegment | None] = mapped_column(ChoiceType(FanSegment)) heavy_rotation: Mapped[HeavyRotationTmp] = mapped_column( ChoiceType(HeavyRotationTmp) ) is_primary_fan: Mapped[bool] birth_month: Mapped[BirthMonth | None] = mapped_column(ChoiceType(BirthMonth)) class AudienceFiltersTextCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "audience_filters_text_campaign_dbt" 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] = mapped_column(primary_key=True) dsp: Mapped[list[DigitalServiceProvider] | None] = mapped_column( ARRAY(ChoiceType(DigitalServiceProvider)) ) genre_list: Mapped[list[Genre] | None] = mapped_column(ARRAY(ChoiceType(Genre))) fan_language_list: Mapped[list[str] | None] = mapped_column(ARRAY(VARCHAR)) country_iso2: Mapped[str | None] region_code: Mapped[str | None] region: Mapped[str | None] city_id: Mapped[str | None] city_coordinates: Mapped[dict[str, Any] | None] = mapped_column(JSON) total_spend: Mapped[decimal.Decimal | None] last_event_date: Mapped[datetime.datetime] last_sms_event_date: Mapped[datetime.datetime | None] segment_name: Mapped[FanSegment | None] = mapped_column(ChoiceType(FanSegment)) heavy_rotation: Mapped[HeavyRotationTmp] = mapped_column( ChoiceType(HeavyRotationTmp) ) is_primary_fan: Mapped[bool] birth_month: Mapped[BirthMonth | None] = mapped_column(ChoiceType(BirthMonth)) class GlobalAudienceFiltersAdCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "global_audience_filters_artist_ad_campaign_dbt" fan_id: Mapped[str] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) dsp: Mapped[list[DigitalServiceProvider] | None] = mapped_column( ARRAY(ChoiceType(DigitalServiceProvider)) ) genre_list: Mapped[list[Genre] | None] = mapped_column(ARRAY(ChoiceType(Genre))) fan_language_list: Mapped[list[str] | None] = mapped_column(ARRAY(VARCHAR)) country_iso2: Mapped[str | None] region_code: Mapped[str | None] region: Mapped[str | None] city_id: Mapped[str | None] city_coordinates: Mapped[dict[str, Any] | None] = mapped_column(JSON) total_spend: Mapped[decimal.Decimal | None] last_event_date: Mapped[datetime.datetime] segment_name: Mapped[FanSegment | None] = mapped_column(ChoiceType(FanSegment)) heavy_rotation: Mapped[HeavyRotationTmp] = mapped_column( ChoiceType(HeavyRotationTmp) ) is_primary_fan: Mapped[bool] birth_month: Mapped[BirthMonth | None] = mapped_column(ChoiceType(BirthMonth)) class GlobalAudienceFiltersEmailCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "global_audience_filters_artist_email_campaign_dbt" fan_id: Mapped[str] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) dsp: Mapped[list[DigitalServiceProvider] | None] = mapped_column( ARRAY(ChoiceType(DigitalServiceProvider)) ) genre_list: Mapped[list[Genre] | None] = mapped_column(ARRAY(ChoiceType(Genre))) fan_language_list: Mapped[list[str] | None] = mapped_column(ARRAY(VARCHAR)) country_iso2: Mapped[str | None] region_code: Mapped[str | None] region: Mapped[str | None] city_id: Mapped[str | None] city_coordinates: Mapped[dict[str, Any] | None] = mapped_column(JSON) total_spend: Mapped[decimal.Decimal | None] last_event_date: Mapped[datetime.datetime] last_email_event_date: Mapped[datetime.datetime | None] segment_name: Mapped[FanSegment | None] = mapped_column(ChoiceType(FanSegment)) heavy_rotation: Mapped[HeavyRotationTmp] = mapped_column( ChoiceType(HeavyRotationTmp) ) is_primary_fan: Mapped[bool] birth_month: Mapped[BirthMonth | None] = mapped_column(ChoiceType(BirthMonth)) class GlobalAudienceFiltersTextCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "global_audience_filters_artist_text_campaign_dbt" fan_id: Mapped[str] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) dsp: Mapped[list[DigitalServiceProvider] | None] = mapped_column( ARRAY(ChoiceType(DigitalServiceProvider)) ) genre_list: Mapped[list[Genre] | None] = mapped_column(ARRAY(ChoiceType(Genre))) fan_language_list: Mapped[list[str] | None] = mapped_column(ARRAY(VARCHAR)) country_iso2: Mapped[str | None] region_code: Mapped[str | None] region: Mapped[str | None] city_id: Mapped[str | None] city_coordinates: Mapped[dict[str, Any] | None] = mapped_column(JSON) total_spend: Mapped[decimal.Decimal | None] last_event_date: Mapped[datetime.datetime] last_sms_event_date: Mapped[datetime.datetime | None] segment_name: Mapped[FanSegment | None] = mapped_column(ChoiceType(FanSegment)) heavy_rotation: Mapped[HeavyRotationTmp] = mapped_column( ChoiceType(HeavyRotationTmp) ) is_primary_fan: Mapped[bool] birth_month: Mapped[BirthMonth | None] = mapped_column(ChoiceType(BirthMonth)) class DimCountry(ReportingModel, kw_only=True): __tablename__ = "dim_country" country_code: Mapped[str] = mapped_column(primary_key=True) class FanLocationDbt(ReportingModel, kw_only=True): __tablename__ = "fan_location_dbt" fan_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] class FanPersonalDataDbt(ReportingModel, kw_only=True): __tablename__ = "fan_personal_data_dbt" fan_id: Mapped[str] = mapped_column(primary_key=True) fan_email: Mapped[str | None] = mapped_column(default=None) fan_mobile_phone: Mapped[str | None] = mapped_column(default=None) fan_first_name: Mapped[str | None] = mapped_column(default=None) fan_last_name: Mapped[str | None] = mapped_column(default=None) fan_country_iso2: Mapped[str | None] = mapped_column(default=None) fan_email_domain: Mapped[str | None] = mapped_column(default=None) class EmailDomainToISPMapping(ReportingModel, kw_only=True): __tablename__ = "email_domain_to_isp_mapping" domain: Mapped[str] = mapped_column(primary_key=True) isp: Mapped[str] = mapped_column(primary_key=True) class FansByArtistAccountAcquisitionChannelCountryDailyDbt( ReportingModel, kw_only=True ): __tablename__ = "fans_by_artist_account_acquisition_channel_country_daily_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) acquisition_channel: Mapped[AcquisitionChannel] = mapped_column( ChoiceType(AcquisitionChannel), primary_key=True ) acquired_at_date: Mapped[datetime.date] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class FansByArtistAccountAcquisitionChannelDailyDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_acquisition_channel_daily_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) acquisition_channel: Mapped[AcquisitionChannel] = mapped_column( ChoiceType(AcquisitionChannel), primary_key=True ) acquired_at_date: Mapped[datetime.date] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class FansByArtistAccountAcquisitionCountryDailyDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_acquisition_country_daily_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) acquired_at_date: Mapped[datetime.date] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class FansByArtistAccountAgeRangeCountryDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_age_range_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) age_range: Mapped[AgeRange] = mapped_column(ChoiceType(AgeRange), primary_key=True) fans_share: Mapped[decimal.Decimal] fans_count: Mapped[int] class FansByArtistAccountAgeRangeDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_age_range_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) age_range: Mapped[AgeRange] = mapped_column(ChoiceType(AgeRange), primary_key=True) fans_share: Mapped[decimal.Decimal] class FansByArtistAccountCategoryCountryDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_category_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) segment_fans_count: Mapped[int] category: Mapped[SegmentCategory] = mapped_column( ChoiceType(SegmentCategory), primary_key=True ) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_share: Mapped[float] fans_count: Mapped[int] class QaFansByArtistAccountCategoryCountryDbt(ReportingModel, kw_only=True): __tablename__ = "qa_fans_by_artist_account_category_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) segment_fans_count: Mapped[int] category: Mapped[SegmentCategory] = mapped_column( ChoiceType(SegmentCategory), primary_key=True ) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_share: Mapped[float] fans_count: Mapped[int] class FansByArtistAccountCategoryDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_category_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) segment_fans_count: Mapped[int] category: Mapped[SegmentCategory] = mapped_column( ChoiceType(SegmentCategory), primary_key=True ) fans_share: Mapped[float] class QaFansByArtistAccountCategoryDbt(ReportingModel, kw_only=True): __tablename__ = "qa_fans_by_artist_account_category_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) segment_fans_count: Mapped[int] category: Mapped[SegmentCategory] = mapped_column( ChoiceType(SegmentCategory), primary_key=True ) fans_share: Mapped[float] class FansByArtistAccountCountryDbt(HasFansCountMixin, ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) global_participant_name: Mapped[str] country_iso2: Mapped[str] = mapped_column(primary_key=True) chartmetric_id: Mapped[int | None] email_consent_fans_count: Mapped[int] ad_consent_fans_count: Mapped[int] sms_consent_fans_count: Mapped[int] fans_share: Mapped[decimal.Decimal] engagement_benchmark: Mapped[int] streaming_fans_count: Mapped[int] engagement_ratio: Mapped[float] class FansByArtistAccountDbt(HasFansCountMixin, ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) global_participant_name: Mapped[str] chartmetric_id: Mapped[int | None] email_consent_fans_count: Mapped[int] ad_consent_fans_count: Mapped[int] sms_consent_fans_count: Mapped[int] engagement_benchmark: Mapped[int] engagement_ratio: Mapped[float] class FansByArtistAccountGenderCountryDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_gender_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) gender: Mapped[Gender] = mapped_column(ChoiceType(Gender), primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_count: Mapped[int] fans_share: Mapped[decimal.Decimal] class FansByArtistAccountGenderDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_gender_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) gender: Mapped[Gender] = mapped_column(ChoiceType(Gender), primary_key=True) fans_share: Mapped[decimal.Decimal] class FansByArtistAccountHeavyRotationCountryDailyDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_heavy_rotation_country_daily_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) heavy_rotation: Mapped[HeavyRotation] = mapped_column( ChoiceType(HeavyRotation), primary_key=True ) report_date: Mapped[datetime.date] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class FansByArtistAccountHeavyRotationCountryDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_heavy_rotation_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_count: Mapped[int] total_fans_count: Mapped[int] class FansByArtistAccountHeavyRotationDailyDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_heavy_rotation_daily_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) heavy_rotation: Mapped[HeavyRotation] = mapped_column( ChoiceType(HeavyRotation), primary_key=True ) report_date: Mapped[datetime.date] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class FansByArtistAccountHeavyRotationDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_heavy_rotation_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) fans_share: Mapped[decimal.Decimal] class FansByArtistAccountOtherArtistCountryDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_other_artist_country_dbt" vendor_id: Mapped[int] subaccount_id: Mapped[int] global_participant_id: Mapped[str] global_participant_id_listened_together: Mapped[str | None] country_iso2: Mapped[str] fans_count: Mapped[int] total_fans_count: Mapped[int] # column implement only for test purpose and do not have equivalent in db _id: Mapped[int] = mapped_column(primary_key=True, init=False) class FansByArtistAccountOtherArtistDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_other_artist_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) global_participant_id_listened_together: Mapped[str] = mapped_column( primary_key=True ) fans_share: Mapped[decimal.Decimal] class FansByArtistAccountSegmentCountryDailyDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_segment_country_daily_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) report_date: Mapped[datetime.date] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_count: Mapped[int] class QaFansByArtistAccountSegmentCountryDailyDbt(ReportingModel, kw_only=True): __tablename__ = "qa_fans_by_artist_account_segment_country_daily_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) report_date: Mapped[datetime.date] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_count: Mapped[int] class FansByArtistAccountSegmentCountryDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_segment_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_count: Mapped[int] class QaFansByArtistAccountSegmentCountryDbt(ReportingModel, kw_only=True): __tablename__ = "qa_fans_by_artist_account_segment_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_count: Mapped[int] class FansByArtistAccountSegmentDailyDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_segment_daily_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) report_date: Mapped[datetime.date] = mapped_column(primary_key=True) fans_count: Mapped[int] class QaFansByArtistAccountSegmentDailyDbt(ReportingModel, kw_only=True): __tablename__ = "qa_fans_by_artist_account_segment_daily_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) report_date: Mapped[datetime.date] = mapped_column(primary_key=True) fans_count: Mapped[int] class FansByArtistAccountSegmentDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_segment_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) fans_count: Mapped[int] class QaFansByArtistAccountSegmentDbt(ReportingModel, kw_only=True): __tablename__ = "qa_fans_by_artist_account_segment_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) fans_count: Mapped[int] class FansDataAvailabilityAgeRangeByArtistAccountCountryDbt( ReportingModel, kw_only=True ): __tablename__ = "fans_data_availability_age_range_by_artist_account_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) available_fans_count: Mapped[int] total_fans_count: Mapped[int] class FansDataAvailabilityAgeRangeByArtistAccountDbt(ReportingModel, kw_only=True): __tablename__ = "fans_data_availability_age_range_by_artist_account_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) available_fans_share: Mapped[decimal.Decimal] class FansDataAvailabilityCountryByArtistAccountDbt(ReportingModel, kw_only=True): __tablename__ = "fans_data_availability_country_by_artist_account_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) available_fans_share: Mapped[decimal.Decimal] class FansDataAvailabilityGenderByArtistAccountCountryDbt(ReportingModel, kw_only=True): __tablename__ = "fans_data_availability_gender_by_artist_account_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) available_fans_count: Mapped[int] total_fans_count: Mapped[int] class FansDataAvailabilityGenderByArtistAccountDbt(ReportingModel, kw_only=True): __tablename__ = "fans_data_availability_gender_by_artist_account_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) available_fans_share: Mapped[decimal.Decimal] class FansPresenceHeavyRotationByArtistAccountCountryDbt(ReportingModel, kw_only=True): __tablename__ = "fans_presence_heavy_rotation_by_artist_account_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) available_fans_count: Mapped[int] total_fans_count: Mapped[int] class FansPresenceHeavyRotationByArtistAccountDbt(ReportingModel, kw_only=True): __tablename__ = "fans_presence_heavy_rotation_by_artist_account_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) global_participant_id: Mapped[str] = mapped_column(primary_key=True) available_fans_share: Mapped[decimal.Decimal] class FansByCustomListAccountDbt(HasFansCountMixin, ReportingModel, kw_only=True): __tablename__ = "fans_by_custom_list_account_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) custom_list_id: Mapped[str | None] = mapped_column(primary_key=True) custom_list_name: Mapped[str | None] email_consent_fans_count: Mapped[int] ad_consent_fans_count: Mapped[int] class FansByCustomListAccountCountryDbt( HasFansCountMixin, ReportingModel, kw_only=True ): __tablename__ = "fans_by_custom_list_account_country_dbt" vendor_id: Mapped[int] = mapped_column(primary_key=True) subaccount_id: Mapped[int] = mapped_column(primary_key=True) custom_list_id: Mapped[str | None] = mapped_column(primary_key=True) custom_list_name: Mapped[str | None] country_iso2: Mapped[str] = mapped_column(primary_key=True) email_consent_fans_count: Mapped[int] ad_consent_fans_count: Mapped[int] class GlobalFansByArtistCategoryCountryDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_category_country_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) segment_fans_count: Mapped[int] category: Mapped[SegmentCategory] = mapped_column( ChoiceType(SegmentCategory), primary_key=True ) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_share: Mapped[float] fans_count: Mapped[int] class GlobalFansByArtistCategoryDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_category_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) segment_fans_count: Mapped[int] category: Mapped[SegmentCategory] = mapped_column( ChoiceType(SegmentCategory), primary_key=True ) fans_share: Mapped[float] class GlobalFansByArtistCountryDbt(HasFansCountMixin, ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_country_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) global_participant_name: Mapped[str] country_iso2: Mapped[str] = mapped_column(primary_key=True) chartmetric_id: Mapped[int | None] fans_share: Mapped[decimal.Decimal] email_consent_fans_count: Mapped[int] ad_consent_fans_count: Mapped[int] sms_consent_fans_count: Mapped[int] engagement_benchmark: Mapped[int] streaming_fans_count: Mapped[int] engagement_ratio: Mapped[float] class GlobalFansByArtistDbt(HasFansCountMixin, ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) global_participant_name: Mapped[str] chartmetric_id: Mapped[int | None] email_consent_fans_count: Mapped[int] ad_consent_fans_count: Mapped[int] sms_consent_fans_count: Mapped[int] engagement_benchmark: Mapped[int] engagement_ratio: Mapped[float] class GlobalFansByArtistOtherArtistCountryDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_other_artist_country_dbt" global_participant_id: Mapped[str] global_participant_id_listened_together: Mapped[str | None] country_iso2: Mapped[str] fans_count: Mapped[int] total_fans_count: Mapped[int] fan_share: Mapped[float] email_consent_fans_count: Mapped[int] # column implement only for test purpose and do not have equivalent in db _id: Mapped[int] = mapped_column(primary_key=True, init=False) class GlobalFansByArtistOtherArtistDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_other_artist_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) global_participant_id_listened_together: Mapped[str] = mapped_column( primary_key=True ) fans_share: Mapped[decimal.Decimal] class GlobalFansDataAvailabilityAgeRangeByArtistCountryDbt( ReportingModel, kw_only=True ): __tablename__ = "global_fans_data_availability_age_range_by_artist_country_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) available_fans_count: Mapped[int] total_fans_count: Mapped[int] class GlobalFansDataAvailabilityAgeRangeByArtistDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_data_availability_age_range_by_artist_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) available_fans_share: Mapped[decimal.Decimal] class GlobalFansDataAvailabilityCountryByArtistDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_data_availability_country_by_artist_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) available_fans_share: Mapped[decimal.Decimal] class GlobalFansDataAvailabilityGenderByArtistCountryDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_data_availability_gender_by_artist_country_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) available_fans_count: Mapped[int] total_fans_count: Mapped[int] class GlobalFansDataAvailabilityGenderByArtistDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_data_availability_gender_by_artist_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) available_fans_share: Mapped[decimal.Decimal] class GlobalFansPresenceHeavyRotationByArtistDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_presence_heavy_rotation_by_artist_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) available_fans_share: Mapped[decimal.Decimal] class GlobalFansPresenceHeavyRotationByArtistCountryDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_presence_heavy_rotation_by_artist_country_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) available_fans_count: Mapped[int] total_fans_count: Mapped[int] class GlobalFansByArtistHeavyRotationDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_heavy_rotation_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) fans_share: Mapped[decimal.Decimal] class GlobalFansByArtistHeavyRotationCountryDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_heavy_rotation_country_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_count: Mapped[int] total_fans_count: Mapped[int] class GlobalFansByArtistSegmentDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_segment_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) fans_count: Mapped[int] class GlobalFansByArtistSegmentCountryDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_segment_country_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_count: Mapped[int] class GlobalFansByArtistAcquisitionChannelDailyDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_acquisition_channel_daily_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) acquisition_channel: Mapped[AcquisitionChannel] = mapped_column( ChoiceType(AcquisitionChannel), primary_key=True ) acquired_at_date: Mapped[datetime.date] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class GlobalFansByArtistAcquisitionChannelCountryDailyDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_acquisition_channel_country_daily_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) acquisition_channel: Mapped[AcquisitionChannel] = mapped_column( ChoiceType(AcquisitionChannel), primary_key=True ) acquired_at_date: Mapped[datetime.date] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class GlobalFansByArtistHeavyRotationDailyDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_heavy_rotation_daily_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) heavy_rotation: Mapped[HeavyRotation] = mapped_column( ChoiceType(HeavyRotation), primary_key=True ) report_date: Mapped[datetime.date] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class GlobalFansByArtistHeavyRotationCountryDailyDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_heavy_rotation_country_daily_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) heavy_rotation: Mapped[HeavyRotation] = mapped_column( ChoiceType(HeavyRotation), primary_key=True ) report_date: Mapped[datetime.date] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class GlobalFansByArtistAgeRangeDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_age_range_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) age_range: Mapped[AgeRange] = mapped_column(ChoiceType(AgeRange), primary_key=True) fans_share: Mapped[decimal.Decimal] class GlobalFansByArtistAgeRangeCountryDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_age_range_country_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) age_range: Mapped[AgeRange] = mapped_column(ChoiceType(AgeRange), primary_key=True) fans_share: Mapped[decimal.Decimal] fans_count: Mapped[int] class GlobalFansByArtistGenderDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_gender_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) gender: Mapped[Gender] = mapped_column(ChoiceType(Gender), primary_key=True) fans_share: Mapped[decimal.Decimal] class GlobalFansByArtistGenderCountryDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_gender_country_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) gender: Mapped[Gender] = mapped_column(ChoiceType(Gender), primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) fans_count: Mapped[int] fans_share: Mapped[decimal.Decimal] class Profile(ReportingModel, kw_only=True): __tablename__ = "profile" id: Mapped[str] = mapped_column(primary_key=True) email: Mapped[str] class GlobalFansByArtisttSegmentCountryDailyDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_segment_country_daily_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) country_iso2: Mapped[str] = mapped_column(primary_key=True) report_date: Mapped[datetime.date] = mapped_column(primary_key=True) fans_count: Mapped[int] class FansifterTeamPersonalDataDbt(ReportingModel, kw_only=True): __tablename__ = "fansifter_team_personal_data_dbt" fan_id: Mapped[str] = mapped_column(primary_key=True) fan_email: Mapped[str | None] = mapped_column(default=None) fan_first_name: Mapped[str | None] = mapped_column(default=None) fan_last_name: Mapped[str | None] = mapped_column(default=None) class GlobalFansByArtistCategoryShareDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_category_share_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) category: Mapped[SegmentCategory] = mapped_column( ChoiceType(SegmentCategory), primary_key=True ) fans_per_segment: Mapped[int] = mapped_column(default=None) fans_per_segment_category: Mapped[int] = mapped_column(default=None) fans_share: Mapped[float] = mapped_column(default=None) class FansByArtistAccountCategoryShareDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_category_share_dbt" global_participant_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) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) category: Mapped[SegmentCategory] = mapped_column( ChoiceType(SegmentCategory), primary_key=True ) fans_per_segment: Mapped[int] = mapped_column(default=None) fans_per_segment_category: Mapped[int] = mapped_column(default=None) fans_share: Mapped[float] = mapped_column(default=None) class GlobalFansByArtistSegmentCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_segment_campaign_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) campaign: Mapped[str] = mapped_column(primary_key=True) total_participation: Mapped[int] = mapped_column(default=None) fans_share: Mapped[float] = mapped_column(default=None) class FansByArtistAccountSegmentCampaignDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_segment_campaign_dbt" global_participant_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) segment_name: Mapped[FanSegment] = mapped_column( ChoiceType(FanSegment), primary_key=True ) campaign: Mapped[str] = mapped_column(primary_key=True) total_participation: Mapped[int] = mapped_column(default=None) fans_share: Mapped[float] = mapped_column(default=None) class TwilioFanSubscriptionStatus(ReportingModel, kw_only=True): __tablename__ = "twilio_fan_subscription_status" fan_phone_number: Mapped[str] = mapped_column(primary_key=True) artist_phone_number: Mapped[str] = mapped_column(primary_key=True) channel: Mapped[str] = mapped_column(primary_key=True) fan_country: Mapped[str] fan_state: Mapped[str] fan_area_code: Mapped[str] subscription_status: Mapped[str] class FansByArtistAccountAcquisitionCampaignDailyDbt(ReportingModel, kw_only=True): __tablename__ = "fans_by_artist_account_acquisition_campaign_daily_dbt" global_participant_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) acquisition_channel: Mapped[AcquisitionChannel] = mapped_column( ChoiceType(AcquisitionChannel), primary_key=True ) acquisition_campaign_id: Mapped[str] = mapped_column(primary_key=True) acquisition_campaign: Mapped[str] campaign_url: Mapped[str] acquired_at_date: Mapped[datetime.date] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class GlobalFansByArtistAcquisitionCampaignDailyDbt(ReportingModel, kw_only=True): __tablename__ = "global_fans_by_artist_acquisition_campaign_daily_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) acquisition_channel: Mapped[AcquisitionChannel] = mapped_column( ChoiceType(AcquisitionChannel), primary_key=True ) acquisition_campaign_id: Mapped[str] = mapped_column(primary_key=True) acquisition_campaign: Mapped[str] campaign_url: Mapped[str] acquired_at_date: Mapped[datetime.date] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class FansByArtistAccountAcquisitionCampaignCountryDailyDbt( ReportingModel, kw_only=True ): __tablename__ = "fans_by_artist_account_acquisition_campaign_country_daily_dbt" global_participant_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) acquisition_channel: Mapped[AcquisitionChannel] = mapped_column( ChoiceType(AcquisitionChannel), primary_key=True ) acquisition_campaign_id: Mapped[str] = mapped_column(primary_key=True) acquisition_campaign: Mapped[str] campaign_url: Mapped[str] country_iso2: Mapped[str] acquired_at_date: Mapped[datetime.date] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int] class GlobalFansByArtistAcquisitionCampaignCountryDailyDbt( ReportingModel, kw_only=True ): __tablename__ = "global_fans_by_artist_acquisition_campaign_country_daily_dbt" global_participant_id: Mapped[str] = mapped_column(primary_key=True) acquisition_channel: Mapped[AcquisitionChannel] = mapped_column( ChoiceType(AcquisitionChannel), primary_key=True ) acquisition_campaign_id: Mapped[str] = mapped_column(primary_key=True) acquisition_campaign: Mapped[str] campaign_url: Mapped[str] acquired_at_date: Mapped[datetime.date] = mapped_column(primary_key=True) country_iso2: Mapped[str] = mapped_column(primary_key=True) daily_running_total_fans_count: Mapped[int]