from enum import Enum from typing import List from campaigns.schemas import ( CampaignPlatformGroupResponseModel, CampaignPlatformResponseModel ) OTHER_CATEGORY_NAME = 'Other Top Platforms' class CampaignPlatformGroupType(Enum): GROUP = 'group' CATEGORY = 'category' class CampaignPlatformMapper: @staticmethod def build_platform_group(platforms: List, group_name, group_id): return CampaignPlatformGroupResponseModel( id=group_id, name=group_name, type=CampaignPlatformGroupType.GROUP.value, items=[ CampaignPlatformResponseModel( id=plat.id, name=plat.name, labelId=plat.label_id, defaultPlacements=[p.id for p in plat.placements], ) for plat in platforms if plat.platform_group_id == group_id ] ) def build(self, platforms_with_group_name: List) -> List[CampaignPlatformGroupResponseModel]: groups = [] result = [] single_platforms = [] for platform in platforms_with_group_name: if platform.platform_group_id and platform.platform_group_id not in groups: result.append(self.build_platform_group( platforms_with_group_name, platform.platform_group.name, platform.platform_group_id ) ) groups.append(platform.platform_group.id) elif platform.platform_group_id is None: single_platforms.append( CampaignPlatformResponseModel( id=platform.id, name=platform.name, labelId=platform.label_id, defaultPlacements=[p.id for p in platform.placements], ) ) result.append( CampaignPlatformGroupResponseModel( id=max([g.id for g in result]) + 1 if result else 0, type=CampaignPlatformGroupType.CATEGORY.value, name=OTHER_CATEGORY_NAME, items=single_platforms ) ) return result