from typing import List from db import db from workers.base_worker import BaseWorker from utils.snowflake.google_data.models import GoogleAdSetModel from utils.snowflake.google_data.utils import GoogleWorkerUtils from campaigns.repositories.campaigns_repository import CampaignsRepository from models.campaign_ad import CampaignAd, CampaignAdLink, CampaignAdTerritory from utils.reporting.worker_logger import WorkerLogger class GoogleAdSetsWorker(BaseWorker): campaigns_repository: CampaignsRepository = CampaignsRepository() utils: GoogleWorkerUtils = GoogleWorkerUtils() logger: WorkerLogger = WorkerLogger() def execute(self, ad_sets: List[GoogleAdSetModel]): mapped_campaign_ads = [] for ad_set in ad_sets: google_campaign = self.campaigns_repository.get_campaign_by_external_id(ad_set.campaign_id) if not google_campaign: continue ad_set_campaign = ( db.session.query(CampaignAd).filter(CampaignAd.external_id == str(ad_set.id)).one_or_none() ) if not ad_set_campaign: ad_set_campaign = CampaignAd() ad_set_campaign.campaign_id = google_campaign.id ad_set_campaign.external_id = ad_set.id ad_set_campaign.name = ad_set.name ad_set_campaign.start_date = ad_set.start_date ad_set_campaign.end_date = ad_set.end_date ad_set_campaign.age_range = self.utils.build_age_range(ad_set.ages) ad_set_campaign.genders = self.campaigns_repository.get_campaign_genders_by_ids( self.utils.build_gender_ids(ad_set.genders) or self.utils.all_genders ) ad_set_campaign.objective_id = self.utils.build_objective(ad_set.bidding_type) ad_set_campaign.planned_budget = 0 # ?? ad_set_campaign.budget_spend = ad_set.spend _, platforms = self.utils.get_campaign_platforms(ad_set.types) ad_set_campaign.platform = ", ".join(platforms) self.__update_campaign_ad_link(ad_set_campaign, self.utils.build_campaign_links(ad_set.links)) self.__update_campaign_ad_territories(ad_set_campaign, self.utils.map_territories(ad_set.territories)) db.session.add(ad_set_campaign) db.session.flush() db.session.refresh(ad_set_campaign) mapped_campaign_ads.append(ad_set_campaign) db.session.commit() CampaignAd.index_models(mapped_campaign_ads) db.session.close() def __update_campaign_ad_link(self, campaign_ad: CampaignAd, links: List[str]): if campaign_ad.id: db.session.execute(CampaignAdLink.__table__.delete().where(CampaignAdLink.campaign_ad_id == campaign_ad.id)) campaign_ad.links = [CampaignAdLink(link=link) for link in links] def __update_campaign_ad_territories(self, campaign_ad: CampaignAd, territories: List[int]): if campaign_ad.id: db.session.execute( CampaignAdTerritory.__table__.delete().where(CampaignAdTerritory.campaign_ad_id == campaign_ad.id) ) campaign_ad.territories = [CampaignAdTerritory(territory_id=id) for id in territories]