"""Soft delete draft episodes from db and megaphone. Run this in dev with command PYTHONPATH=. env/bin/python3.8 dev/bulk_review_episodes.py -- -env dev """ import argparse import csv import logging import os import sys import requests from podcast.models import episode as episode_model from podcast.utils import api_utils from podcast.utils.exc import OwsError log = logging.getLogger('main') log.setLevel(logging.DEBUG) fmt = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') sh = logging.StreamHandler(sys.stdout) sh.setFormatter(fmt) log.addHandler(sh) users = { 'dev': '366', 'qa': '1298', 'prod': '88' } request_headers = None def bulk_review_episodes(filename, env): """Bulk review episodes.""" if not filename: raise Exception('File with name: bulkReviewEpisodes.csv not found.') log.info(f'Reading file: {filename}.\n') with open(filename) as csv_file: ep_count = 0 error_count = 0 errored_episode_ids = [] no_audio_episodes = [] reader = csv.DictReader(csv_file) for row in reader: try: podcast_id = int(row['Podcast ID']) episode_id = int(row['Episode ID']) log.info(f'\nRunning for episode with id: {episode_id}') episode = episode_model.get_episode_by_id(episode_id) if episode['podcast_id'] != podcast_id: raise OwsError('Episode {} is not linked with podcast {}'.format(episode_id, podcast_id)) episode_dict = {'is_reviewed': True} log.info( f'\nChecking if episode {episode_id} has audio...') oat_response = requests.get( f'https://{env}-ows-asset-transcoder.theorchard.io/asset-by-id-and-type', params = { 'object_id': episode_id, 'object_type': 'episode', 'asset_type': 'WAV' }, headers= request_headers ) if oat_response.status_code == 200: episode_dict['draft'] = 0 if not episode['published_date']: episode_dict['published_date'] = '2050-12-25' else: no_audio_episodes.append(episode_id) log.info( f'\nAudio fetching failed: {oat_response.json()}.') updated_episode = episode_model.update_episode(episode_id, episode_dict) log.info( f'\nUpdated Episode: {updated_episode}.\n') except Exception as e: errored_episode_ids.append({episode_id: e.message}) error_count += 1 log.info( f'Got an exception for episode_id: {episode_id}\n' f'Exception trace: {e}\n' ) ep_count += 1 print(f'\nErrored errored count: {error_count} and episodes_ids: {errored_episode_ids} \n') print(f'\nEpisodes with no audio {no_audio_episodes} \n') def main(): """Extract shell arguments and start soft deleting draft episodes.""" global request_headers argparser = argparse.ArgumentParser(prog='Soft Delete Episodes') argparser.add_argument('-env', required=True, help='env', default='qa') args = argparser.parse_args() env = args.env filename = 'bulkReviewEpisodes.csv' or os.environ.get('FILENAME') request_headers = { 'Grass-Account-Type': 'vendor', 'Grass-Account-Id': '1', 'Correlation-Id': '12', 'Orchard-Identity-UUID': 'podcast-admin', 'Content-Type': 'application/json' } def get_user_id(): """Mock get user id return value.""" return users[env] api_utils.get_user_id = get_user_id log.info(f'Running bulk review episodes script for {env} Environment.\n') bulk_review_episodes(filename, env) if __name__ == '__main__': main()