from __future__ import annotations import enum from campaigns.connectors.facebook.enums import ( AdCampaignObjective, AdCampaignPlatform, AdSetOptimizationGoal, ) class FacebookConnectionStatus(enum.StrEnum): NOT_CONNECTED = "NOT_CONNECTED" SCOPES_MISSING = "SCOPES_MISSING" NO_PAGES = "NO_PAGES" INVALID = "INVALID" CONNECTED = "CONNECTED" class CampaignPlatform(enum.StrEnum): FACEBOOK = "FACEBOOK" INSTAGRAM = "INSTAGRAM" def to_ad_campaign_platform(self) -> AdCampaignPlatform: if self.value == self.FACEBOOK: return AdCampaignPlatform.FACEBOOK return AdCampaignPlatform.INSTAGRAM class CampaignSummaryId(enum.StrEnum): BASICS = "BASICS" SCHEDULE_AND_BUDGET = "SCHEDULE_AND_BUDGET" CREATIVE = "CREATIVE" AUDIENCE = "AUDIENCE" class CampaignObjective(enum.StrEnum): AWARENESS = "AWARENESS" ENGAGEMENT = "ENGAGEMENT" TRAFFIC = "TRAFFIC" def to_ad_campaign_objective( self, content_type: CampaignContentType ) -> AdCampaignObjective: if content_type == CampaignContentType.POST: if self.value in [self.AWARENESS, self.ENGAGEMENT]: return AdCampaignObjective.POST_ENGAGEMENT else: raise ValueError(f"Unsupported objective: {self.value}") else: raise ValueError(f"Unsupported content_type: {content_type}") def to_ad_set_optimization_goal( self, content_type: CampaignContentType ) -> AdSetOptimizationGoal: if content_type == CampaignContentType.POST: if self.value in [self.AWARENESS, self.ENGAGEMENT]: return AdSetOptimizationGoal.POST_ENGAGEMENT else: raise ValueError(f"Unsupported objective: {self.value}") else: raise ValueError(f"Unsupported content_type: {content_type}") class CampaignPlatformSelector(enum.StrEnum): FACEBOOK = CampaignPlatform.FACEBOOK INSTAGRAM = CampaignPlatform.INSTAGRAM BOTH = "BOTH" @classmethod def from_list( cls, platforms: list[CampaignPlatform] ) -> CampaignPlatformSelector | None: platform_set = set(platforms) if platform_set == { CampaignPlatform.FACEBOOK, CampaignPlatform.INSTAGRAM, }: return CampaignPlatformSelector.BOTH elif platform_set == {CampaignPlatform.FACEBOOK}: return CampaignPlatformSelector.FACEBOOK elif platform_set == {CampaignPlatform.INSTAGRAM}: return CampaignPlatformSelector.INSTAGRAM return None def to_list(self) -> list[CampaignPlatform]: if self.value == self.BOTH: return [ CampaignPlatform.FACEBOOK, CampaignPlatform.INSTAGRAM, ] elif self.value == self.FACEBOOK: return [CampaignPlatform.FACEBOOK] elif self.value == self.INSTAGRAM: return [CampaignPlatform.INSTAGRAM] return [] class AudienceGender(enum.StrEnum): MALE = "MALE" FEMALE = "FEMALE" def __str__(self) -> str: return self.value @property def int_value(self) -> int: if self.value == AudienceGender.MALE: return 1 elif self.value == AudienceGender.FEMALE: return 2 else: raise TypeError(f"Unsupported AudienceGender type: {self.value}") class AudienceGenderSelector(enum.StrEnum): MALE = AudienceGender.MALE FEMALE = AudienceGender.FEMALE ALL = "ALL" @classmethod def from_list(cls, genders: list[AudienceGender]) -> AudienceGenderSelector | None: gender_set = set(genders) if gender_set == { AudienceGender.MALE, AudienceGender.FEMALE, }: return AudienceGenderSelector.ALL elif gender_set == {AudienceGender.MALE}: return AudienceGenderSelector.MALE elif gender_set == {AudienceGender.FEMALE}: return AudienceGenderSelector.FEMALE return None def to_list(self) -> list[AudienceGender]: if self.value == self.ALL: return [ AudienceGender.MALE, AudienceGender.FEMALE, ] elif self.value == self.MALE: return [AudienceGender.MALE] elif self.value == self.FEMALE: return [AudienceGender.FEMALE] return [] class AdFormatGroup(enum.StrEnum): FEED = "FEED" STORY = "STORY" OTHER = "OTHER" class CampaignContentType(enum.StrEnum): IMAGE = "IMAGE" VIDEO = "VIDEO" POST = "POST" class CampaignLinkType(enum.StrEnum): WEBSITE = "WEBSITE" LANDING_PAGE = "LANDING_PAGE" class CampaignCallToAction(enum.StrEnum): LEARN_MORE = "LEARN_MORE" ORDER_NOW = "ORDER_NOW" SHOP_NOW = "SHOP_NOW" LISTEN_NOW = "LISTEN_NOW" WATCH_MORE = "WATCH_MORE" class AssetPositionGroup(enum.StrEnum): RATIO_1_1 = "RATIO_1_1" RATIO_9_16 = "RATIO_9_16"