"""Logic Tier for jobs.""" from collections import defaultdict from datetime import datetime from podcast.logic import email from podcast.logic import url from podcast.logic import user as user_logic from podcast.models import ad_action as ad_action_model from podcast.models import episode as episode_model from podcast.models import network as network_model from podcast.models import ows_analytics from podcast.models import podcast as podcast_model def episode_gone_live(): """Send emails for episodes that have gone live within an hour.""" episodes = episode_model.episodes_gone_live_within_hour() podcast_ids = [episode['podcast_id'] for episode in episodes] podcasts = podcast_model.get_podcasts_by_ids(podcast_ids, True)['items'] for podcast in podcasts: podcasts_episodes = [episode for episode in episodes if episode['podcast_id'] == podcast.id] for user_obj in podcast.favorited_users: user = user_obj.to_dict() for episode in podcasts_episodes: email.send_episode_live(episode, podcast.to_dict(), user) def episode_going_live_tomorrow(): """Send emails for episodes that have gone live tomorrow.""" episodes = episode_model.episodes_going_live_tomorrow() podcast_ids = [episode['podcast_id'] for episode in episodes] podcasts = podcast_model.get_podcasts_by_ids(podcast_ids, True)['items'] for podcast in podcasts: podcasts_episodes = [episode for episode in episodes if episode['podcast_id'] == podcast.id] for user_obj in podcast.favorited_users: user = user_obj.to_dict() for episode in podcasts_episodes: email.send_episode_live_tomorrow(episode, podcast.to_dict(), user) def ad_past_due(): """Send emails when ads are overdue.""" ads = ad_action_model.due_in(0) for ad in ads: email.send_ad_past_due(ad) def ad_due_tomorrow(): """Send emails when ads are due tomorrow.""" ads = ad_action_model.due_in(24) for ad in ads: email.send_ad_due_tomorrow(ad) def episode_spike_detection(date): """Send emails when a spike is detected.""" spikes = ows_analytics.get_episode_spikes(date)['items'] spikes_by_podcast = defaultdict(list) for spike in spikes: spike['episode'] = episode_model.get_episode_by_id(spike['episode_id']) spike['podcast'] = podcast_model.get_podcast_by_id(spike['episode']['podcast_id']) spike['network'] = network_model.get_networks_by_ids([spike['podcast']['network_id']])['items'][0] spikes_by_podcast[spike['podcast']['id']].append(spike) for spikes in spikes_by_podcast.values(): users = user_logic.users_with_access_to_podcast(spikes[0]['podcast']) + \ user_logic.all_access_users() for user in users: episode_spikes = [] for episode_spike in spikes: episode_spikes.append({ 'episode_title': episode_spike['episode']['title'], 'episode_published_date': episode_spike['episode']['published_date'].strftime('%d %B %Y'), 'num_listens_for_date': episode_spike['num_listens_for_date'], 'date': datetime.strptime(episode_spike['date'], '%m/%d/%Y').strftime('%d %B %Y'), 'percent_diff': episode_spike['percent_diff'], 'avg_listens_over_period': episode_spike['avg_listens_over_period'] }) data = { 'todays_date': datetime.utcnow().strftime('%d %B %Y'), 'period': spikes[0]['period'], 'podcast_title': spikes[0]['podcast']['title'], 'network_title': spikes[0]['network']['name'], 'episode_spikes': episode_spikes, } if len(data['episode_spikes']) > 1: data['insights_url'] = url.podcast_insights_via_email(spikes[0]['podcast']['id']) else: data['insights_url'] = url.episode_insights_via_email( spikes[0]['podcast']['id'], spikes[0]['episode']['id']) email.send_podcast_spike_email(user, data)