from datetime import date from campaign_ads.repository import CampaignAdsRepository from campaigns.repositories.campaigns_repository import CampaignsRepository from models import CampaignAd from campaign_ads.schemas import CampaignAdsQueryParams from services.exporter import ExportItem, CSVExporter from typing import List class CampaignAdsExporter: ads_repository = CampaignAdsRepository() campaigns_repository = CampaignsRepository() def export_campaign_ads_csv(self, campaign_uuid: str, params: CampaignAdsQueryParams) -> str: ads: List[CampaignAd] = self.ads_repository.get_filtered_campaign_ads(campaign_uuid, params) currency = self.campaigns_repository.get_currency(campaign_uuid) exporter = CSVExporter() for a in ads: export_item = ExportItem() export_item.add_item("Ad Set Name", 10, a.name) export_item.add_item("Remaining Budget", 20, f"{currency} {a.planned_budget}") remaining_days = max((a.end_date - date.today()).days + 1, 0) if a.end_date else 0 export_item.add_item("Remaining Days", 21, remaining_days) export_item.add_item("Start Date", 30, a.start_date) export_item.add_item("End Date", 40, a.fallback_end_date or "Ongoing") for index, t in enumerate(a.genders): gender_index = index + 1 export_item.add_item("Gender {}".format(gender_index), 50 + gender_index, t.name) export_item.add_item("Age Minimum", 60, a.age_range.lower) export_item.add_item("Age Maximum", 65, a.age_range.upper - 1) for index, t in enumerate(sorted(a.territories, key=lambda x: x.territory.name)): export_item.add_item("Country {}".format(index + 1), 160, t.territory.name) export_item.add_item("Platform", 400, a.platform) export_item.add_item("Objective", 500, a.objective_name) for index, x in enumerate(a.links): export_item.add_item("Destination {}".format(index + 1), 600, x.link) exporter.add_export_item(export_item) return exporter.export()