"""Model for history table in label_copy_export database.""" from datetime import datetime from oto import response import sentry_sdk from sqlalchemy import and_ from sqlalchemy import Column from sqlalchemy import DateTime from sqlalchemy import Enum from sqlalchemy import Integer from sqlalchemy import String from sqlalchemy.exc import SQLAlchemyError from sqlalchemy.ext.hybrid import hybrid_property from project_manager.connector import mysql from project_manager.constant import lce_history class Job(mysql.BaseModel): """Class representing the label copy export history's job.""" __tablename__ = 'label_copy_export_history' job_id = Column('id', Integer, primary_key=True, autoincrement=True) user_id = Column(String(127)) project_id = Column(Integer, nullable=False) status = Column( Enum(*lce_history.GENERATION_STATUSES), default=lce_history.REQUESTED) _last_change_date = Column( 'last_change_date', DateTime, nullable=False, default=datetime.utcnow, onupdate=datetime.utcnow) @hybrid_property def last_change_date(self): """Getter for private attribute _last_change_date.""" return self._last_change_date def to_dict(self): """Return object as dict. Returns: dict: Dictionary representation of object """ job_dict = { 'job_id': self.job_id, 'user_id': self.user_id, 'project_id': self.project_id, 'status': self.status, 'last_change_date': self.last_change_date } return job_dict def create_job( *, user_id, project_id, status=lce_history.REQUESTED): """Put new job item into label_copy_export_history table. Args: user_id (str): user id. project_id (int): id of exported project. status (str): job status, optional parameter. Returns: response.Response: Response with status and id of created job. """ try: job = Job( user_id=user_id, project_id=project_id, status=status) with mysql.lce_session_scope() as session: session.add(job) return response.Response(job.job_id) except SQLAlchemyError as e: sentry_sdk.capture_exception() return response.create_fatal_response(str(e)) def get_job_by_project_id(project_id): """Get job data from db by upc. Args: project_id (int): project_id of job in db. Returns: response.Response: Data of job or error in Response object. """ try: with mysql.lce_session_scope() as session: filters = and_( Job.project_id == project_id, Job.status == lce_history.COMPLETED) job = session.query(Job).filter( filters).order_by(Job._last_change_date.desc()).first() if not job: return response.create_not_found_response( message="Metadata for project {id} doesn\'t exist.".format( id=project_id)) return response.Response(job) except SQLAlchemyError as ex: sentry_sdk.capture_exception() return response.create_fatal_response(str(ex))