from enum import StrEnum from pydantic import BaseModel, Json from ows_text_campaigns.campaigns.enums import LinkType, MessageChannel class Gender(StrEnum): MALE = "MALE" FEMALE = "FEMALE" PREFER_NOT_TO_ANSWER = "PREFER_NOT_TO_ANSWER" NON_BINARY_OTHER = "NON_BINARY_OTHER" class AgeRange(StrEnum): FROM_13_TO_17 = "FROM_13_TO_17" FROM_18_TO_22 = "FROM_18_TO_22" FROM_23_TO_30 = "FROM_23_TO_30" FROM_31_TO_40 = "FROM_31_TO_40" FROM_41_TO_51 = "FROM_41_TO_51" FROM_52_TO_60 = "FROM_52_TO_60" FROM_61 = "FROM_61" class CampaignAnalyticsDemographicItem(BaseModel): label: AgeRange value: int class CampaignAnalyticsDemographicsDataItem(BaseModel): id: Gender total: int items: list[CampaignAnalyticsDemographicItem] class CampaignAnalyticsDemographics(BaseModel): available_fans_share: float | None = None data: list[CampaignAnalyticsDemographicsDataItem] class CampaignAnalyticsLocation(BaseModel): country_code: str sends: int clicks: int | None = None class CampaignLinkAnalytics(BaseModel): url: str link_type: LinkType total_sends: int total_clicks: int | None clickthrough_rate: float | None clickthrough_rate_change: float | None demographics: ( Json[CampaignAnalyticsDemographics] | CampaignAnalyticsDemographics | None ) locations: ( Json[list[CampaignAnalyticsLocation]] | list[CampaignAnalyticsLocation] | None ) class CampaignAnalytics(BaseModel): campaign_id: str clicks: int click_through_rate: float class CampaignDetailedAnalytics(BaseModel): campaign_id: str sends: int clicks: int | None click_through_rate: float | None unsubscribe_rate: float | None unsubscribe_rate_change: float | None delivery_rate: float | None delivery_rate_change: float | None delivery_failed_rate: float delivery_failed_rate_change: float | None locations: ( Json[list[CampaignAnalyticsLocation]] | list[CampaignAnalyticsLocation] | None ) class CampaignFanCountByCountryChannel(BaseModel): country: str channel: MessageChannel count: int