from db import db from sqlalchemy import and_ from models import Polymorphable from models.artists import Artist from models.artist_team import ArtistTeam, ArtistTeamUser from models.project_entity_type import ProjectEntityAddType from models.user import user_label from models.campaign import CampaignTypeGroup from models.projects import ProjectTargetItem, ProjectEntityType from sqlalchemy.orm import selectinload from typing import List, Optional class ArtistRepository: def get_artist_by_external_id(self, external_id: str): return db.session.query(Artist).filter(Artist.external_id == external_id).one() def get_artist_team_by_label(self, artist_id: int, label_id: int) -> Optional[ArtistTeam]: return ( db.session.query(ArtistTeam) .filter(ArtistTeam.label_id == label_id, ArtistTeam.artist_id == artist_id) .one_or_none() ) def create_artist_team(self, artist_id: int, label_id: int): artist_team = ArtistTeam(artist_id=artist_id, label_id=label_id) db.session.add(artist_team) db.session.flush() db.session.refresh(artist_team) return artist_team def get_artist_teams(self, artist_id: int, user_id: int): return ( db.session.query(ArtistTeam) .join(user_label, and_(user_label.c.label_id == ArtistTeam.label_id, user_label.c.user_id == user_id)) .filter(ArtistTeam.artist_id == artist_id) .options(selectinload(ArtistTeam.artist_team_users).joinedload(ArtistTeamUser.user, innerjoin=True)) .all() ) def get_editor_categories(self, artist_team_id: int, user_id: int) -> List[int]: return [ category.id for category in ( db.session.query(CampaignTypeGroup.id) .join(ArtistTeamUser, CampaignTypeGroup.artist_team_users) .filter(ArtistTeamUser.user_id == user_id, ArtistTeamUser.artist_team_id == artist_team_id) .all() ) ] def get_primary_artists_for_project_id(self, project_id: int): return ( db.session.query(Artist) .join( ProjectTargetItem, and_( ProjectTargetItem.project_id == project_id, ProjectTargetItem.is_deleted.is_(False), ProjectTargetItem.entity_type == ProjectEntityType.PRIMARY_ARTIST.value, ), ) .join(Polymorphable, Polymorphable.id == ProjectTargetItem.entity_id) .all() ) def get_locked_primary_artists_for_project_id(self, project_id: int): return ( db.session.query(Artist) .join( ProjectTargetItem, and_( ProjectTargetItem.project_id == project_id, ProjectTargetItem.is_deleted.is_(False), ProjectTargetItem.entity_type == ProjectEntityType.PRIMARY_ARTIST.value, ProjectTargetItem.add_type == ProjectEntityAddType.LOCKED.value, ), ) .join(Polymorphable, Polymorphable.id == ProjectTargetItem.entity_id) .all() ) def get_artist_team_user(self, artist_team_id: int, user_id: int): return ( db.session.query(ArtistTeamUser) .filter(ArtistTeamUser.user_id == user_id, ArtistTeamUser.artist_team_id == artist_team_id) .one_or_none() )