"""
Job CRUD operations
"""
from sqlalchemy import update
from bulkperformancerights import config
from bulkperformancerights.models.job_status import JobStatus
from bulkperformancerights.connectors import mysql
from bulkperformancerights.logic import user
from bulkperformancerights.templates import email
HTML_EMAIL_CONTENT = '''
Hey there,
Your Master Rights information has been updated successfully!
Please check the
Master Rights Management page in the Workstation for any errors
in the spreadsheet you last uploaded, and repeat the process as needed
for new and corrected tracks. Don't forget to check out our
Product Guide
in the Help Center for a detailed step-by-step and
pro tips.
Your Team at The Orchard
'''
TEXT_EMAIL_BODY = '''
Hey there,
Your Master Rights information has been updated successfully!
Please check the Master Rights Management {manage_rights_url}
page in the Workstation for any errors in the spreadsheet you last
uploaded, and repeat the process as needed for new and corrected
tracks. Don't forget to check out our Product Guide {user_guide_url}
in the Help Center for a detailed step-by-step and
pro tips.
Your Team at The Orchard
'''
EMAIL_SUBJECT = 'Your rights data has been updated successfully'
user_guide_url = '{}/helpcenter/guides#masterrightsmgmt'.format(
config.WORKSTATION_BASE_URL)
manage_rights_url = '{}/managerights'.format(config.WORKSTATION_BASE_URL)
def get_job_status(user_type, user_id, job_id):
"""Get job status
Args:
user_type (str): 'vendor' or 'subaccount', see logic/user.py
user_id (int): indentifier of user for which to get job status
job_id (int): optional, job id to get
Return:
(dict): either a single JobStatus or multiple
"""
session = mysql.session()
if job_id is None:
job_statuses = session.query(JobStatus).filter_by(user_type=user_type,
user_id=user_id)
status_response = [decorate_job(stat.dict()) for stat in job_statuses]
else:
# using first() because there should only ever be one
job_status = session.query(JobStatus).filter_by(user_type=user_type,
user_id=user_id,
job_id=job_id).first()
assert job_status is not None, 'no job found with that id'
status_response = decorate_job(job_status.dict())
session.close()
return status_response
def make_job(input_file_path, user_type, user_id):
"""Make a job
Initial state of a job is 'uploaded'
Args:
input_file_path (str): path to input file
user_type (str): type of user
user_id (int): id of user
Return:
(JobStatus): JobStatus model
"""
job = JobStatus(
input_file_path=input_file_path, job_status='uploaded',
user_type=user_type, user_id=user_id)
Session = mysql.session()
Session.add(job)
Session.commit()
Session.close()
return job
def update_job(job, **kwargs):
"""Update a job
Args:
job (JobStatus): Job to be updated
**kwargs: Possible allowed values are any fields available on JobStatus
Return:
(ResultProxy): result of the update operation
"""
Session = mysql.session()
update_stmt = update(JobStatus).where(JobStatus.job_id == job.job_id).\
values(**kwargs)
result = Session.execute(update_stmt)
Session.commit()
Session.close()
return result
def send_complete_mail(ses_conn, user_id, user_email, user_type='vendor'):
"""Email user that job is complete
Args:
ses_conn (boto.ses.Ses): SES connection
user_id (int):
user_email (str): email address to where an email is sent
"""
user_info = user.user_info(user_id, user_type)
vendor_logo_path = user_info.get('vendor_logo_path')
vendor_contact_email = user_info.get('vendor_contact_email')
return ses_conn.send_email(
source=config.EMAIL_FROM_ADDRESS,
subject=EMAIL_SUBJECT,
body=TEXT_EMAIL_BODY.format(
user_guide_url=user_guide_url,
manage_rights_url=manage_rights_url),
html_body=email.generate_body(
vendor_logo_path,
vendor_contact_email,
'Bulk Performance Rights',
HTML_EMAIL_CONTENT.format(
user_guide_url=user_guide_url,
manage_rights_url=manage_rights_url)),
to_addresses=[user_email])
def decorate_job(job):
"""Decorates a job: constructs the location on s3
This is meant for outward facing representations of jobs
Args:
job (JobStatus): job to be decorated
Todo:
OrCharles: fix 'None' being returned from job_status
Return:
(JobStatus): decorated job status object
"""
user_dict = {'type': job.get('user_type'), 'id': job.get('user_id')}
job['input_file_path'] = s3_path_for_user_from_file(
job.get('input_file_path'), user_dict)
if job.get('error_file_path') == 'None':
job['error_file_path'] = None
else:
job['error_file_path'] = s3_path_for_user_from_file(
job.get('error_file_path'), user_dict)
return job
def s3_path_for_user_from_file(filename, user_dict):
"""Concatenate bucket, bucket prefix and file
Args:
filename (string): filename
Return:
string: s3 bucket/key prefixed with user information
"""
user_prefix = user.prefix_for_user(user_dict)
return '{}{}{}{}'.format(
config.bucket_name, config.prefix, user_prefix, filename)