"""Model representing a catalog transfer record for a release.""" from sqlalchemy import Column from sqlalchemy import Enum from sqlalchemy import Integer from sqlalchemy import String from oto import response from product_digital.connectors import mysql class CatalogTransfer(mysql.BaseModel): """Contains catalog transfer data for a release. Used to track the originating distributor when a release is transferred into the catalog, and whether it retained the same ISRC/UPC. """ __tablename__ = 'catalog_transfers' release_id = Column(Integer, primary_key=True, nullable=False) original_distributor = Column(String(255), nullable=False) same_isrc_upc = Column(Enum('Y', 'N'), nullable=False) def to_dict(self): """Convert the catalog transfer data to dict.""" return { 'release_id': self.release_id, 'original_distributor': self.original_distributor, 'same_isrc_upc': self.same_isrc_upc, } def update(self, **kwargs): """Update object with kwargs data.""" for key, value in kwargs.items(): setattr(self, key, value) @mysql.wrap_db_errors @mysql.db_session_wrap def get_catalog_transfer(release_id, session): """Get the catalog transfer record for a release.""" catalog_transfer = session.query(CatalogTransfer).filter_by( release_id=release_id).first() if not catalog_transfer: return None return response.Response(message=catalog_transfer.to_dict()) @mysql.wrap_db_errors @mysql.db_session_wrap def upsert_catalog_transfer(catalog_transfer_data, session): """Create or update the catalog transfer record for a release.""" catalog_transfer = session.query(CatalogTransfer).filter_by( release_id=catalog_transfer_data['release_id']).first() if not catalog_transfer: catalog_transfer = CatalogTransfer() session.add(catalog_transfer) catalog_transfer.update(**catalog_transfer_data) session.commit() return response.Response(message=catalog_transfer.to_dict()) @mysql.wrap_db_errors @mysql.db_session_wrap def delete_catalog_transfer(release_id, session): """Delete a catalog transfer record. Deleting a release_id that has no record is treated as an idempotent no-op and returns 203 rather than an error, since the desired end state (no record) is already true. """ deleted = session.query(CatalogTransfer).filter_by( release_id=release_id).delete() session.commit() if not deleted: return response.Response(message={}, status=203) return response.Response(message={})