"""Demographics logic layer.""" from oto import response as oto_response from sound_recordings.constants.demographics import ( EIGHTEEN_TWENTYTWO, FEMALE, FORTYFIVE_FIFTYNINE, MALE, OVER_SIXTY, THIRTYFIVE_FORTYFOUR, TWENTYEIGHT_THIRTYFOUR, TWENTYTHREE_TWENTYSEVEN, UNDER_18, UNKNOWN_AGE, UNKNOWN_GENDER, ) from sound_recordings.logic import data_availability, permissions from sound_recordings.logic.parallel import parallel from sound_recordings.logic.store_outages import add_outage_error_to_stores from sound_recordings.models import demographics as demographics_model from sound_recordings.schemas.demographics import DemographicsSchema from sound_recordings.utils import store_availability from sound_recordings.validation.schema import schema_dump def _format_demographics(demographics): return { "age": { UNDER_18: demographics[UNDER_18], EIGHTEEN_TWENTYTWO: demographics[EIGHTEEN_TWENTYTWO], TWENTYTHREE_TWENTYSEVEN: demographics[TWENTYTHREE_TWENTYSEVEN], TWENTYEIGHT_THIRTYFOUR: demographics[TWENTYEIGHT_THIRTYFOUR], THIRTYFIVE_FORTYFOUR: demographics[THIRTYFIVE_FORTYFOUR], FORTYFIVE_FIFTYNINE: demographics[FORTYFIVE_FIFTYNINE], OVER_SIXTY: demographics[OVER_SIXTY], UNKNOWN_AGE: demographics[UNKNOWN_AGE], }, "gender": { MALE: demographics[MALE], FEMALE: demographics[FEMALE], UNKNOWN_GENDER: demographics[UNKNOWN_GENDER], }, } def get_demographics( context, isrc, countries, store_ids, start_date, end_date, distributors ): """Return demographics for ISRC for given stores and countries. Args: request_context (RequestContext): RequestContext class isrc (str): ISRC of track to fetch downloads for countries (str[]): List of country codes to filter by store_ids (list): List of store ids to filter by start_date (datetime.date): Start date end_date (datetime.date): End date distributors (list): List of distributors names Returns: list of demographics by isrc and then store """ if not (start_date and end_date): start_date, end_date = data_availability.get_date_range( data_availability.HIGHWATERMARK_DATE, days=28 ) permissions_filter = permissions.get_permissions_filter(context) requests = { "demographics": { "func": demographics_model.get_demographics, "args": ( permissions_filter, isrc, countries, store_ids, start_date, end_date, distributors, ), }, "sources": { "func": add_outage_error_to_stores, "args": (store_availability.get_demographic_sources(),), }, } result = parallel(requests) demographics = result.message["demographics"] sources = result.message["sources"] # an empty response, except for sources response_body = { "isrc": isrc, "demographics": {"age": {}, "gender": {}}, "sources": sources, } schema = DemographicsSchema() if demographics: response_body["demographics"] = _format_demographics(demographics) return oto_response.Response(schema_dump(schema, response_body))