""" AssetStatus Model. This AssetStatus model uses sqlalchemy. It's used to store information about asset processing statuses """ from datetime import datetime from oto import response from sqlalchemy import Column from sqlalchemy import DateTime from sqlalchemy import ForeignKey from sqlalchemy import Integer from sqlalchemy import String from sqlalchemy import Text from sqlalchemy.exc import SQLAlchemyError from assets.connectors import mysql from assets.connectors import sentry from assets.constants import error class AssetStatus(mysql.AuModel): """Table definition for asset_status table.""" __tablename__ = 'asset_status' asset_status_id = Column( 'id', Integer, primary_key=True, autoincrement=True) asset_upload_id = Column(Integer, ForeignKey('asset_upload.id')) status = Column(String(50), nullable=False) description = Column(String(512), nullable=True) message = Column(Text, nullable=True) status_time = Column(DateTime, nullable=False) def as_dict(self): """Return object as dict. Returns: dict: Dictionary representation of object """ asset_status_dict = { 'id': self.asset_status_id, 'asset_upload_id': self.asset_upload_id, 'status': self.status, 'description': self.description, 'message': self.message, 'status_time': self.status_time } return asset_status_dict def create_asset_status( asset_upload_id, status, description=None, message=None): """Create new asset status item in the table. Args: asset_upload_id (int): Asset upload id. status (str): Asset status. description (str): Asset status description. message (str): Asset status message description. Returns: response.Response: Created status info or error. """ try: asset_status = AssetStatus( asset_upload_id=asset_upload_id, status=status, description=description, message=message, status_time=datetime.utcnow()) with mysql.au_db_session() as session: session.add(asset_status) asset_status_dict = asset_status.as_dict() return response.Response(asset_status_dict) except SQLAlchemyError as e: if sentry.sentry_client: sentry.sentry_client.captureException() return response.create_fatal_response(e.args) def get_last_asset_status(asset_upload_id): """Return last asset status by asset upload id. Args: asset_upload_id (int): Asset upload id. Returns: response.Response: Last asset status info or error """ filters = [ (AssetStatus.asset_upload_id == asset_upload_id)] try: with mysql.au_db_session() as session: asset_status = session.query(AssetStatus).filter( *filters).order_by(AssetStatus.status_time.desc()).first() if not asset_status: return response.create_not_found_response( message=error.ERROR_ASSET_STATUS_NOT_FOUND) asset_status_dict = asset_status.as_dict() return response.Response(asset_status_dict) except SQLAlchemyError as e: if sentry.sentry_client: sentry.sentry_client.captureException() return response.create_fatal_response(e.args) def get_asset_statuses(asset_upload_id): """Return the list of asset statuses by asset upload id. Args: asset_upload_id (int): Asset upload id. Returns: response.Response: Response with the list of asset statuses or error. """ filters = [ (AssetStatus.asset_upload_id == asset_upload_id)] try: with mysql.au_db_session() as session: asset_statuses = session.query(AssetStatus).filter( *filters).order_by(AssetStatus.status_time.desc()).all() if not asset_statuses: return response.create_not_found_response( message=error.ERROR_ASSET_STATUS_NOT_FOUND) asset_statuses_list = [item.as_dict() for item in asset_statuses] return response.Response({'items': asset_statuses_list}) except SQLAlchemyError as e: if sentry.sentry_client: sentry.sentry_client.captureException() return response.create_fatal_response(e.args)