from dataclasses import dataclass, field from typing import Literal from fansifter_common.exceptions import Error from pydantic import BaseModel from email_campaigns.campaigns.enums import EmailCampaignStatus from email_campaigns.rosters.types import FanDataListId EmailCampaignCIFields: tuple[str, ...] = ("name",) EmailCampaignOrderBy = Literal[ "name.asc", "name.desc", "sendAt.asc", "sendAt.desc", "createdAt.asc", "createdAt.desc", "updatedAt.asc", "updatedAt.desc", "bounces.asc", "bounces.desc", "bounceRate.asc", "bounceRate.desc", "clicks.asc", "clicks.desc", "clickThroughRate.asc", "clickThroughRate.desc", "clickToOpenRate.asc", "clickToOpenRate.desc", "delivered.asc", "delivered.desc", "deliveredRate.asc", "deliveredRate.desc", "opens.asc", "opens.desc", "openRate.asc", "openRate.desc", "sends.asc", "sends.desc", "spamComplaints.asc", "spamComplaints.desc", "spamComplaintsRate.asc", "spamComplaintsRate.desc", "unsubscribes.asc", "unsubscribes.desc", "unsubscribeRate.asc", "unsubscribeRate.desc", "uniqueClicks.asc", "uniqueClicks.desc", "uniqueOpens.asc", "uniqueOpens.desc", ] @dataclass(kw_only=True) class EmailCampaignCriteria: search: str | None campaign_ids: set[str] | None vendor_ids: set[int] | None subaccount_ids: set[int] | None fandata_list_ids: set[FanDataListId] | None global_participant_ids: set[str] | None = field(init=False) custom_list_ids: set[str] | None = field(init=False) statuses: list[EmailCampaignStatus] | None audience_id: str | None = None def __post_init__(self) -> None: if self.fandata_list_ids is not None: self.global_participant_ids = set() self.custom_list_ids = set() for fandata_list_id in self.fandata_list_ids: if fandata_list_id.type == "ARTIST": self.global_participant_ids.add(fandata_list_id.id) elif fandata_list_id.type == "CUSTOM_LIST": self.custom_list_ids.add(fandata_list_id.id) @dataclass(kw_only=True) class EmailCampaignErrorSummary: audience_id: Error | None = None sender_name: Error | None = None subject: Error | None = None email_domain_id: Error | None = None email_username: Error | None = None html_content: Error | None = None type CampaignSearchContext = Literal["AUDIENCE"] class CampaignBatchProgress(BaseModel): campaign_id: str total_batch_size: int total_batch_offset: int