from campaigns.connectors.facebook.enums import ( AdSetFacebookPosition, AdSetInstagramPosition, ) from campaigns.meta.dtos import AdFormat from campaigns.meta.enums import AdFormatGroup, AssetPositionGroup, CampaignPlatform AD_FORMATS: list[AdFormat] = [ # FEED - Facebook AdFormat( id="DESKTOP_FEED_STANDARD", name="Facebook Feed", position=AdSetFacebookPosition.FEED, group=AdFormatGroup.FEED, position_group=AssetPositionGroup.RATIO_1_1, platform=CampaignPlatform.FACEBOOK, width=502, height=786, ), # AdFormat( # id="MARKETPLACE_DESKTOP", # name="Facebook Marketplace", # position=AdSetFacebookPosition.MARKETPLACE, # group=AdFormatGroup.FEED, # position_group=AssetPositionGroup.RATIO_1_1, # platform=CampaignPlatform.FACEBOOK, # width=220, # height=310, # ), AdFormat( id="MARKETPLACE_MOBILE", name="Facebook Marketplace", position=AdSetFacebookPosition.MARKETPLACE, group=AdFormatGroup.FEED, position_group=AssetPositionGroup.RATIO_1_1, platform=CampaignPlatform.FACEBOOK, width=200, height=360, ), AdFormat( id="MOBILE_FEED_STANDARD", name="Facebook Video Feeds Standard", # !TODO Check if this is actually Facebook Video feed position=AdSetFacebookPosition.FEED, group=AdFormatGroup.FEED, position_group=AssetPositionGroup.RATIO_1_1, platform=CampaignPlatform.FACEBOOK, width=320, height=560, ), # AdFormat( # id="RIGHT_COLUMN_STANDARD", # NOT POSSIBLE TO GET PREVIEW FOR VIDEO # name="Facebook Right Column", # position=AdSetFacebookPosition.RIGHT_HAND_COLUMN, # group=AdFormatGroup.FEED, # position_group=AssetPositionGroup.RATIO_1_1, # platform=CampaignPlatform.FACEBOOK, # style=AdFormatStyle(width=320, height=140) # ), # ! TODO MISSING Facebook Business Explore # FEED - Instagram AdFormat( id="INSTAGRAM_STANDARD", name="Instagram Feed", position=AdSetInstagramPosition.STREAM, group=AdFormatGroup.FEED, position_group=AssetPositionGroup.RATIO_1_1, platform=CampaignPlatform.INSTAGRAM, width=320, height=596, ), # AdFormat( # id="INSTAGRAM_EXPLORE_CONTEXTUAL", # name="Instagram Explore Contextual", # position=AdSetInstagramPosition.EXPLORE, # group=AdFormatGroup.FEED, # position_group=AssetPositionGroup.RATIO_1_1, # platform=CampaignPlatform.INSTAGRAM, # width=320, # height=596, # ), # AdFormat( # id="INSTAGRAM_EXPLORE_IMMERSIVE", # name="Instagram Explore Immersive", # position=AdSetInstagramPosition.EXPLORE, # group=AdFormatGroup.FEED, # position_group=AssetPositionGroup.RATIO_1_1, # platform=CampaignPlatform.INSTAGRAM, # width=320, # height=596, # ), AdFormat( id="INSTAGRAM_SHOP", name="Instagram Shop", position=AdSetInstagramPosition.SHOP, group=AdFormatGroup.FEED, position_group=AssetPositionGroup.RATIO_1_1, platform=CampaignPlatform.INSTAGRAM, width=320, height=580, ), # STORY AND REELS - Facebook AdFormat( id="FACEBOOK_STORY_MOBILE", name="Facebook Stories", position=AdSetFacebookPosition.STORY, group=AdFormatGroup.STORY, position_group=AssetPositionGroup.RATIO_9_16, platform=CampaignPlatform.FACEBOOK, width=320, height=570, ), AdFormat( id="FACEBOOK_REELS_MOBILE", name="Facebook Reels Mobile", position=AdSetFacebookPosition.FACEBOOK_REELS, group=AdFormatGroup.STORY, position_group=AssetPositionGroup.RATIO_9_16, platform=CampaignPlatform.FACEBOOK, width=320, height=570, ), AdFormat( id="FACEBOOK_REELS_POSTLOOP", name="Facebook Reels Postloop", position=AdSetFacebookPosition.FACEBOOK_REELS, group=AdFormatGroup.STORY, position_group=AssetPositionGroup.RATIO_9_16, platform=CampaignPlatform.FACEBOOK, width=320, height=590, # height=580 for video ), AdFormat( id="FACEBOOK_REELS_STICKER", name="Facebook Reels Sticker", position=AdSetFacebookPosition.FACEBOOK_REELS, group=AdFormatGroup.STORY, position_group=AssetPositionGroup.RATIO_9_16, platform=CampaignPlatform.FACEBOOK, width=320, height=580, ), # AdFormat( # id="FACEBOOK_REELS_BANNER_DESKTOP", # name="Facebook Reels Banner Desktop", # position=AdSetFacebookPosition.FACEBOOK_REELS, # group=AdFormatGroup.STORY, # position_group=AssetPositionGroup.RATIO_9_16, # platform=CampaignPlatform.FACEBOOK, # width=406, # height=720, # ), AdFormat( id="FACEBOOK_REELS_BANNER", name="Facebook Reels Banner", position=AdSetFacebookPosition.FACEBOOK_REELS, group=AdFormatGroup.STORY, position_group=AssetPositionGroup.RATIO_9_16, platform=CampaignPlatform.FACEBOOK, width=320, height=580, ), # AdFormat( # id="FACEBOOK_REELS_OVERLAY", # name="Facebook Reels Overlay", # position=AdSetFacebookPosition.FACEBOOK_REELS_OVERLAY, # group=AdFormatGroup.STORY, # position_group=AssetPositionGroup.RATIO_9_16, # platform=CampaignPlatform.FACEBOOK, # width=320, # height=580, # ), # STORY AND REELS - Instagram AdFormat( id="INSTAGRAM_REELS", name="Instagram Reels", position=AdSetInstagramPosition.REELS, group=AdFormatGroup.STORY, position_group=AssetPositionGroup.RATIO_9_16, platform=CampaignPlatform.INSTAGRAM, width=320, height=567, ), AdFormat( id="INSTAGRAM_STORY", name="Instagram Stories", position=AdSetInstagramPosition.STREAM, group=AdFormatGroup.STORY, position_group=AssetPositionGroup.RATIO_9_16, platform=CampaignPlatform.INSTAGRAM, width=320, height=567, ), # OTHER - Facebook AdFormat( id="INSTREAM_VIDEO_DESKTOP", name="Facebook In-stream Videos", position=AdSetFacebookPosition.INSTREAM_VIDEO, group=AdFormatGroup.OTHER, position_group=AssetPositionGroup.RATIO_9_16, # !TODO check the required ratio platform=CampaignPlatform.FACEBOOK, width=500, height=900, ), AdFormat( id="INSTANT_ARTICLE_STANDARD", name="Facebook Instant Articles", position=AdSetFacebookPosition.INSTANT_ARTICLE, group=AdFormatGroup.OTHER, position_group=AssetPositionGroup.RATIO_9_16, # !TODO check the required ratio platform=CampaignPlatform.FACEBOOK, width=320, height=580, ), ] class AdFormatRepository: def __init__(self) -> None: self.formats = AD_FORMATS def all(self) -> list[AdFormat]: return self.formats def get_or_none(self, ident: str) -> AdFormat | None: ad_formats = [ad_format for ad_format in self.formats if ad_format.id == ident] if not ad_formats: return None return ad_formats[0] def find_by_position_groups_and_platforms( self, position_groups: list[AssetPositionGroup], platforms: list[CampaignPlatform], ) -> list[AdFormat]: return [ ad_format for ad_format in self.formats if ad_format.platform in platforms and ad_format.position_group in position_groups ]