"""CRUD operations around phf_mechadmin_track table in art_relations db.""" from sqlalchemy import BigInteger from sqlalchemy import Column from sqlalchemy import Enum from sqlalchemy import Integer from sqlalchemy import SmallInteger from sqlalchemy import String from sqlalchemy import TIMESTAMP from sqlalchemy import text from sqlalchemy.orm import validates import lambda_exceptions import mysql import common_config as config class PhfMechadminTrack(mysql.BaseModel): """Class represents the phf_mechadmin_track table.""" __tablename__ = 'phf_mechadmin_track' id_ = Column('id', Integer, primary_key=True, autoincrement=True) track_id = Column('track_id', String(200), nullable=False, unique=True) original_track_id = Column(BigInteger, nullable=False) company = Column(Enum('phonofile', 'finetunes'), nullable=False) track_name = Column( String(255), nullable=False, server_default=text("''")) upc = Column(String(20), nullable=False, server_default=text("''")) isrc = Column(String(16), nullable=False, server_default=text("''")) track_artist = Column( String(100), nullable=False, server_default=text("''")) length_minute = Column(SmallInteger, nullable=False) length_seconds = Column(SmallInteger, nullable=False) label = Column(String(255), nullable=False, server_default=text("''")) public_domain = Column(String(255)) writer = Column(String(255), nullable=False, server_default=text("''")) publisher = Column( String(255), nullable=False, server_default=text("''")) release_date = Column( String(255), nullable=False, server_default=text("''")) release_date_calculated = Column( String(255), nullable=False, server_default=text("''")) release_title = Column( String(255), nullable=False, server_default=text("''")) release_artist = Column( String(255), nullable=False, server_default=text("''")) original_publishers = Column(String(255)) last_modified = Column( TIMESTAMP, nullable=False, server_default=text('CURRENT_TIMESTAMP')) @validates('track_id') def validate_track_id(self, key, track_id): """Validate new created track_id starts with 'PHF' prefix. Args: self (PhfMechadminTrack): track object that is being validated. key (str): name of field that is being validated. track_id (str): id of a track, should start with 'PHF' prefix. Returns: track_id (str): validated track_id that will be added to the model. """ if 'PHF' not in track_id: error = 'Value of track_id should starts with "PHF" prefix' raise lambda_exceptions.ModelValidationFailed(key, error) return track_id def to_dict(self): """Convert PhfMechadminTrack data to dict.""" data = { 'id': self.id_, 'track_id': self.track_id, 'original_track_id': self.original_track_id, 'company': self.company, 'track_name': self.track_name, 'upc': self.upc, 'isrc': self.isrc, 'track_artist': self.track_artist, 'length_minute': self.length_minute, 'length_seconds': self.length_seconds, 'label': self.label, 'public_domain': self.public_domain, 'writer': self.writer, 'publisher': self.publisher, 'release_date': self.release_date, 'release_date_calculated': self.release_date_calculated, 'release_title': self.release_title, 'release_artist': self.release_artist, 'original_publishers': self.original_publishers, 'last_modified': self.last_modified } return data @mysql.wrap_db_errors def insert_phf_mechadmin_track(track_data): """Put new item into phf_mechadmin_track table. Args: track_data (dict): dict with required track fields from sales data doc. Returns: PhfMechadminTrack.id_ (int): Created track id. """ try: track = PhfMechadminTrack(**track_data) except lambda_exceptions.ModelValidationFailed as ex: config.logger.exception(str(ex)) raise ex with mysql.ar_db_session() as session: session.add(track) return track.id_ @mysql.wrap_db_errors def get_phf_mechadmin_track_by_track_id(track_id): """Get the phf_mechadmin_track records for the given track_id. Args: track_id (str): track id to get the phf_mechadmin_track records for. Returns: phf_mechadmin_track (list): list of objects matching the given track_id. """ with mysql.ar_db_session() as session: phf_mechadmin_track_records = ( session.query(PhfMechadminTrack).filter_by( track_id=track_id)).all() return [record.to_dict() for record in phf_mechadmin_track_records] @mysql.wrap_db_errors def bulk_insert_phf_mechadmin_track(tracks_data): """Put list of items into phf_mechadmin_track table. Args: tracks_data (list): list of dicts with required track fields. """ try: tracks = [PhfMechadminTrack(**track) for track in tracks_data] except lambda_exceptions.ModelValidationFailed as ex: config.logger.exception(str(ex)) raise ex with mysql.ar_db_session() as session: session.bulk_save_objects(tracks) @mysql.wrap_db_errors def get_tracks_by_list_of_track_ids(track_ids): """Get the phf_mechadmin_track records for the given track ids. Args: track_ids (set): track ids to get the phf_mechadmin_track records for. Returns: phf_mechadmin_track (list): list of objects matching the given track ids. """ with mysql.ar_db_session() as session: phf_mechadmin_track_records = ( session.query(PhfMechadminTrack).filter( PhfMechadminTrack.track_id.in_(track_ids))).all() return [record.to_dict() for record in phf_mechadmin_track_records]