"""Script to Bulk upload Pricing data for Physical Releases."""
import json
import os
import requests
import sys
from boto3.session import Session
import dotenv
import logging
import physical_pricing_bulk_utils as ppbu
from raven.handlers.logging import SentryHandler
from raven.conf import setup_logging
handler = SentryHandler(os.environ.get('SENTRY_DSN'))
setup_logging(handler)
logger = logging.getLogger(__name__)
logger.setLevel(logging.ERROR)
# TODO: Use SES for email
dotenv.load_dotenv('../.env')
ENVIRONMENT = os.environ.get('Environment', 'dev')
if ENVIRONMENT == 'prod':
OWS_PRICING_URL = 'https://ows-pricing.theorchard.io'
else:
OWS_PRICING_URL = 'https://qa-ows-pricing.theorchard.io'
S3_BUCKET = os.environ.get('S3_BUCKET', 'dev-cucumbers')
INGEST_FOLDER = os.environ.get('INGEST_FOLDER', 'bulk-physical-pricing-ingest')
ARCHIVE_FOLDER = os.environ.get(
'ARCHIVE_FOLDER', 'bulk-physical-pricing-ingest-archive')
def getS3connection():
access_key = os.environ.get('AWS_ACCESS_KEY_ID')
secret_key = os.environ.get('AWS_SECRET_ACCESS_KEY')
sessionconn = Session(aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
session_res = sessionconn.resource("s3")
return session_res
def get_pricing_data(batch_file):
return json.loads(batch_file.get()['Body'].read().decode('utf-8'))
def rename_ingest_batch(bucket, session_res, old_name, new_name):
bucket_name = bucket.name
copy_source = {'Bucket': bucket_name, 'Key': old_name}
session_res.meta.client.copy(copy_source, bucket_name, new_name)
session_res.Object(bucket_name, old_name).delete()
def archive_batch(bucket, session_res, batch_filename):
new_name = batch_filename.replace(INGEST_FOLDER, ARCHIVE_FOLDER)
print("Archiving ", batch_filename,' to ',new_name)
rename_ingest_batch(bucket, session_res, batch_filename, new_name)
def get_oldest_batch_to_ingest(bucket):
allfiles = bucket.objects.filter(Prefix='{}/ready'.format(INGEST_FOLDER))
allreadyfiles = [f for f in allfiles]
if not allreadyfiles:
return 0
return min(allreadyfiles, key=lambda k: k.last_modified)
def ingest_pricing_row(pricing_row):
product_id = pricing_row['release_id']
orchard_pricing_tier_name = pricing_row['orchard_price_tier']['name']
print('About to ingest pricing_row for product ID {0}'.format(product_id))
print('Orchard Pricing Tier: {0}'.format(orchard_pricing_tier_name))
print('Going to look for tier with name: ' + orchard_pricing_tier_name)
pricing_tier = pricing_row['orchard_price_tier']['id']
delete_url = '{0}/legacy/product/{1}/unmigrate'.format(OWS_PRICING_URL, product_id)
print('Going to delete pricing information using URL: ' + delete_url)
try:
delete_response = requests.delete(delete_url)
except Exception as e:
logger.error('ows-pricing to delete pricing failed: {}'.format(str(e)))
print("Error calling ows-pricing to delete pricing for product ID: {0}, error: {1}".format(product_id, str(e)))
print('response from delete pricing: ')
print(delete_response)
set_tier_url = '{0}/product/{1}/pricing-family/4/orchard_pricing_tier'.format(OWS_PRICING_URL, product_id)
print('Going to set orchard tier on URL: ' + set_tier_url)
data = {'orchard_pricing_tier_id': pricing_tier}
print('about to send data:')
print(data)
try:
set_tier_response = requests.put(set_tier_url, json = data)
except Exception as e:
logger.error('ows-pricing to set orchard pricing tier failed: {}'.format(str(e)))
print("Error calling ows-pricing to set orchard pricing tier error:", str(e))
print('response from set tier: ')
print(set_tier_response)
sort_order = 1
overrides_to_create = []
for store_id, store_pricing in pricing_row['store_pricing'].items():
print('going to set up an override for store_id {0} to have price_code: {1}'.format(store_id, store_pricing))
override = {
'sort_order': sort_order,
'price_code': store_pricing,
'product_id': product_id,
'applies_worldwide': True,
'activated': True,
'stores': [store_id],
'pricing_family_id': 4
}
sort_order = sort_order + 1
overrides_to_create.append(override)
if overrides_to_create:
create_override_url = '{0}/product/{1}/override/bulk'.format(OWS_PRICING_URL, product_id)
data = {
'items': overrides_to_create
}
try:
print("Making call to do bulk override as above URL:",create_override_url)
create_override_response = requests.post(create_override_url, json = data)
except Exception as e:
logger.error('ows-pricing to post pricing overrides failed: {}'.format(str(e)))
print("Error calling ows-pricing to create product pricing override, error:", str(e))
print('response from create override: ')
print(create_override_response)
return create_override_response.status_code
if __name__ == '__main__':
mail_body = """
Hi There!
The physical pricing batch upload has completed for the release id's listed below.
"""
try:
session_res = getS3connection()
bucket = session_res.Bucket(S3_BUCKET)
ingest_batch = get_oldest_batch_to_ingest(bucket)
if not ingest_batch:
print('No batches to ingest')
sys.exit()
print('Getting oldest batch to ingest.')
ingest_ready_filename = ingest_batch.key
print(ingest_ready_filename)
print('About to read pricing data from {0}'.format(ingest_ready_filename))
ingest_batch_data = get_pricing_data(ingest_batch)
number_of_releases = len(ingest_batch_data['override_data'])
print('Fetched {0} rows of pricing data to migrate'.format(number_of_releases))
filename_running = ingest_ready_filename.replace('ready','running')
print("Renaming ",ingest_ready_filename," to ",filename_running)
rename_ingest_batch(bucket, session_res, ingest_ready_filename, filename_running)
successfull_overrides = []
failed_overrides = []
for ingest_batch_row in ingest_batch_data['override_data']:
override_status = ingest_pricing_row(ingest_batch_row)
if override_status == 200:
successfull_overrides.append(ingest_batch_row['release_id'])
else:
failed_overrides.append(ingest_batch_row['release_id'])
print('Done ingesting {0} pricing rows'.format(number_of_releases))
filename_complete = filename_running.replace('running','complete')
print("Renaming ",filename_running," to ",filename_complete)
rename_ingest_batch(bucket, session_res, filename_running , filename_complete)
archive_batch(bucket, session_res, filename_complete)
subject = "Physical Pricing Batch Upload Completed"
if successfull_overrides:
mail_body += 'Successfully ingested :