from typing import List, Optional from models.projects import ProjectTargetItem, ProjectEntityType from projects.exceptions import ProjectError from models import Playlist, Artist from projects.schemas import ProjectTargetSchema, ProjectArtistSchema from external_api.playlists.schemas import PlaylistImageModel from playlists.schemas import PlaylistResponseSchema from shared.schemas import ArtistImageSchema class ProjectTargetItemsMapper: def map_project_target_items_from_model(self, items: List[ProjectTargetItem]) -> ProjectTargetSchema: root_item = items[0].entity if type(root_item) is Playlist: items = [self.__playlist_schema_from_model(item_details.entity) for item_details in items] return ProjectTargetSchema(root_item.type, items) if type(root_item) is Artist: items = [self.__artist_schema_from_model(item_details) for item_details in items] return ProjectTargetSchema(root_item.type, items) raise ProjectError("Project has no attached entities or they are unknown") def __playlist_schema_from_model(self, playlist: Playlist) -> PlaylistResponseSchema: id = playlist.external_id images = [PlaylistImageModel(image.url, image.width, image.height) for image in playlist.images] return PlaylistResponseSchema(id, playlist.name, playlist.owner_name, playlist.provider, images) def __artist_schema_from_model(self, item_details: ProjectTargetItem) -> ProjectArtistSchema: artist = item_details.entity id = artist.external_id if artist.external_id else str(artist.id) image_model = None if artist.images: # check if I can preload them image = artist.images[0] image_model = ArtistImageSchema(image.url, image.width, image.height) type = self.__entity_type_from(item_details.entity_type) is_prs = item_details.is_locked() return ProjectArtistSchema( id=id, type=type, name=artist.name, image=image_model, isPRS=is_prs, isUnknown=artist.is_unknown ) def __entity_type_from(self, type: int) -> Optional[str]: if type == ProjectEntityType.PRIMARY_ARTIST.value: return "Primary" if type == ProjectEntityType.FEATURED_ARTIST.value: return "Featured" return None