from __future__ import annotations from dataclasses import dataclass from typing import Any from fansifter_common.auth.account import Account from fansifter_common.auth.identity import Identity from pydantic import BaseModel, computed_field from dmp.audiences.enums import AudienceSharePlatform, AudienceTarget from dmp.audiences.filters import AudienceFilters from dmp.audiences.models import Audience from dmp.audiences.types import FanDataListId from dmp.rosters.enums import FanDataListType class AudienceCriteria(BaseModel): vendor_id: int subaccount_id: int fandata_list_ids: list[FanDataListId] identity: Identity filters: AudienceFilters target: AudienceTarget excluded_countries: list[str] = [] is_global: bool = False @classmethod def from_audience( cls, audience: Audience, *, identity: Identity, is_global: bool ) -> AudienceCriteria: return cls.model_construct( fandata_list_ids=audience.fandata_list_ids, vendor_id=audience.vendor_id, subaccount_id=audience.subaccount_id, identity=identity, filters=audience.filters, target=audience.target, is_global=is_global, ) @property def account(self) -> Account: return Account(vendor_id=self.vendor_id, subaccount_id=self.subaccount_id) @computed_field def global_participant_ids(self) -> list[str]: return [ fandata_list.id for fandata_list in self.fandata_list_ids if fandata_list.type == FanDataListType.ARTIST ] @computed_field def custom_list_ids(self) -> list[str]: return [ fandata_list.id for fandata_list in self.fandata_list_ids if fandata_list.type == FanDataListType.CUSTOM_LIST ] def get_context(self) -> dict[str, Any]: return { "vendor_id": self.vendor_id, "subaccount_id": self.subaccount_id, "global_participant_ids": self.global_participant_ids, "custom_list_ids": self.custom_list_ids, "identity": self.identity, "target": self.target, "filters": self.filters, "excluded_countries": self.excluded_countries, "is_global": self.is_global, } @dataclass(frozen=True) class AudiencesQueryCriteria: ad_target_vendor_ids: list[int] ad_target_subaccount_ids: list[int] email_target_vendor_ids: list[int] email_target_subaccount_ids: list[int] text_target_vendor_ids: list[int] text_target_subaccount_ids: list[int] search: str | None global_participant_id: str | None custom_list_id: str | None audience_ids: list[str] | None target: AudienceTarget | None include_archived: bool = False class AudienceAdAccount(BaseModel): id: str name: str platform: str external_id: str is_connected: bool is_self_connected: bool custom_audience_tos_accepted: bool custom_audience_tos_url: str | None = None def model_post_init(self, __context: Any) -> None: if self.platform == AudienceSharePlatform.META: self.custom_audience_tos_url = ( f"https://business.facebook.com/ads/manage/customaudiences/tos/" f"?act={self.external_id.removeprefix('act_')}" )