"""Logic for retrieving top countries streams or downloads.""" from ddtrace import tracer from oto import response as oto_response from sound_recordings.logic import data_availability, permissions from sound_recordings.logic.store_outages import add_outage_error_to_stores from sound_recordings.models import top_countries as top_countries_model from sound_recordings.schemas.top_countries import ( TopCountriesDownloadsSchema, TopCountriesStreamsSchema, ) from sound_recordings.utils import store_availability from sound_recordings.validation.schema import schema_dump @tracer.wrap(name="get_top_countries_streams") def get_top_countries_streams( request_context, isrc, distributors, store_ids=[], start_date=None, end_date=None ): """Return top countries by streams for ISRC, given account type and ID. Args: request_context (RequestContext): RequestContext class isrc (str): ISRC of track to fetch downloads for distributors (list): List of distributors names store_ids (list): List of store ids to filter by start_date (datetime.date): Start date end_date (datetime.date): End date Returns: oto.response.Response with top countries payload """ # an empty response, but with sources response_body = { "isrc": isrc, "top_countries": [], "sources": add_outage_error_to_stores(store_availability.get_sources()), } permissions_filter = permissions.get_permissions_filter(request_context) if not (start_date and end_date): start_date, end_date = data_availability.get_date_range( data_availability.HIGHWATERMARK_DATE, days=28 ) top_countries_aggregate_streams = ( top_countries_model.get_top_countries_aggregate_streams( permissions_filter, isrc, distributors, store_ids, start_date, end_date ) ) if top_countries_aggregate_streams: response_body["top_countries"] = top_countries_aggregate_streams schema = TopCountriesStreamsSchema() return oto_response.Response(schema_dump(schema, response_body)) @tracer.wrap(name="get_top_countries_downloads") def get_top_countries_downloads( request_context, isrc, distributors, store_ids=[], start_date=None, end_date=None ): """Return top countries by downloads for ISRC, given account type and ID. Args: request_context (RequestContext): RequestContext class isrc (str): ISRC of track to fetch downloads for distributors (list): List of distributors names store_ids (list): List of store ids to filter by start_date (datetime.date): Start date end_date (datetime.date): End date Returns: oto.response.Response with top countries payload """ # an empty response, but with sources response_body = { "isrc": isrc, "top_countries": [], "sources": add_outage_error_to_stores( store_availability.get_download_sources() ), } permissions_filter = permissions.get_permissions_filter(request_context) if not (start_date and end_date): start_date, end_date = data_availability.get_date_range( data_availability.HIGHWATERMARK_DATE, days=28 ) top_countries = top_countries_model.get_top_countries_downloads( permissions_filter, isrc, distributors, store_ids, start_date, end_date ) if top_countries: response_body["top_countries"] = top_countries schema = TopCountriesDownloadsSchema() return oto_response.Response(schema_dump(schema, response_body))