from itertools import groupby from shared.schemas import CampaignPlatformsMetadata def safe_div(x, y): if not x or not y: return 0 return x / y class MediaPlanService: def calculate_estimated_impressions(self, campaign_budget_platforms): return sum([safe_div(platform.planned_budget, platform.ecpm) for platform in campaign_budget_platforms if platform.planned_budget]) * 1000 def calculate_budget(self, campaign_budget_platforms): return sum([platform.planned_budget for platform in campaign_budget_platforms if platform.planned_budget]) def map_platforms_project_metadata(self, campaign_budget_platforms): campaign_platforms = [] for platforms_per_campaign in campaign_budget_platforms: for platform in platforms_per_campaign.campaign_platforms: campaign_platforms.append( CampaignPlatformsMetadata( id=platform.get("id"), name=platform.get("name"), value=safe_div(platforms_per_campaign.planned_budget, platforms_per_campaign.platforms_count), ) ) campaign_platforms = sorted(campaign_platforms, key=lambda x: x.id) grouped_campaign_platforms = [] for key, value in groupby(campaign_platforms, key=lambda x: x.id): platforms = list(value) if not platforms: continue platform = platforms[0] grouped_campaign_platforms.append( CampaignPlatformsMetadata( id=platform.id, name=platform.name, value=sum([item.value for item in platforms]) ) ) return grouped_campaign_platforms