from sqlalchemy.engine import RowProxy from typing import List, Tuple from src.legacy.apollo_api.constants import REGION_ALL_CODE, REGION_ALL_NAME def get_avg_and_top_positions(items: List[RowProxy]) -> Tuple[int, int]: """Get average and top 10 track position in playlists. Args: items: List of playlists data. Returns: Average and top 10 track position. """ positions = [i.position for i in items if i.position] average = round(sum(positions) / (len(positions) or 1)) top_10 = len([i for i in positions if i <= 10]) return average, top_10 def get_playlists_regions( playlist_list: List[RowProxy], region_code: str, include_inactive_markets: bool ) -> Tuple[List[dict], dict]: """Calculate playlists regions mapping. Args: playlist_list: HH/NMF playlist DB data. region_code: Chosen region code. include_inactive_markets: Include all markets regions or only present. Returns: Code to region data mapping. """ if not region_code: region_code = REGION_ALL_CODE regions_mapping = {} region_all_total = 0 region_all_placements = 0 for item in playlist_list: if item.region_code in regions_mapping: regions_item = regions_mapping[item.region_code] else: regions_item = { "name": item.name_override or item.region_name, "code": item.region_code, "total": 0, "placements": 0, "rank": item.rank, } regions_mapping[item.region_code] = regions_item regions_item["total"] += 1 region_all_total += 1 if item.position: regions_item["placements"] += 1 region_all_placements += 1 regions_mapping[REGION_ALL_CODE] = { "name": REGION_ALL_NAME, "code": REGION_ALL_CODE, "total": region_all_total, "placements": region_all_placements, "rank": 0, } region_data = regions_mapping.get(region_code, {}) if not include_inactive_markets: regions_mapping = {k: v for k, v in regions_mapping.items() if v["placements"]} regions_mapping = list(sorted(regions_mapping.values(), key=lambda i: i["rank"])) for i in regions_mapping: del i["rank"] return regions_mapping, region_data