from dataclasses import dataclass, field from pydantic import BaseModel from dmp.rosters.enums import FanDataListType class FanDataListDetail(BaseModel): name: str vendor_id: int | None subaccount_id: int | None global_participant_id: str | None chartmetric_artist_id: int | None custom_list_id: str | None fans_count: int fans_count_7_days_change: int fans_count_28_days_change: int fans_count_6_month_change: int fans_count_1_year_change: int fans_count_7_days_percent_change: float fans_count_28_days_percent_change: float fans_count_6_month_percent_change: float fans_count_1_year_percent_change: float spotify_monthly_listeners: int | None = None instagram_followers: int | None = None tiktok_followers: int | None = None spotify_followers: int | None = None facebook_followers: int | None = None youtube_followers: int | None = None twitter_followers: int | None = None soundcloud_followers: int | None = None deezer_followers: int | None = None engagement_benchmark: int | None engagement_ratio: float email_consent_fans_count: int ad_consent_fans_count: int sms_consent_fans_count: int | None class FanDataListItem(BaseModel): id: str name: str type: FanDataListType is_main_rep: bool | None = None @dataclass(kw_only=True) class FanDataListAccountCriteria: vendor_ids: list[int] subaccount_ids: list[int] global_vendor_ids: list[int] | None = None global_subaccount_ids: list[int] | None = None is_global: bool = field(init=False) def __post_init__(self) -> None: self.is_global = bool(self.global_vendor_ids) @property def non_global_vendor_ids(self) -> list[int]: return list(set(self.vendor_ids or []) - set(self.global_vendor_ids or [])) @property def non_global_subaccount_ids(self) -> list[int]: return list( set(self.subaccount_ids or []) - set(self.global_subaccount_ids or []) ) @dataclass(kw_only=True) class FanDataListCriteria(FanDataListAccountCriteria): search: str | None = None countries: list[str] | None = None exclude_local_reps: bool | None = None @dataclass(kw_only=True) class SearchFanDataListCriteria(FanDataListAccountCriteria): search: str | None = None exclude_local_reps: bool | None = None