from typing import List from models import Campaign from campaigns.schemas import CampaignNameGenerateSchema from projects.repositories.projects_repository import ProjectsRepository from campaigns.repositories.campaigns_repository import CampaignsRepository from services.territory.territories_repository import TerritoriesRepository from artists.repositories.artist_repository import ArtistRepository CAMPAIGN_GOAL_MAP = { "Acquisition": "AW", "Consumption": "DR", "Engagement": "EN" } TERRITORY_SUBSTITUTE = { "GB": "UK", "GLBL": "Global" } GENDERS_MAP = { 1: "M", 2: "F", 3: "NB" } DELIMITER = "_" class CampaignsNameGeneratorService: projects_repository = ProjectsRepository() campaigns_repository = CampaignsRepository() territories_repository = TerritoriesRepository() artist_repository = ArtistRepository() @staticmethod def join(list_of_obj) -> str: return "/".join(list_of_obj) def generate_campaign_name_str( self, media_plan_id: int, params: CampaignNameGenerateSchema ) -> str: """ Generate a campaign name based on the given parameters. """ data_for_name = self.projects_repository.get_name_autogeneration_info(media_plan_id) if data_for_name.country == 'UK': return self.build_UK_campaign_name( project_id=data_for_name.project_id, project_code=data_for_name.gras_project_code, release_name=data_for_name.release_name, release_type=data_for_name.release_type_name, label_abbreviation=data_for_name.abbreviation, params=params ) else: return self.build_default_campaign_name( params.campaignType, params.platforms ) def build_default_campaign_name(self, campaign_type_id: int, platforms_ids: List[int]): template = "{campaign_type} | {platforms}" if not campaign_type_id and not platforms_ids: return None campaign_type = "" if campaign_type_id is not None: campaign_type = self.campaigns_repository.get_campaign_type_by_id(campaign_type_id) campaign_type = campaign_type.name platforms = "" if platforms_ids and len(platforms_ids) > 2: platforms = 'Various Platforms' elif platforms_ids: platforms = self.campaigns_repository.get_campaign_platforms_by_ids(platforms_ids) platforms = ', '.join([platform.name for platform in platforms]) return template.format( campaign_type=campaign_type, platforms=platforms ) def build_UK_campaign_name( self, project_id, project_code, release_name, release_type, label_abbreviation, params: CampaignNameGenerateSchema ) -> str: territories_codes = "Territory" if params.territories: territories = self.territories_repository.get_territories_by_ids(params.territories) territories_codes = self.join( [ TERRITORY_SUBSTITUTE[territory.code] if territory.code in TERRITORY_SUBSTITUTE.keys() else territory.code for territory in territories ] ) objective = "Objective" if params.objective: campaign_goal = self.campaigns_repository.get_campaign_goal_by_objective_id(params.objective) objective = CAMPAIGN_GOAL_MAP.get(campaign_goal.name, "Objective") start_day = "StartDay" start_month = "StartMonth" if params.startDate: start_day = params.startDate.strftime("%d") start_month = params.startDate.strftime("%b") artists_names = "ArtistName" artists = self.artist_repository.get_locked_primary_artists_for_project_id(project_id) if artists: artists_names = self.join([artist.name for artist in artists]) platforms_names = "Platform" if params.platforms: platforms = self.campaigns_repository.get_campaign_platforms_by_ids(params.platforms) platforms_names = self.join([platform.name for platform in platforms]) gender = "Gender" if params.genders: gender = self.join( [ GENDERS_MAP[gender_item if isinstance(gender_item, int) else gender_item.id] for gender_item in params.genders ] ) age = "Age" if params.lowerAge is not None or params.higherAge is not None: age = "{}-{}".format( params.lowerAge if params.lowerAge is not None else "YY", params.higherAge if params.higherAge is not None else "YY" ) data_list = [ project_code, label_abbreviation, artists_names, release_type if release_type else "ReleaseType", release_name if release_name else "ReleaseName", platforms_names, objective, start_day, start_month, gender, age, params.audienceNotes if params.audienceNotes else "Targeting", territories_codes, params.creativeDescription if params.creativeDescription else "CreativeDescription" ] return DELIMITER.join([parameter for parameter in data_list]) + DELIMITER def build_UK_campaign_name_by_campaign( self, project_id, project_code, release_name, release_type, label_abbreviation, campaign: Campaign, artists=None ) -> str: territories_codes = "Territory" if campaign.territories: territories = self.territories_repository.get_territories_by_ids( [terr.territory_id for terr in campaign.territories] ) territories_codes = self.join( [ TERRITORY_SUBSTITUTE[territory.code] if territory.code in TERRITORY_SUBSTITUTE.keys() else territory.code for territory in territories ] ) objective = "Objective" if campaign.objective_id: campaign_goal = self.campaigns_repository.get_campaign_goal_by_objective_id(campaign.objective_id) objective = CAMPAIGN_GOAL_MAP.get(campaign_goal.name, "Objective") start_day = "StartDay" start_month = "StartMonth" if campaign.start_date: start_day = campaign.start_date.strftime("%d") start_month = campaign.start_date.strftime("%b") artists_names = "ArtistName" if artists: artists_names = self.join([artist.name for artist in artists]) platforms_names = "Platform" if campaign.platforms: platforms_names = self.join([platform.name for platform in campaign.platforms]) gender = "Gender" if campaign.genders: gender = self.join( [GENDERS_MAP[gender_item.id] for gender_item in campaign.genders]) age = "Age" if campaign.age_range: age = "{}-{}".format( campaign.age_range.lower if campaign.age_range.lower is not None else "YY", campaign.age_range.upper if campaign.age_range.upper is not None else "YY" ) data_list = [ project_code, label_abbreviation, artists_names, release_type if release_type else "ReleaseType", release_name if release_name else "ReleaseName", platforms_names, objective, start_day, start_month, gender, age, campaign.audience_notes if campaign.audience_notes else "Targeting", territories_codes, campaign.creative_description if campaign.creative_description else "CreativeDescription" ] return DELIMITER.join([parameter for parameter in data_list]) + DELIMITER