"""Amazon S3 connector.""" import boto3 from botocore.errorfactory import ClientError from oto import response from ddtrace import tracer from salessheets import config from salessheets.connectors.sentry import sentry_capture_exception from salessheets.constants import field_const @tracer.wrap() def upload_file_to_s3(filename, pdf_file_dir=config.PDF_RENDERING_DIR): """Connect to S3, get bucket from config and upload file there. Args: filename (str): name of a file that should be uploaded to s3 bucket. pdf_file_dir (str): directory with file that should be uploaded. Returns: (Response): Response with errors if not valid or empty if valid. """ s3 = boto3.client('s3') s3_key_name = 'sales-sheets/{filename}'.format(filename=filename) pdf_file = '{dir}/{filename}'.format( dir=pdf_file_dir, filename=filename) try: bucket = s3.head_bucket( Bucket=config.SALESSHEETS_BUCKET_NAME) except ClientError as ex: if sentry_capture_exception: sentry_capture_exception() return response.create_error_response( code=ex.response['Error']['Code'], message=ex.response['Error']['Message'], status=ex.response['ResponseMetadata']['HTTPStatusCode']) metadata = { field_const.CONTENT_DISPOSITION: field_const.ATTACHMENT} try: s3.upload_file( pdf_file, config.SALESSHEETS_BUCKET_NAME, s3_key_name, ExtraArgs={'Metadata': metadata}) except ClientError as e: if sentry_capture_exception: sentry_capture_exception() return response.create_fatal_response('{msg}: {pdf}'.format( msg=e.strerror, pdf=pdf_file )) return response.Response()