import datetime from datetime import date from typing import Optional from flask import g from artists.repositories.artist_team_repository import ArtistTeamRepository from models import Project, ArtistTeam from projects.repositories.projects_list_repository import ProjectsListRepository from services.artist_team_automation.exceptions import ProjectAlreadyClaimedError from services.artists_moments_fetcher import ArtistsMomentsFetcher from projects.repositories.projects_repository import ProjectsRepository from projects.services.projects_service import ProjectsService from services.users_repository import UsersRepository from projects.repositories.unclaimed_projects_repository import UnclaimedProjectsRepository from projects.services.project_history_service import ProjectHistoryService class ArtistTeamAutomationService: users_repository = UsersRepository() project_history_service = ProjectHistoryService() unclaimed_project_repository = UnclaimedProjectsRepository() project_list_repository = ProjectsListRepository() projects_repository = ProjectsRepository() project_service = ProjectsService() artist_team_repository = ArtistTeamRepository() def autoclaim_projects_for_artist_team(self, artist_team: ArtistTeam): artist = artist_team.artist projects = self.unclaimed_project_repository.get_all_unclaimed_project( artist_external_id=artist.external_id, use_pagination=False ) for project in projects: self.__mark_project_as_claimed(project, g.user_id) if projects: moments_fetcher = ArtistsMomentsFetcher() moments_fetcher.fetch_moments_for_artist(artist) def __mark_project_as_claimed(self, project: Project, user_id: Optional[int] = None): if project.is_claimed: raise ProjectAlreadyClaimedError() if project.is_confidential: # We don't automatically claim confidential projects return project.refresh_is_claimed() if project.is_claimed is False: # this project wasn't claimed because it doesn't have any editors return project_state = self.project_history_service.get_project_state(project) project.name = project.prs_title or project.ccp_title start_date = ( project.earliest_campaign_start_date or project.earliest_purchase_order_date or project.initial_start_date or date.today() ) end_date = ( project.latest_campaign_end_date or project.latest_purchase_order_date or start_date + datetime.timedelta(days=1) ) project.end_date = end_date if project.initial_start_date is None: project.initial_start_date = start_date project.touch_last_edit() self.project_service.set_project_default_media_plan(project=project) self.projects_repository.add_or_update_project(project) self.projects_repository.refresh_project(project) self.project_history_service.log_project_claimed(project, project_state, user_id) def autoclaim_all_available_projects(self): projects = self.unclaimed_project_repository.get_all_unclaimed_project(use_pagination=False) for project in projects: self.__mark_project_as_claimed(project) def unclaim_projects_that_have_no_project_team(self, artist_team: ArtistTeam): self.projects_repository.set_projects_without_project_teams_unclaimed( artist_team.artist_id, artist_team.label_id )