from typing import List from db import db from workers.base_worker import BaseWorker from models.campaign_ad import CampaignAd, CampaignAdLink, CampaignAdTerritory from campaigns.repositories.campaigns_repository import CampaignsRepository from campaigns.services.campaigns_history_service import CampaignHistoryService from utils.reporting.worker_logger import WorkerLogger from utils.snowflake.tiktok_data.models import TikTokAdSetModel from utils.snowflake.tiktok_data.utils import TikTokWorkerUtils class TikTokAdSetsWorker(BaseWorker): campaigns_repository: CampaignsRepository = CampaignsRepository() history_service: CampaignHistoryService = CampaignHistoryService() utils: TikTokWorkerUtils = TikTokWorkerUtils() logger: WorkerLogger = WorkerLogger() def should_log_exceptions(self): return True def execute(self, ad_sets: List[TikTokAdSetModel]): mapped_campaign_ads = [] for ad_set in ad_sets: tiktok_campaign = self.campaigns_repository.get_campaign_by_external_id(str(ad_set.campaign_id)) if not tiktok_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 = tiktok_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.planned_budget = ad_set.planned_budget ad_set_campaign.budget_spend = ad_set.budget_spend 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.default_genders ) ad_set_campaign.objective_id = self.utils.build_objective(ad_set.objective) platform = self.campaigns_repository.get_campaign_platform_by_id(self.utils.platform_id) if platform is not None: ad_set_campaign.platform = platform.name self.__update_campaign_ad_link(ad_set_campaign, ad_set.destination_link) self.__update_campaign_ad_territories(ad_set_campaign, self.utils.map_territories(ad_set.country_codes)) 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() @staticmethod def __update_campaign_ad_link(campaign_ad: CampaignAd, link: str): if campaign_ad.id: db.session.execute( CampaignAdLink.__table__.delete().where(CampaignAdLink.campaign_ad_id == campaign_ad.id) ) if link is not None: campaign_ad.links = [CampaignAdLink(link=link)] @staticmethod def __update_campaign_ad_territories(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]