"""Basic mapping model connecting a release to a subgenre. Although the schema allows for a many-to-many relationship between releases and subgenres, in practice we only allow a release to have one subgenre. """ from oto import response import sqlalchemy from product_digital.connectors import mysql class ReleaseSubgenre(mysql.BaseModel): """Release-subgenre mapping model.""" __tablename__ = 'release_subgenre' release_subgenre_id = sqlalchemy.Column( 'id', sqlalchemy.Integer, primary_key=True, autoincrement=True, nullable=False) upc = sqlalchemy.Column(sqlalchemy.String, nullable=False) subgenre_id = sqlalchemy.Column(sqlalchemy.Integer, nullable=False) release_id = sqlalchemy.Column(sqlalchemy.Integer, nullable=False) def to_dict(self): """Create a dictionary of this object's properties.""" return { 'release_subgenre_id': self.release_subgenre_id, 'release_id': self.release_id, 'subgenre_id': self.subgenre_id} @mysql.wrap_db_errors def get_release_subgenre_by_release_id(release_id): """Get the release-genre mapping for the given release_id.""" with mysql.db_session() as session: release_subgenre = session.query(ReleaseSubgenre).filter_by( release_id=release_id).first() if not release_subgenre: return response.create_not_found_response( 'release subgenre mapping not found') payload = release_subgenre.to_dict() return response.Response(message=payload) @mysql.wrap_db_errors def save_release_subgenre(release_subgenre_data): """Save a release-subgenre mapping. Args: release_subgenre_data (dict): data mapping a release to a subgenre. Returns: response.Response: wrapper indicating the outcome of the save. """ with mysql.db_session() as session: # @todo: validate that all required values are given release_subgenre = session.query(ReleaseSubgenre).filter_by( release_id=release_subgenre_data.get('release_id')).first() if not release_subgenre: release_subgenre = ReleaseSubgenre() release_subgenre.release_id = release_subgenre_data.get('release_id') release_subgenre.subgenre_id = release_subgenre_data.get('subgenre_id') release_subgenre.upc = release_subgenre_data.get('upc') session.add(release_subgenre) # flush the session so a new record gets the primary key value session.flush() payload = release_subgenre.to_dict() return response.Response(message=payload) @mysql.wrap_db_errors @mysql.db_session_wrap def delete_release_subgenre(release_id, session): """Delete a release-subgenre entry. Args: release_id (int): The release id of the entry to be deleted. Returns: response.Response: wrapper indicating the outcome of the deletion. """ existing_release_subgenre = session.query(ReleaseSubgenre).filter_by( release_id=release_id).first() if existing_release_subgenre: session.delete(existing_release_subgenre) session.flush() return response.Response()