from collections import namedtuple from dataclasses import dataclass from datetime import date from typing import List, Optional GRASCampaignsQueryResult = namedtuple( "GRASCampaignsQueryResult", [ "campaign_id", "campaign_name", "bidding_type", "budget", "types", "genders", "ages", "artists", "start_date", "end_date", "spend", "accounts", "urls", "alt_artists_by_x", "alt_artists_by_comma", "alt_artists_by_plus", "territories", "linkfire_links", ], ) GRASAdSetsQueryResult = namedtuple( "GRASAdSetsQueryResult", [ "ad_group_id", "ad_group_name", "campaign_id", "start_date", "end_date", "bidding_type", "ages", "genders", "types", "spend", "urls", "territories", ], ) @dataclass class GRASCampaignNetworkType: main: str secondary: str @dataclass class GRASCampaignUrl: title: Optional[str] links: List[str] def __str__(self): return f"{self.title} – {self.links}" @dataclass class LinkfireLink: link_id: str link_url: str @dataclass class GoogleCampaignModel: id: str name: str bidding_type: Optional[str] types: List[GRASCampaignNetworkType] genders: List[str] ages: List[str] artists: List[str] links: List[GRASCampaignUrl] start_date: date end_date: Optional[date] territories: Optional[List[int]] spend: float budget: float account: int linkfire_links: Optional[List[LinkfireLink]] def __init__( self, id: str, name: str, bidding_type: Optional[str], genders: List[str], ages: List[str], types: List[GRASCampaignNetworkType], links: List[GRASCampaignUrl], start_date: date, end_date: Optional[date], territories: Optional[List[int]], spend: float, budget: float, account: int, linkfire_links: Optional[List[LinkfireLink]], ): self.id = id self.name = name self.bidding_type = bidding_type self.artists = [] self.genders = genders self.ages = ages self.types = types self.links = links self.start_date = start_date self.end_date = end_date self.territories = territories self.spend = spend self.budget = budget self.account = account self.linkfire_links = linkfire_links def __eq__(self, other): if isinstance(other, GoogleCampaignModel): return self.id == other.id return False def __str__(self): return ( f"Campaign: {self.id} – {self.name} ({self.types}) [{self.start_date} - {self.end_date}] " f"Artists:\n {self.artists}" ) @dataclass class GoogleAdSetModel: id: str name: str campaign_id: str start_date: date end_date: Optional[date] bidding_type: Optional[str] genders: List[str] ages: List[str] types: List[GRASCampaignNetworkType] links: List[GRASCampaignUrl] territories: Optional[List[int]] spend: float def __init__( self, id: str, name: str, campaign_id: str, start_date: date, end_date: Optional[date], bidding_type: Optional[str], genders: List[str], ages: List[str], types: List[GRASCampaignNetworkType], links: List[GRASCampaignUrl], territories: Optional[List[int]], spend: float, ): self.id = id self.name = name self.campaign_id = campaign_id self.start_date = start_date self.end_date = end_date self.bidding_type = bidding_type self.genders = genders self.ages = ages self.types = types self.links = links self.territories = territories self.spend = spend def __eq__(self, other): if isinstance(other, GoogleAdSetModel): return self.id == other.id return False