"""Model representing a release artist.""" from flask import g from oto import response import sqlalchemy from product_digital.connectors import mysql class ReleaseArtist(mysql.BaseModel): """Release artist model.""" __tablename__ = 'release_artist' release_artist_id = sqlalchemy.Column( sqlalchemy.Integer, primary_key=True, autoincrement=True, nullable=False) release_id = sqlalchemy.Column(sqlalchemy.Integer, nullable=False) upc = sqlalchemy.Column(sqlalchemy.BigInteger, nullable=False) role = sqlalchemy.Column(sqlalchemy.String, nullable=False) artist_name = sqlalchemy.Column(sqlalchemy.String, nullable=False) url = sqlalchemy.Column(sqlalchemy.String, nullable=True) artist_info_id = sqlalchemy.Column(sqlalchemy.Integer, nullable=True) def to_dict(self): """Return dictionary of release artist data. Returns: dict: release artist metadata. """ return { 'release_artist_id': self.release_artist_id, 'release_id': self.release_id, 'upc': self.upc, 'role': self.role, 'artist_name': self.artist_name, 'artist_info_id': self.artist_info_id } @mysql.wrap_db_errors def get_release_artists_by_release_id(release_id): """Get all of the release artists for the given release. Args: release_id (int): id of the release. Returns: response.Response: response containing payload of release artists. """ release_artist_dicts = [] with mysql.db_session() as session: release_artists = session.query(ReleaseArtist).filter_by( release_id=release_id) for release_artist in release_artists: release_artist_dicts.append(release_artist.to_dict()) return response.Response(message=release_artist_dicts) @mysql.wrap_db_errors def save_for_release_id(release_id, upc, release_artists): """Overwrite all of the release artists for the given release. Args: release_id (int): id of the release. upc (int): upc of the release. release_artists (list): list of dicts containing release artist data. Returns: response.Response: response object containing status and payload. """ release_artist_dicts = [] with mysql.db_session() as session: for release_artist_data in release_artists: release_artist_id = release_artist_data.get('release_artist_id') if release_artist_id: release_artist = session.query(ReleaseArtist)\ .get(release_artist_id) for key, value in release_artist_data.items(): setattr(release_artist, key, value) else: release_artist_data_copy = release_artist_data.copy() release_artist_data_copy['release_id'] = release_id release_artist_data_copy['upc'] = upc release_artist = ReleaseArtist(**release_artist_data_copy) session.add(release_artist) session.flush() release_artist_dicts.append(release_artist.to_dict()) if ( not hasattr(g, 'is_non_destructive_update') or not g.is_non_destructive_update ): # Delete all release artists that are not in the new list. release_artist_ids = [ release_artist['release_artist_id'] for release_artist in release_artist_dicts ] (session.query(ReleaseArtist) .filter_by(release_id=release_id) .filter( ~ReleaseArtist.release_artist_id.in_(release_artist_ids)) .delete(synchronize_session=False)) return response.Response(message=release_artist_dicts) def delete(product_id, session): """Delete release_artist entry for the product.""" session.query(ReleaseArtist) \ .filter(ReleaseArtist.release_id == product_id) \ .delete()