"""Module for asset status logic tier.""" from datetime import datetime import os from asset_transcoder.constants import asset_status as asset_status_const from asset_transcoder.models import asset_status as asset_status_model from asset_transcoder.models import asset_upload as asset_upload_model from asset_transcoder.utils import signed_urls from asset_transcoder.utils.exceptions import OwsError def _convert_timestamp_to_datetime(timestamp): """Convert str timestamp to datetime object. Args: timestamp (str): String timestamp representation Returns: datetime.datetime: converted object """ return datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%S.%fZ') def create_status(filename, status, errors, timestamp, session=None): """Save information about asset status. Called by the handler. Args: filename (object): the unique filename of the asset. status (str): Asset processing status. errors (dict): Errors if present. timestamp (str): Asset status event timestamp. session (sqlalchemy.Session): db connection Returns: dict: Saved status info or error. """ clean_filename, ext = os.path.splitext(filename) asset_upload = asset_upload_model.get_asset_upload(clean_filename) return create_status_with_upload(asset_upload, status, errors, timestamp, session) def create_status_with_upload(asset_upload, status, errors, timestamp, session=None): """Save information about asset status. Args: asset_upload (object): Asset Upload record. status (str): Asset processing status. errors (dict): Errors if present. timestamp (str): Asset status event timestamp. session (sqlalchemy.Session): db connection Returns: dict: Saved status info or error. """ if status not in asset_status_const.PROCESSING_VALID_STATUSES: raise OwsError.bad_request('Status {0} is not valid for processing'.format(status)) created_date = _convert_timestamp_to_datetime(timestamp) return asset_status_model.create_asset_status( asset_upload_id=asset_upload.asset_upload_id, status=status, created_date=created_date, errors=errors, session=session ) def get_status(filename, signed_url_policy, signed_url_duration): """Get status for filename. Args: filename (str): Unique source asset filename. signed_url_policy (str): Constant instructing how to sign urls. signed_url_duration (int): Number of minutes that signed urls are valid for. Returns: dict: Saved status info. """ clean_filename, ext = os.path.splitext(filename) asset_upload = asset_upload_model.get_asset_upload(clean_filename) try: last_status = asset_status_model.get_last_asset_status(asset_upload.asset_upload_id) except OwsError as err: if err.status == 404: return { 'status': asset_status_const.STATUS_NOT_STARTED, 'description': '', 'assets': [] } else: raise if last_status['status'] == 'encoding_completed': assets = [asset_upload.to_dict_with_finals()] assets = signed_urls.sign_urls(assets, signed_url_policy, signed_url_duration) last_status['assets'] = assets[0]['asset_finals'] return last_status