from enum import Enum, auto from models.performance_breakdown_option import BreakdownOptions class Dimensions(Enum): COUNTRY = auto() AGE = auto() GENDER = auto() PLATFORM = auto() PROVIDER = auto() CATEGORY = auto() OBJECTIVE = auto() CAMPAIGN_TYPE = auto() ARTIST = auto() PROJECT = auto() CAMPAIGN = auto() AD_SET = auto() DAY = auto() WEEK = auto() CHARTWEEK = auto() MONTH = auto() PHASE = auto() # TODO: Check after API implementation LINKFIRE = auto() def dimension_to_group_by(self): return { Dimensions.COUNTRY: "region", Dimensions.AGE: "age_band", Dimensions.GENDER: "gender", Dimensions.PLATFORM: "platform", Dimensions.PROVIDER: "provider", Dimensions.CATEGORY: "category", Dimensions.OBJECTIVE: "objective", Dimensions.CAMPAIGN_TYPE: "sub_category", Dimensions.ARTIST: "artist", Dimensions.PROJECT: "project", Dimensions.CAMPAIGN: "campaign", Dimensions.AD_SET: "ad_set", Dimensions.DAY: "date", Dimensions.WEEK: "week", Dimensions.CHARTWEEK: "chartweek", Dimensions.MONTH: "month", Dimensions.PHASE: "phase", Dimensions.LINKFIRE: "link_url", }.get(self) def dimension_entity_id_path(self): return { Dimensions.CAMPAIGN: "campaign.campaign_id", Dimensions.PROJECT: "project.project_id", Dimensions.ARTIST: "artist.artist_id", Dimensions.PHASE: "phase.phase_id", # TODO: Check after API implementation Dimensions.LINKFIRE: "linkfire.link_id", }.get(self, None) def dimension_name_path(self): return "dimensions." + { Dimensions.COUNTRY: "region.country_name", Dimensions.AGE: "age_band", Dimensions.GENDER: "gender", Dimensions.PLATFORM: "platform", Dimensions.PROVIDER: "provider.provider_name", Dimensions.CATEGORY: "category.sub_category_name", Dimensions.OBJECTIVE: "objective.objective_name", Dimensions.CAMPAIGN_TYPE: "sub_category.sub_category_name", Dimensions.ARTIST: "artist.full_name", Dimensions.PROJECT: "project.project_name", Dimensions.CAMPAIGN: "campaign.campaign_name", Dimensions.AD_SET: "ad_set.ad_set_name", Dimensions.DAY: "date", Dimensions.WEEK: "week", Dimensions.CHARTWEEK: "chartweek", Dimensions.MONTH: "month", Dimensions.PHASE: "phase.phase_name", # TODO: Check after API implementation Dimensions.LINKFIRE: "linkfire.link_url", }.get(self) def dimension_dates_path(self): dimension = { Dimensions.PROJECT: "project", Dimensions.CAMPAIGN: "campaign", Dimensions.AD_SET: "ad_set", Dimensions.PHASE: "phase", # TODO: Check after API implementation }.get(self, None) if not dimension: return return "dimensions." + dimension @staticmethod def get_from_breakdown_option(breakdown: BreakdownOptions): return { BreakdownOptions.COUNTRIES: Dimensions.COUNTRY, BreakdownOptions.AGES: Dimensions.AGE, BreakdownOptions.GENDERS: Dimensions.GENDER, BreakdownOptions.PLATFORMS: Dimensions.PLATFORM, BreakdownOptions.PROVIDERS: Dimensions.PROVIDER, BreakdownOptions.CATEGORIES: Dimensions.CATEGORY, BreakdownOptions.OBJECTIVES: Dimensions.OBJECTIVE, BreakdownOptions.CAMPAIGN_TYPES: Dimensions.CAMPAIGN_TYPE, BreakdownOptions.ARTISTS: Dimensions.ARTIST, BreakdownOptions.PROJECTS: Dimensions.PROJECT, BreakdownOptions.CAMPAIGNS: Dimensions.CAMPAIGN, BreakdownOptions.ADSETS: Dimensions.AD_SET, BreakdownOptions.DAYS: Dimensions.DAY, BreakdownOptions.WEEKS: Dimensions.WEEK, BreakdownOptions.CHARTWEEKS: Dimensions.CHARTWEEK, BreakdownOptions.MONTH: Dimensions.MONTH, BreakdownOptions.LINKFIRE_LINK: Dimensions.LINKFIRE, }.get(breakdown)