import datetime from typing import Any import pydantic from pydantic import BaseModel, root_validator from campaigns.connectors.facebook.enums import ( AdCampaignObjective, AdCampaignPlatform, AdSetBillingEvent, AdSetFacebookPosition, AdSetInstagramPosition, AdSetOptimizationGoal, ObjectStatus, ) from campaigns.connectors.facebook.models import ( AdCreativeImageStorySpec, AdCreativeStorySpec, AdCreativeVideoStorySpec, AdSetCustomAudienceTargeting, AdSetTargetingAudienceTargeting, EngagementAudienceRule, TargetingGeolocations, TargetingInterestShort, ) # Campaign class UpdateCampaignArgs(BaseModel): name: str | None = None objective: AdCampaignObjective | None = None lifetime_budget: int | None = None # Adset class CreateAdsetArgs(pydantic.BaseModel): name: str | None optimization_goal: AdSetOptimizationGoal billing_event: AdSetBillingEvent targeting: AdSetTargetingAudienceTargeting | AdSetCustomAudienceTargeting | None start_time: datetime.datetime end_time: datetime.datetime class UpdateAdsetArgs(pydantic.BaseModel): name: str | None = None optimization_goal: AdSetOptimizationGoal | None = None start_time: datetime.datetime | None = None end_time: datetime.datetime | None = None status: ObjectStatus | None = None # AdCreative class CreateImageAdCreativeArgs(pydantic.BaseModel): name: str object_story_spec: AdCreativeImageStorySpec class CreateVideoAdCreativeArgs(pydantic.BaseModel): name: str object_story_spec: AdCreativeVideoStorySpec class CreatePostAdCreativeArgs(pydantic.BaseModel): name: str page_id: str post_id: str class AdCreativeArgs(pydantic.BaseModel): object_story_id: str | None = None # for fb boosted post object_story_spec: AdCreativeStorySpec | None = None # for image/video ads preview instagram_actor_id: str | None = None # ig user id for showing on ig platform @root_validator(pre=True) def check_object_story(cls, values: dict[str, Any]) -> dict[str, Any]: object_story_id = values.get("object_story_id") object_story_spec = values.get("object_story_spec") if object_story_id is None and object_story_spec is None: raise ValueError("object_story_id or object_story_spec must be set") return values class AdCreativeInstagramPostArgs(pydantic.BaseModel): # ig boosted post creative object_id: str # fb page external id instagram_user_id: str # ig business account external id source_instagram_media_id: str # ig post external id class GetAdPreviewArgs(pydantic.BaseModel): ad_format: str creative: AdCreativeArgs | AdCreativeInstagramPostArgs CreateAdCreativeArgs = AdCreativeArgs | AdCreativeInstagramPostArgs class GetAudienceSummaryArgs( pydantic.BaseModel ): # Copy of AdSetTargeting, AudienceArgs publisher_platforms: list[AdCampaignPlatform] | None = None facebook_positions: list[AdSetFacebookPosition] | None = None instagram_positions: list[AdSetInstagramPosition] | None = None geo_locations: TargetingGeolocations | None = None interests: list[TargetingInterestShort] | None = None genders: list[int] | None = None age_min: int | None = None age_max: int | None = None class CreateEngagementCustomAudienceArgs(pydantic.BaseModel): name: str rule: EngagementAudienceRule # Ad class UpdateAdArgs(pydantic.BaseModel): name: str | None = None status: ObjectStatus | None = None